1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.27.1'
17 libudev_version = '1.6.16'
19 # We need the same data in two different formats, ugh!
20 # Also, for hysterical reasons, we use different variable
21 # names, sometimes. Not all variables are included in every
23 conf = configuration_data()
24 conf.set('PROJECT_VERSION', meson.project_version())
26 substs = configuration_data()
27 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PROJECT_VERSION', meson.project_version())
30 # This is to be used instead of meson.source_root(), as the latter will return
31 # the wrong result when systemd is being built as a meson subproject
32 project_source_root = meson.current_source_dir()
33 relative_source_path = run_command('realpath',
34 '--relative-to=@0@'.format(meson.current_build_dir()),
35 project_source_root).stdout().strip()
36 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
38 want_ossfuzz = get_option('oss-fuzz')
39 want_libfuzzer = get_option('llvm-fuzz')
40 want_fuzzbuzz = get_option('fuzzbuzz')
41 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
42 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
45 skip_deps = want_ossfuzz or want_libfuzzer
46 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
48 #####################################################################
50 # Try to install the git pre-commit hook
51 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
52 if git_hook.returncode() == 0
53 message(git_hook.stdout().strip())
56 #####################################################################
58 if get_option('split-usr') == 'auto'
59 split_usr = run_command('test', '-L', '/bin').returncode() != 0
61 split_usr = get_option('split-usr') == 'true'
63 conf.set10('HAVE_SPLIT_USR', split_usr,
64 description : '/usr/bin and /bin directories are separate')
66 if get_option('split-bin') == 'auto'
67 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
69 split_bin = get_option('split-bin') == 'true'
71 conf.set10('HAVE_SPLIT_BIN', split_bin,
72 description : 'bin and sbin directories are separate')
74 rootprefixdir = get_option('rootprefix')
75 # Unusual rootprefixdir values are used by some distros
76 # (see https://github.com/systemd/systemd/pull/7461).
77 rootprefix_default = split_usr ? '/' : '/usr'
78 if rootprefixdir == ''
79 rootprefixdir = rootprefix_default
81 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
83 sysvinit_path = get_option('sysvinit-path')
84 sysvrcnd_path = get_option('sysvrcnd-path')
85 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
86 description : 'SysV init scripts and rcN.d links are supported')
88 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
89 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
90 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
92 # join_paths ignores the preceding arguments if an absolute component is
93 # encountered, so this should canonicalize various paths when they are
94 # absolute or relative.
95 prefixdir = get_option('prefix')
96 if not prefixdir.startswith('/')
97 error('Prefix is not absolute: "@0@"'.format(prefixdir))
99 bindir = join_paths(prefixdir, get_option('bindir'))
100 libdir = join_paths(prefixdir, get_option('libdir'))
101 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
102 includedir = join_paths(prefixdir, get_option('includedir'))
103 datadir = join_paths(prefixdir, get_option('datadir'))
104 localstatedir = join_paths('/', get_option('localstatedir'))
106 rootbindir = join_paths(rootprefixdir, 'bin')
107 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
108 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
110 rootlibdir = get_option('rootlibdir')
112 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
115 # Dirs of external packages
116 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
117 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
118 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
119 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
120 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
121 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
122 rpmmacrosdir = get_option('rpmmacrosdir')
123 if rpmmacrosdir != 'no'
124 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
126 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
129 pkgdatadir = join_paths(datadir, 'systemd')
130 environmentdir = join_paths(prefixdir, 'lib/environment.d')
131 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
132 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
133 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
134 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
135 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
136 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
137 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
138 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
139 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
140 pkgincludedir = join_paths(includedir, 'systemd')
141 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
142 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
143 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
144 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
145 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
146 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
147 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
148 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
149 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
150 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
151 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
152 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
153 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
154 factorydir = join_paths(datadir, 'factory')
155 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
156 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
157 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
158 catalogstatedir = join_paths(systemdstatedir, 'catalog')
159 randomseeddir = join_paths(localstatedir, 'lib/systemd')
160 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
161 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
163 docdir = get_option('docdir')
165 docdir = join_paths(datadir, 'doc/systemd')
168 dbuspolicydir = get_option('dbuspolicydir')
169 if dbuspolicydir == ''
170 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
173 dbussessionservicedir = get_option('dbussessionservicedir')
174 if dbussessionservicedir == ''
175 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
178 dbussystemservicedir = get_option('dbussystemservicedir')
179 if dbussystemservicedir == ''
180 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
183 pamlibdir = get_option('pamlibdir')
185 pamlibdir = join_paths(rootlibdir, 'security')
188 pamconfdir = get_option('pamconfdir')
190 pamconfdir = join_paths(sysconfdir, 'pam.d')
193 memory_accounting_default = get_option('memory-accounting-default')
194 status_unit_format_default = get_option('status-unit-format-default')
196 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
197 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
198 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
199 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
200 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
201 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
203 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
205 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
206 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
207 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
208 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
209 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
210 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
211 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
212 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
213 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
214 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
215 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
216 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
217 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
218 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
219 conf.set_quoted('ROOTPREFIX', rootprefixdir)
220 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
221 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
222 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
223 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
224 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
225 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
226 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
227 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
228 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
229 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
230 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
231 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
232 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
233 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
234 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
235 conf.set_quoted('LIBDIR', libdir)
236 conf.set_quoted('ROOTLIBDIR', rootlibdir)
237 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
238 conf.set_quoted('BOOTLIBDIR', bootlibdir)
239 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
240 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
241 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
242 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
243 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
244 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
245 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
246 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
247 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
248 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
249 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
250 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
252 substs.set('prefix', prefixdir)
253 substs.set('rootprefix', rootprefixdir)
254 substs.set('rootprefix_noslash', rootprefixdir_noslash)
255 substs.set('exec_prefix', prefixdir)
256 substs.set('libdir', libdir)
257 substs.set('rootlibdir', rootlibdir)
258 substs.set('includedir', includedir)
259 substs.set('sysconfdir', sysconfdir)
260 substs.set('bindir', bindir)
261 substs.set('rootbindir', rootbindir)
262 substs.set('rootlibexecdir', rootlibexecdir)
263 substs.set('systemunitdir', systemunitdir)
264 substs.set('userunitdir', userunitdir)
265 substs.set('systempresetdir', systempresetdir)
266 substs.set('userpresetdir', userpresetdir)
267 substs.set('udevhwdbdir', udevhwdbdir)
268 substs.set('udevrulesdir', udevrulesdir)
269 substs.set('udevlibexecdir', udevlibexecdir)
270 substs.set('environmentdir', environmentdir)
271 substs.set('catalogdir', catalogdir)
272 substs.set('tmpfilesdir', tmpfilesdir)
273 substs.set('sysusersdir', sysusersdir)
274 substs.set('sysctldir', sysctldir)
275 substs.set('binfmtdir', binfmtdir)
276 substs.set('modulesloaddir', modulesloaddir)
277 substs.set('modprobedir', modprobedir)
278 substs.set('systemgeneratordir', systemgeneratordir)
279 substs.set('usergeneratordir', usergeneratordir)
280 substs.set('systemenvgeneratordir', systemenvgeneratordir)
281 substs.set('userenvgeneratordir', userenvgeneratordir)
282 substs.set('systemshutdowndir', systemshutdowndir)
283 substs.set('systemsleepdir', systemsleepdir)
284 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
285 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
286 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
287 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
288 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
289 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
290 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
291 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
292 substs.set('BUILD_ROOT', meson.current_build_dir())
294 #####################################################################
296 cc = meson.get_compiler('c')
297 pkgconfig = import('pkgconfig')
298 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
299 meson_build_sh = find_program('tools/meson-build.sh')
301 want_tests = get_option('tests')
302 slow_tests = want_tests != 'false' and get_option('slow-tests')
303 install_tests = get_option('install-tests')
305 if add_languages('cpp', required : fuzzer_build)
306 # Used only for tests
307 cxx = meson.get_compiler('cpp')
308 cxx_cmd = ' '.join(cxx.cmd_array())
314 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
315 if fuzzing_engine.found()
316 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
317 elif cc.has_argument('-fsanitize=fuzzer-no-link')
318 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
320 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
323 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
325 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
328 # Those generate many false positives, and we do not want to change the code to
330 basic_disabled_warnings = [
331 '-Wno-unused-parameter',
332 '-Wno-missing-field-initializers',
333 '-Wno-unused-result',
334 '-Wno-format-signedness',
336 if get_option('b_ndebug') == 'true'
337 # With asserts disabled with get a bunch of warnings about variables which
338 # are used only in the asserts. This is not useful at all, so let's just silence
340 basic_disabled_warnings += [
341 '-Wno-unused-variable',
342 '-Wno-unused-but-set-variable',
346 possible_cc_flags = [
349 '-Wmissing-include-dirs',
350 '-Wold-style-definition',
354 '-Wsuggest-attribute=noreturn',
355 '-Werror=missing-prototypes',
356 '-Werror=implicit-function-declaration',
357 '-Werror=missing-declarations',
358 '-Werror=return-type',
359 '-Werror=incompatible-pointer-types',
361 '-Wstrict-prototypes',
363 '-Wmissing-noreturn',
364 '-Wimplicit-fallthrough=5',
367 '-Wstrict-aliasing=2',
370 '-Werror=shift-count-overflow',
371 '-Werror=shift-overflow=2',
375 # negative arguments are correctly detected starting with meson 0.46.
376 '-Wno-error=#warnings', # clang
377 '-Wno-string-plus-int', # clang
379 # work-around for gcc 7.1 turning this on on its own.
380 '-Wno-error=nonnull',
382 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
383 # optimizations enabled, producing essentially false positives.
384 '-Wno-maybe-uninitialized',
388 '-fdiagnostics-show-option',
389 '-fno-strict-aliasing',
390 '-fvisibility=hidden',
392 '-fstack-protector-strong',
393 '--param=ssp-buffer-size=4',
396 # --as-needed and --no-undefined are provided by meson by default,
397 # run mesonconf to see what is enabled
398 possible_link_flags = [
404 if cc.get_id() == 'clang'
405 possible_cc_flags += [
406 '-Wno-typedef-redefinition',
407 '-Wno-gnu-variable-sized-type-not-at-end',
411 if get_option('buildtype') != 'debug'
412 possible_cc_flags += [
413 '-ffunction-sections',
417 possible_link_flags += '-Wl,--gc-sections'
420 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
421 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
422 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
426 #include <inttypes.h>
427 typedef uint64_t usec_t;
428 usec_t now(clockid_t clock);
433 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
434 add_project_arguments('-Werror=shadow', language : 'c')
438 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
441 cpp = ' '.join(cc.cmd_array()) + ' -E'
443 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
445 #####################################################################
446 # compilation result tests
448 conf.set('_GNU_SOURCE', true)
449 conf.set('__SANE_USERSPACE_TYPES__', true)
450 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
452 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
453 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
454 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
455 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
456 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
457 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
458 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
462 #include <sys/stat.h>
465 foreach decl : ['char16_t',
470 # We get -1 if the size cannot be determined
471 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
473 if decl == 'struct statx'
475 want_linux_stat_h = false
477 have = cc.sizeof(decl,
478 prefix : decl_headers + '#include <linux/stat.h>',
479 args : '-D_GNU_SOURCE') > 0
480 want_linux_stat_h = have
484 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
487 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
489 foreach ident : ['secure_getenv', '__secure_getenv']
490 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
494 ['memfd_create', '''#include <sys/mman.h>'''],
495 ['gettid', '''#include <sys/types.h>
496 #include <unistd.h>'''],
497 ['pivot_root', '''#include <stdlib.h>
498 #include <unistd.h>'''], # no known header declares pivot_root
499 ['name_to_handle_at', '''#include <sys/types.h>
500 #include <sys/stat.h>
501 #include <fcntl.h>'''],
502 ['setns', '''#include <sched.h>'''],
503 ['renameat2', '''#include <stdio.h>
504 #include <fcntl.h>'''],
505 ['kcmp', '''#include <linux/kcmp.h>'''],
506 ['keyctl', '''#include <sys/types.h>
507 #include <keyutils.h>'''],
508 ['copy_file_range', '''#include <sys/syscall.h>
509 #include <unistd.h>'''],
510 ['bpf', '''#include <sys/syscall.h>
511 #include <unistd.h>'''],
512 ['statx', '''#include <sys/types.h>
513 #include <sys/stat.h>
514 #include <unistd.h>'''],
515 ['explicit_bzero' , '''#include <string.h>'''],
516 ['reallocarray', '''#include <malloc.h>'''],
517 ['set_mempolicy', '''#include <stdlib.h>
518 #include <unistd.h>'''],
519 ['get_mempolicy', '''#include <stdlib.h>
520 #include <unistd.h>'''],
521 ['pidfd_send_signal', '''#include <stdlib.h>
524 #include <sys/wait.h>'''],
525 ['pidfd_open', '''#include <stdlib.h>
528 #include <sys/wait.h>'''],
529 ['rt_sigqueueinfo', '''#include <stdlib.h>
532 #include <sys/wait.h>'''],
535 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
536 conf.set10('HAVE_' + ident[0].to_upper(), have)
539 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
540 conf.set10('USE_SYS_RANDOM_H', true)
541 conf.set10('HAVE_GETRANDOM', true)
543 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
544 conf.set10('USE_SYS_RANDOM_H', false)
545 conf.set10('HAVE_GETRANDOM', have)
548 #####################################################################
550 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
552 get_option('version-tag'),
553 meson.project_version()]
556 input : 'src/version/version.h.in',
557 output : 'version.h',
560 versiondep = declare_dependency(sources: version_h)
562 sed = find_program('sed')
563 awk = find_program('awk')
564 m4 = find_program('m4')
565 stat = find_program('stat')
566 git = find_program('git', required : false)
567 env = find_program('env')
568 perl = find_program('perl', required : false)
570 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
571 mkdir_p = 'mkdir -p $DESTDIR/@0@'
572 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
573 splash_bmp = files('test/splash.bmp')
575 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
576 # /usr/sbin, /sbin, and fall back to the default from middle column.
577 progs = [['quotaon', '/usr/sbin/quotaon' ],
578 ['quotacheck', '/usr/sbin/quotacheck' ],
579 ['kmod', '/usr/bin/kmod' ],
580 ['kexec', '/usr/sbin/kexec' ],
581 ['sulogin', '/usr/sbin/sulogin' ],
582 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
583 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
584 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
585 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
586 ['nologin', '/usr/sbin/nologin', ],
589 path = get_option(prog[0] + '-path')
591 message('Using @1@ for @0@'.format(prog[0], path))
593 exe = find_program(prog[0],
594 '/usr/sbin/' + prog[0],
597 path = exe.found() ? exe.path() : prog[1]
599 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
600 conf.set_quoted(name, path)
601 substs.set(name, path)
604 conf.set_quoted('TELINIT', get_option('telinit-path'))
606 if run_command('ln', '--relative', '--help').returncode() != 0
607 error('ln does not support --relative (added in coreutils 8.16)')
610 ############################################################
612 gperf = find_program('gperf')
614 gperf_test_format = '''
616 const char * in_word_set(const char *, @0@);
619 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
620 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
621 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
622 if cc.compiles(gperf_test)
623 gperf_len_type = 'size_t'
625 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
626 if cc.compiles(gperf_test)
627 gperf_len_type = 'unsigned'
629 error('unable to determine gperf len type')
632 message('gperf len type is @0@'.format(gperf_len_type))
633 conf.set('GPERF_LEN_TYPE', gperf_len_type,
634 description : 'The type of gperf "len" parameter')
636 ############################################################
638 if not cc.has_header('sys/capability.h')
639 error('POSIX caps headers not found')
641 foreach header : ['crypt.h',
643 'linux/vm_sockets.h',
645 'valgrind/memcheck.h',
646 'valgrind/valgrind.h',
649 conf.set10('HAVE_' + header.underscorify().to_upper(),
650 cc.has_header(header))
653 ############################################################
655 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
656 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
657 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
659 default_hierarchy = get_option('default-hierarchy')
660 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
661 description : 'default cgroup hierarchy as string')
662 if default_hierarchy == 'legacy'
663 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
664 elif default_hierarchy == 'hybrid'
665 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
667 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
670 default_net_naming_scheme = get_option('default-net-naming-scheme')
671 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
673 time_epoch = get_option('time-epoch')
676 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
678 conf.set('TIME_EPOCH', time_epoch)
680 system_uid_max = get_option('system-uid-max')
681 if system_uid_max == -1
682 system_uid_max = run_command(
684 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
685 '/etc/login.defs').stdout().strip()
686 if system_uid_max == ''
689 system_uid_max = system_uid_max.to_int()
692 conf.set('SYSTEM_UID_MAX', system_uid_max)
693 substs.set('systemuidmax', system_uid_max)
695 system_gid_max = get_option('system-gid-max')
696 if system_gid_max == -1
697 system_gid_max = run_command(
699 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
700 '/etc/login.defs').stdout().strip()
701 if system_gid_max == ''
704 system_gid_max = system_gid_max.to_int()
707 conf.set('SYSTEM_GID_MAX', system_gid_max)
708 substs.set('systemgidmax', system_gid_max)
710 dynamic_uid_min = get_option('dynamic-uid-min')
711 dynamic_uid_max = get_option('dynamic-uid-max')
712 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
713 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
714 substs.set('dynamicuidmin', dynamic_uid_min)
715 substs.set('dynamicuidmax', dynamic_uid_max)
717 container_uid_base_min = get_option('container-uid-base-min')
718 container_uid_base_max = get_option('container-uid-base-max')
719 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
720 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
721 substs.set('containeruidbasemin', container_uid_base_min)
722 substs.set('containeruidbasemax', container_uid_base_max)
724 nobody_user = get_option('nobody-user')
725 nobody_group = get_option('nobody-group')
727 if not meson.is_cross_build()
728 getent_result = run_command('getent', 'passwd', '65534')
729 if getent_result.returncode() == 0
730 name = getent_result.stdout().split(':')[0]
731 if name != nobody_user
733 '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) +
734 'Your build will result in an user table setup that is incompatible with the local system.')
737 id_result = run_command('id', '-u', nobody_user)
738 if id_result.returncode() == 0
739 id = id_result.stdout().to_int()
742 '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) +
743 'Your build will result in an user table setup that is incompatible with the local system.')
747 getent_result = run_command('getent', 'group', '65534')
748 if getent_result.returncode() == 0
749 name = getent_result.stdout().split(':')[0]
750 if name != nobody_group
752 '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) +
753 'Your build will result in an group table setup that is incompatible with the local system.')
756 id_result = run_command('id', '-g', nobody_group)
757 if id_result.returncode() == 0
758 id = id_result.stdout().to_int()
761 '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) +
762 'Your build will result in an group table setup that is incompatible with the local system.')
766 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
768 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
769 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
772 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
773 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
774 substs.set('NOBODY_USER_NAME', nobody_user)
775 substs.set('NOBODY_GROUP_NAME', nobody_group)
777 tty_gid = get_option('tty-gid')
778 conf.set('TTY_GID', tty_gid)
779 substs.set('TTY_GID', tty_gid)
781 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
782 users_gid = get_option('users-gid')
783 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
785 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
786 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
788 dev_kvm_mode = get_option('dev-kvm-mode')
789 substs.set('DEV_KVM_MODE', dev_kvm_mode)
790 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
791 group_render_mode = get_option('group-render-mode')
792 substs.set('GROUP_RENDER_MODE', group_render_mode)
793 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
795 kill_user_processes = get_option('default-kill-user-processes')
796 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
797 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
798 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
800 dns_servers = get_option('dns-servers')
801 conf.set_quoted('DNS_SERVERS', dns_servers)
802 substs.set('DNS_SERVERS', dns_servers)
804 ntp_servers = get_option('ntp-servers')
805 conf.set_quoted('NTP_SERVERS', ntp_servers)
806 substs.set('NTP_SERVERS', ntp_servers)
808 default_locale = get_option('default-locale')
809 if default_locale == ''
810 if not meson.is_cross_build()
811 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
812 default_locale = run_command(choose_default_locale_sh).stdout().strip()
814 default_locale = 'C.UTF-8'
817 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
819 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
821 service_watchdog = get_option('service-watchdog')
822 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
823 substs.set('SERVICE_WATCHDOG', watchdog_value)
825 substs.set('SUSHELL', get_option('debug-shell'))
826 substs.set('DEBUGTTY', get_option('debug-tty'))
827 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
829 enable_debug_hashmap = false
830 enable_debug_mmap_cache = false
831 enable_debug_siphash = false
832 foreach name : get_option('debug-extra')
834 enable_debug_hashmap = true
835 elif name == 'mmap-cache'
836 enable_debug_mmap_cache = true
837 elif name == 'siphash'
838 enable_debug_siphash = true
840 message('unknown debug option "@0@", ignoring'.format(name))
843 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
844 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
845 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
847 conf.set10('VALGRIND', get_option('valgrind'))
848 conf.set10('LOG_TRACE', get_option('log-trace'))
850 default_user_path = get_option('user-path')
851 if default_user_path != ''
852 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
853 default_user_path_display = default_user_path
855 # meson 0.49 fails when ?: is used in .format()
856 default_user_path_display = '(same as system services)'
860 #####################################################################
862 threads = dependency('threads')
863 librt = cc.find_library('rt')
864 libm = cc.find_library('m')
865 libdl = cc.find_library('dl')
866 libcrypt = cc.find_library('crypt')
868 libcap = dependency('libcap', required : false)
869 if not libcap.found()
870 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
871 libcap = cc.find_library('cap')
874 libmount = dependency('mount',
875 version : fuzzer_build ? '>= 0' : '>= 2.30')
877 want_libfdisk = get_option('fdisk')
878 if want_libfdisk != 'false' and not skip_deps
879 libfdisk = dependency('fdisk',
880 required : want_libfdisk == 'true')
881 have = libfdisk.found()
886 conf.set10('HAVE_LIBFDISK', have)
888 want_pwquality = get_option('pwquality')
889 if want_pwquality != 'false' and not skip_deps
890 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
891 have = libpwquality.found()
896 conf.set10('HAVE_PWQUALITY', have)
898 want_seccomp = get_option('seccomp')
899 if want_seccomp != 'false' and not skip_deps
900 libseccomp = dependency('libseccomp',
901 version : '>= 2.3.1',
902 required : want_seccomp == 'true')
903 have = libseccomp.found()
908 conf.set10('HAVE_SECCOMP', have)
910 want_selinux = get_option('selinux')
911 if want_selinux != 'false' and not skip_deps
912 libselinux = dependency('libselinux',
913 version : '>= 2.1.9',
914 required : want_selinux == 'true')
915 have = libselinux.found()
920 conf.set10('HAVE_SELINUX', have)
922 want_apparmor = get_option('apparmor')
923 if want_apparmor != 'false' and not skip_deps
924 libapparmor = dependency('libapparmor',
925 required : want_apparmor == 'true')
926 have = libapparmor.found()
931 conf.set10('HAVE_APPARMOR', have)
933 smack_run_label = get_option('smack-run-label')
934 if smack_run_label != ''
935 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
938 want_polkit = get_option('polkit')
939 install_polkit = false
940 install_polkit_pkla = false
941 if want_polkit != 'false' and not skip_deps
942 install_polkit = true
944 libpolkit = dependency('polkit-gobject-1',
946 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
947 message('Old polkit detected, will install pkla files')
948 install_polkit_pkla = true
951 conf.set10('ENABLE_POLKIT', install_polkit)
953 want_acl = get_option('acl')
954 if want_acl != 'false' and not skip_deps
955 libacl = cc.find_library('acl', required : want_acl == 'true')
956 have = libacl.found()
961 conf.set10('HAVE_ACL', have)
963 want_audit = get_option('audit')
964 if want_audit != 'false' and not skip_deps
965 libaudit = dependency('audit', required : want_audit == 'true')
966 have = libaudit.found()
971 conf.set10('HAVE_AUDIT', have)
973 want_blkid = get_option('blkid')
974 if want_blkid != 'false' and not skip_deps
975 libblkid = dependency('blkid', required : want_blkid == 'true')
976 have = libblkid.found()
981 conf.set10('HAVE_BLKID', have)
983 want_kmod = get_option('kmod')
984 if want_kmod != 'false' and not skip_deps
985 libkmod = dependency('libkmod',
987 required : want_kmod == 'true')
988 have = libkmod.found()
993 conf.set10('HAVE_KMOD', have)
995 want_pam = get_option('pam')
996 if want_pam != 'false' and not skip_deps
997 libpam = cc.find_library('pam', required : want_pam == 'true')
998 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
999 have = libpam.found() and libpam_misc.found()
1005 conf.set10('HAVE_PAM', have)
1007 want_microhttpd = get_option('microhttpd')
1008 if want_microhttpd != 'false' and not skip_deps
1009 libmicrohttpd = dependency('libmicrohttpd',
1010 version : '>= 0.9.33',
1011 required : want_microhttpd == 'true')
1012 have = libmicrohttpd.found()
1017 conf.set10('HAVE_MICROHTTPD', have)
1019 want_libcryptsetup = get_option('libcryptsetup')
1020 if want_libcryptsetup != 'false' and not skip_deps
1021 libcryptsetup = dependency('libcryptsetup',
1022 version : '>= 2.0.1',
1023 required : want_libcryptsetup == 'true')
1024 have = libcryptsetup.found()
1026 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1027 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1032 conf.set10('HAVE_LIBCRYPTSETUP', have)
1034 want_libcurl = get_option('libcurl')
1035 if want_libcurl != 'false' and not skip_deps
1036 libcurl = dependency('libcurl',
1037 version : '>= 7.32.0',
1038 required : want_libcurl == 'true')
1039 have = libcurl.found()
1044 conf.set10('HAVE_LIBCURL', have)
1046 want_libidn = get_option('libidn')
1047 want_libidn2 = get_option('libidn2')
1048 if want_libidn == 'true' and want_libidn2 == 'true'
1049 error('libidn and libidn2 cannot be requested simultaneously')
1052 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1053 libidn = dependency('libidn2',
1054 required : want_libidn2 == 'true')
1055 have = libidn.found()
1060 conf.set10('HAVE_LIBIDN2', have)
1061 if not have and want_libidn != 'false' and not skip_deps
1062 # libidn is used for both libidn and libidn2 objects
1063 libidn = dependency('libidn',
1064 required : want_libidn == 'true')
1065 have = libidn.found()
1069 conf.set10('HAVE_LIBIDN', have)
1071 want_libiptc = get_option('libiptc')
1072 if want_libiptc != 'false' and not skip_deps
1073 libiptc = dependency('libiptc',
1074 required : want_libiptc == 'true')
1075 have = libiptc.found()
1080 conf.set10('HAVE_LIBIPTC', have)
1082 want_qrencode = get_option('qrencode')
1083 if want_qrencode != 'false' and not skip_deps
1084 libqrencode = dependency('libqrencode',
1085 required : want_qrencode == 'true')
1086 have = libqrencode.found()
1091 conf.set10('HAVE_QRENCODE', have)
1093 want_gcrypt = get_option('gcrypt')
1094 if want_gcrypt != 'false' and not skip_deps
1095 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1096 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1097 have = libgcrypt.found() and libgpg_error.found()
1102 # link to neither of the libs if one is not found
1106 conf.set10('HAVE_GCRYPT', have)
1108 want_gnutls = get_option('gnutls')
1109 if want_gnutls != 'false' and not skip_deps
1110 libgnutls = dependency('gnutls',
1111 version : '>= 3.1.4',
1112 required : want_gnutls == 'true')
1113 have = libgnutls.found()
1118 conf.set10('HAVE_GNUTLS', have)
1120 want_openssl = get_option('openssl')
1121 if want_openssl != 'false' and not skip_deps
1122 libopenssl = dependency('openssl',
1123 version : '>= 1.1.0',
1124 required : want_openssl == 'true')
1125 have = libopenssl.found()
1130 conf.set10('HAVE_OPENSSL', have)
1132 want_p11kit = get_option('p11kit')
1133 if want_p11kit != 'false' and not skip_deps
1134 libp11kit = dependency('p11-kit-1',
1135 version : '>= 0.23.3',
1136 required : want_p11kit == 'true')
1137 have = libp11kit.found()
1142 conf.set10('HAVE_P11KIT', have)
1144 want_elfutils = get_option('elfutils')
1145 if want_elfutils != 'false' and not skip_deps
1146 libdw = dependency('libdw',
1147 required : want_elfutils == 'true')
1148 have = libdw.found()
1153 conf.set10('HAVE_ELFUTILS', have)
1155 want_zlib = get_option('zlib')
1156 if want_zlib != 'false' and not skip_deps
1157 libz = dependency('zlib',
1158 required : want_zlib == 'true')
1164 conf.set10('HAVE_ZLIB', have)
1166 want_bzip2 = get_option('bzip2')
1167 if want_bzip2 != 'false' and not skip_deps
1168 libbzip2 = cc.find_library('bz2',
1169 required : want_bzip2 == 'true')
1170 have = libbzip2.found()
1175 conf.set10('HAVE_BZIP2', have)
1177 want_xz = get_option('xz')
1178 if want_xz != 'false' and not skip_deps
1179 libxz = dependency('liblzma',
1180 required : want_xz == 'true')
1181 have = libxz.found()
1186 conf.set10('HAVE_XZ', have)
1188 want_lz4 = get_option('lz4')
1189 if want_lz4 != 'false' and not skip_deps
1190 liblz4 = dependency('liblz4',
1191 version : '>= 1.3.0',
1192 required : want_lz4 == 'true')
1193 have = liblz4.found()
1198 conf.set10('HAVE_LZ4', have)
1200 want_xkbcommon = get_option('xkbcommon')
1201 if want_xkbcommon != 'false' and not skip_deps
1202 libxkbcommon = dependency('xkbcommon',
1203 version : '>= 0.3.0',
1204 required : want_xkbcommon == 'true')
1205 have = libxkbcommon.found()
1210 conf.set10('HAVE_XKBCOMMON', have)
1212 want_pcre2 = get_option('pcre2')
1213 if want_pcre2 != 'false'
1214 libpcre2 = dependency('libpcre2-8',
1215 required : want_pcre2 == 'true')
1216 have = libpcre2.found()
1221 conf.set10('HAVE_PCRE2', have)
1223 want_glib = get_option('glib')
1224 if want_glib != 'false' and not skip_deps
1225 libglib = dependency('glib-2.0',
1226 version : '>= 2.22.0',
1227 required : want_glib == 'true')
1228 libgobject = dependency('gobject-2.0',
1229 version : '>= 2.22.0',
1230 required : want_glib == 'true')
1231 libgio = dependency('gio-2.0',
1232 required : want_glib == 'true')
1233 have = libglib.found() and libgobject.found() and libgio.found()
1240 conf.set10('HAVE_GLIB', have)
1242 want_dbus = get_option('dbus')
1243 if want_dbus != 'false' and not skip_deps
1244 libdbus = dependency('dbus-1',
1245 version : '>= 1.3.2',
1246 required : want_dbus == 'true')
1247 have = libdbus.found()
1252 conf.set10('HAVE_DBUS', have)
1254 default_dnssec = get_option('default-dnssec')
1256 default_dnssec = 'no'
1258 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1259 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1260 default_dnssec = 'no'
1262 conf.set('DEFAULT_DNSSEC_MODE',
1263 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1264 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1266 dns_over_tls = get_option('dns-over-tls')
1267 if dns_over_tls != 'false'
1268 if dns_over_tls == 'openssl'
1271 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1272 if dns_over_tls == 'gnutls' and not have_gnutls
1273 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1276 if dns_over_tls == 'gnutls' or have_gnutls
1277 have_openssl = false
1279 have_openssl = conf.get('HAVE_OPENSSL') == 1
1280 if dns_over_tls != 'auto' and not have_openssl
1281 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1282 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1285 have = have_gnutls or have_openssl
1289 have_openssl = false
1291 conf.set10('ENABLE_DNS_OVER_TLS', have)
1292 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1293 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1295 default_dns_over_tls = get_option('default-dns-over-tls')
1297 default_dns_over_tls = 'no'
1299 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1300 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.')
1301 default_dns_over_tls = 'no'
1303 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1304 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1305 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1307 want_repart = get_option('repart')
1308 if want_repart != 'false'
1309 have = (conf.get('HAVE_OPENSSL') == 1 and
1310 conf.get('HAVE_LIBFDISK') == 1)
1311 if want_repart == 'true' and not have
1312 error('repart support was requested, but dependencies are not available')
1317 conf.set10('ENABLE_REPART', have)
1319 want_importd = get_option('importd')
1320 if want_importd != 'false'
1321 have = (conf.get('HAVE_LIBCURL') == 1 and
1322 conf.get('HAVE_ZLIB') == 1 and
1323 conf.get('HAVE_XZ') == 1 and
1324 conf.get('HAVE_GCRYPT') == 1)
1325 if want_importd == 'true' and not have
1326 error('importd support was requested, but dependencies are not available')
1331 conf.set10('ENABLE_IMPORTD', have)
1333 want_homed = get_option('homed')
1334 if want_homed != 'false'
1335 have = (conf.get('HAVE_OPENSSL') == 1 and
1336 conf.get('HAVE_LIBFDISK') == 1 and
1337 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1338 if want_homed == 'true' and not have
1339 error('homed support was requested, but dependencies are not available')
1344 conf.set10('ENABLE_HOMED', have)
1346 want_remote = get_option('remote')
1347 if want_remote != 'false'
1348 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1349 conf.get('HAVE_LIBCURL') == 1]
1350 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1351 # it's possible to build one without the other. Complain only if
1352 # support was explicitly requested. The auxiliary files like sysusers
1353 # config should be installed when any of the programs are built.
1354 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1355 error('remote support was requested, but dependencies are not available')
1357 have = have_deps[0] or have_deps[1]
1361 conf.set10('ENABLE_REMOTE', have)
1363 foreach term : ['utmp',
1397 have = get_option(term)
1398 name = 'ENABLE_' + term.underscorify().to_upper()
1399 conf.set10(name, have)
1402 foreach tuple : [['nss-mymachines', 'machined'],
1403 ['nss-resolve', 'resolve']]
1404 want = get_option(tuple[0])
1406 have = get_option(tuple[1])
1407 if want == 'true' and not have
1408 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1413 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1414 conf.set10(name, have)
1418 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1419 'ENABLE_NSS_MYMACHINES',
1420 'ENABLE_NSS_RESOLVE',
1421 'ENABLE_NSS_SYSTEMD']
1422 if conf.get(term) == 1
1426 conf.set10('ENABLE_NSS', enable_nss)
1428 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1433 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1435 #####################################################################
1437 if get_option('efi')
1438 efi_arch = host_machine.cpu_family()
1440 if efi_arch == 'x86'
1441 EFI_MACHINE_TYPE_NAME = 'ia32'
1442 gnu_efi_arch = 'ia32'
1443 elif efi_arch == 'x86_64'
1444 EFI_MACHINE_TYPE_NAME = 'x64'
1445 gnu_efi_arch = 'x86_64'
1446 elif efi_arch == 'arm'
1447 EFI_MACHINE_TYPE_NAME = 'arm'
1448 gnu_efi_arch = 'arm'
1449 elif efi_arch == 'aarch64'
1450 EFI_MACHINE_TYPE_NAME = 'aa64'
1451 gnu_efi_arch = 'aarch64'
1453 EFI_MACHINE_TYPE_NAME = ''
1458 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1460 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1464 conf.set10('ENABLE_EFI', have)
1466 #####################################################################
1468 config_h = configure_file(
1469 output : 'config.h',
1470 configuration : conf)
1472 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1474 includes = include_directories('src/basic',
1479 'src/journal-remote',
1483 'src/time-wait-sync',
1489 'src/libsystemd/sd-bus',
1490 'src/libsystemd/sd-device',
1491 'src/libsystemd/sd-event',
1492 'src/libsystemd/sd-hwdb',
1493 'src/libsystemd/sd-id128',
1494 'src/libsystemd/sd-netlink',
1495 'src/libsystemd/sd-network',
1496 'src/libsystemd/sd-resolve',
1497 'src/libsystemd-network',
1500 add_project_arguments('-include', 'config.h', language : 'c')
1502 generate_gperfs = find_program('tools/generate-gperfs.py')
1506 subdir('src/systemd')
1508 subdir('src/libsystemd')
1509 subdir('src/libsystemd-network')
1510 subdir('src/journal')
1513 libjournal_core = static_library(
1515 libjournal_core_sources,
1517 include_directories : includes,
1520 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1521 libsystemd = shared_library(
1524 version : libsystemd_version,
1525 include_directories : includes,
1526 link_args : ['-shared',
1527 '-Wl,--version-script=' + libsystemd_sym_path],
1528 link_with : [libbasic,
1530 link_whole : [libsystemd_static,
1532 dependencies : [threads,
1536 link_depends : libsystemd_sym,
1538 install_dir : rootlibdir)
1540 static_libsystemd = get_option('static-libsystemd')
1541 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1543 install_libsystemd_static = static_library(
1546 journal_client_sources,
1548 basic_gcrypt_sources,
1550 include_directories : includes,
1551 build_by_default : static_libsystemd != 'false',
1552 install : static_libsystemd != 'false',
1553 install_dir : rootlibdir,
1554 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1555 dependencies : [threads,
1564 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1566 #Generate autosuspend rules
1567 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1569 ############################################################
1571 # binaries that have --help and are intended for use by humans,
1572 # usually, but not always, installed in /bin.
1573 public_programs = []
1575 subdir('src/libudev')
1576 subdir('src/shared')
1578 subdir('src/shutdown')
1580 subdir('src/network')
1582 subdir('src/analyze')
1583 subdir('src/journal-remote')
1584 subdir('src/coredump')
1585 subdir('src/pstore')
1586 subdir('src/hostname')
1587 subdir('src/import')
1588 subdir('src/partition')
1589 subdir('src/kernel-install')
1590 subdir('src/locale')
1591 subdir('src/machine')
1592 subdir('src/portable')
1593 subdir('src/userdb')
1595 subdir('src/nspawn')
1596 subdir('src/resolve')
1597 subdir('src/timedate')
1598 subdir('src/timesync')
1599 subdir('src/vconsole')
1600 subdir('src/boot/efi')
1607 ############################################################
1609 # only static linking apart from libdl, to make sure that the
1610 # module is linked to all libraries that it uses.
1611 test_dlopen = executable(
1615 include_directories : includes,
1616 link_with : [libbasic],
1617 dependencies : [libdl],
1618 build_by_default : want_tests != 'false')
1620 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1621 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1622 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1623 ['resolve', 'ENABLE_NSS_RESOLVE']]
1625 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1629 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1630 version_script_arg = join_paths(project_source_root, sym)
1632 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1633 if tuple.length() > 2
1634 sources += tuple[2].split()
1637 nss = shared_library(
1642 include_directories : includes,
1643 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1644 link_args : ['-Wl,-z,nodelete',
1646 '-Wl,--version-script=' + version_script_arg],
1647 link_with : [libsystemd_static,
1650 dependencies : [threads,
1654 install_dir : rootlibdir)
1656 # We cannot use shared_module because it does not support version suffix.
1657 # Unfortunately shared_library insists on creating the symlink…
1658 meson.add_install_script('sh', '-c',
1659 'rm $DESTDIR@0@/libnss_@1@.so'
1660 .format(rootlibdir, module))
1662 if want_tests != 'false'
1663 test('dlopen-nss_' + module,
1665 # path to dlopen must include a slash
1666 args : nss.full_path())
1671 ############################################################
1673 executable('systemd',
1675 include_directories : includes,
1676 link_with : [libcore,
1678 dependencies : [versiondep,
1685 install_rpath : rootlibexecdir,
1687 install_dir : rootlibexecdir)
1689 meson.add_install_script(meson_make_symlink,
1690 join_paths(rootlibexecdir, 'systemd'),
1691 join_paths(rootsbindir, 'init'))
1693 exe = executable('systemd-analyze',
1694 systemd_analyze_sources,
1695 include_directories : includes,
1696 link_with : [libcore,
1698 dependencies : [versiondep,
1705 install_rpath : rootlibexecdir,
1707 public_programs += exe
1709 executable('systemd-journald',
1710 systemd_journald_sources,
1711 include_directories : includes,
1712 link_with : [libjournal_core,
1714 dependencies : [threads,
1718 install_rpath : rootlibexecdir,
1720 install_dir : rootlibexecdir)
1722 exe = executable('systemd-cat',
1723 systemd_cat_sources,
1724 include_directories : includes,
1725 link_with : [libjournal_core,
1727 dependencies : [threads],
1728 install_rpath : rootlibexecdir,
1730 public_programs += exe
1732 exe = executable('journalctl',
1734 include_directories : includes,
1735 link_with : [libshared],
1736 dependencies : [threads,
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootbindir)
1744 public_programs += exe
1746 executable('systemd-getty-generator',
1747 'src/getty-generator/getty-generator.c',
1748 include_directories : includes,
1749 link_with : [libshared],
1750 install_rpath : rootlibexecdir,
1752 install_dir : systemgeneratordir)
1754 executable('systemd-debug-generator',
1755 'src/debug-generator/debug-generator.c',
1756 include_directories : includes,
1757 link_with : [libshared],
1758 install_rpath : rootlibexecdir,
1760 install_dir : systemgeneratordir)
1762 executable('systemd-run-generator',
1763 'src/run-generator/run-generator.c',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 install_rpath : rootlibexecdir,
1768 install_dir : systemgeneratordir)
1770 executable('systemd-fstab-generator',
1771 'src/fstab-generator/fstab-generator.c',
1772 include_directories : includes,
1773 link_with : [libcore_shared,
1775 install_rpath : rootlibexecdir,
1777 install_dir : systemgeneratordir)
1779 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1780 executable('30-systemd-environment-d-generator',
1781 'src/environment-d-generator/environment-d-generator.c',
1782 include_directories : includes,
1783 link_with : [libshared],
1784 install_rpath : rootlibexecdir,
1786 install_dir : userenvgeneratordir)
1788 meson.add_install_script(meson_make_symlink,
1789 join_paths(sysconfdir, 'environment'),
1790 join_paths(environmentdir, '99-environment.conf'))
1793 if conf.get('ENABLE_HIBERNATE') == 1
1794 executable('systemd-hibernate-resume-generator',
1795 'src/hibernate-resume/hibernate-resume-generator.c',
1796 include_directories : includes,
1797 link_with : [libshared],
1798 install_rpath : rootlibexecdir,
1800 install_dir : systemgeneratordir)
1802 executable('systemd-hibernate-resume',
1803 'src/hibernate-resume/hibernate-resume.c',
1804 include_directories : includes,
1805 link_with : [libshared],
1806 install_rpath : rootlibexecdir,
1808 install_dir : rootlibexecdir)
1811 if conf.get('HAVE_BLKID') == 1
1812 executable('systemd-gpt-auto-generator',
1813 'src/gpt-auto-generator/gpt-auto-generator.c',
1814 'src/shared/blkid-util.h',
1815 include_directories : includes,
1816 link_with : [libshared],
1817 dependencies : libblkid,
1818 install_rpath : rootlibexecdir,
1820 install_dir : systemgeneratordir)
1822 exe = executable('systemd-dissect',
1823 'src/dissect/dissect.c',
1824 include_directories : includes,
1825 link_with : [libshared],
1826 install_rpath : rootlibexecdir,
1828 install_dir : rootlibexecdir)
1829 public_programs += exe
1832 if conf.get('ENABLE_RESOLVE') == 1
1833 executable('systemd-resolved',
1834 systemd_resolved_sources,
1835 include_directories : includes,
1836 link_with : [libshared,
1838 libsystemd_resolve_core],
1839 dependencies : systemd_resolved_dependencies,
1840 install_rpath : rootlibexecdir,
1842 install_dir : rootlibexecdir)
1844 exe = executable('resolvectl',
1846 include_directories : includes,
1847 link_with : [libshared,
1849 libsystemd_resolve_core],
1850 dependencies : [threads,
1854 install_rpath : rootlibexecdir,
1856 public_programs += exe
1858 meson.add_install_script(meson_make_symlink,
1859 join_paths(bindir, 'resolvectl'),
1860 join_paths(rootsbindir, 'resolvconf'))
1862 meson.add_install_script(meson_make_symlink,
1863 join_paths(bindir, 'resolvectl'),
1864 join_paths(bindir, 'systemd-resolve'))
1867 if conf.get('ENABLE_LOGIND') == 1
1868 executable('systemd-logind',
1869 systemd_logind_sources,
1870 include_directories : includes,
1871 link_with : [liblogind_core,
1873 dependencies : [threads,
1875 install_rpath : rootlibexecdir,
1877 install_dir : rootlibexecdir)
1879 exe = executable('loginctl',
1881 include_directories : includes,
1882 link_with : [libshared],
1883 dependencies : [threads,
1886 install_rpath : rootlibexecdir,
1888 install_dir : rootbindir)
1889 public_programs += exe
1891 exe = executable('systemd-inhibit',
1892 'src/login/inhibit.c',
1893 include_directories : includes,
1894 link_with : [libshared],
1895 install_rpath : rootlibexecdir,
1897 install_dir : rootbindir)
1898 public_programs += exe
1900 if conf.get('HAVE_PAM') == 1
1901 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1902 pam_systemd = shared_library(
1906 include_directories : includes,
1907 link_args : ['-shared',
1908 '-Wl,--version-script=' + version_script_arg],
1909 link_with : [libsystemd_static,
1911 dependencies : [threads,
1914 link_depends : pam_systemd_sym,
1916 install_dir : pamlibdir)
1918 if want_tests != 'false'
1919 test('dlopen-pam_systemd',
1921 # path to dlopen must include a slash
1922 args : pam_systemd.full_path())
1926 executable('systemd-user-runtime-dir',
1927 user_runtime_dir_sources,
1928 include_directories : includes,
1929 link_with : [libshared],
1930 install_rpath : rootlibexecdir,
1932 install_dir : rootlibexecdir)
1935 if conf.get('HAVE_PAM') == 1
1936 executable('systemd-user-sessions',
1937 'src/user-sessions/user-sessions.c',
1938 include_directories : includes,
1939 link_with : [libshared],
1940 install_rpath : rootlibexecdir,
1942 install_dir : rootlibexecdir)
1945 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1946 exe = executable('bootctl',
1947 'src/boot/bootctl.c',
1948 include_directories : includes,
1949 link_with : [libshared],
1950 dependencies : [libblkid],
1951 install_rpath : rootlibexecdir,
1953 public_programs += exe
1955 executable('systemd-bless-boot',
1956 'src/boot/bless-boot.c',
1957 include_directories : includes,
1958 link_with : [libshared],
1959 dependencies : [libblkid],
1960 install_rpath : rootlibexecdir,
1962 install_dir : rootlibexecdir)
1964 executable('systemd-bless-boot-generator',
1965 'src/boot/bless-boot-generator.c',
1966 include_directories : includes,
1967 link_with : [libshared],
1968 install_rpath : rootlibexecdir,
1970 install_dir : systemgeneratordir)
1973 executable('systemd-boot-check-no-failures',
1974 'src/boot/boot-check-no-failures.c',
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [libblkid],
1978 install_rpath : rootlibexecdir,
1980 install_dir : rootlibexecdir)
1982 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1983 include_directories : includes,
1984 link_with : [libshared],
1985 dependencies : [threads],
1986 install_rpath : rootlibexecdir,
1988 public_programs += exe
1991 if get_option('link-systemctl-shared')
1992 systemctl_link_with = [libshared]
1994 systemctl_link_with = [libsystemd_static,
2000 exe = executable('systemctl',
2001 'src/systemctl/systemctl.c',
2002 'src/systemctl/sysv-compat.h',
2003 'src/systemctl/sysv-compat.c',
2004 include_directories : includes,
2005 link_with : systemctl_link_with,
2006 dependencies : [threads,
2011 install_rpath : rootlibexecdir,
2013 install_dir : rootbindir)
2014 public_programs += exe
2016 if conf.get('ENABLE_PORTABLED') == 1
2017 executable('systemd-portabled',
2018 systemd_portabled_sources,
2019 include_directories : includes,
2020 link_with : [libshared],
2021 dependencies : [threads],
2022 install_rpath : rootlibexecdir,
2024 install_dir : rootlibexecdir)
2026 exe = executable('portablectl', 'src/portable/portablectl.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 dependencies : [threads],
2030 install_rpath : rootlibexecdir,
2032 install_dir : rootbindir)
2033 public_programs += exe
2036 if conf.get('ENABLE_USERDB') == 1
2037 executable('systemd-userwork',
2038 systemd_userwork_sources,
2039 include_directories : includes,
2040 link_with : [libshared],
2041 dependencies : [threads],
2042 install_rpath : rootlibexecdir,
2044 install_dir : rootlibexecdir)
2046 executable('systemd-userdbd',
2047 systemd_userdbd_sources,
2048 include_directories : includes,
2049 link_with : [libshared],
2050 dependencies : [threads],
2051 install_rpath : rootlibexecdir,
2053 install_dir : rootlibexecdir)
2055 executable('userdbctl',
2057 include_directories : includes,
2058 link_with : [libshared],
2059 dependencies : [threads],
2060 install_rpath : rootlibexecdir,
2062 install_dir : rootbindir)
2065 if conf.get('ENABLE_HOMED') == 1
2066 executable('systemd-homework',
2067 systemd_homework_sources,
2068 include_directories : includes,
2069 link_with : [libshared],
2070 dependencies : [threads,
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootlibexecdir)
2081 executable('systemd-homed',
2082 systemd_homed_sources,
2083 include_directories : includes,
2084 link_with : [libshared],
2085 dependencies : [threads,
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootlibexecdir)
2093 executable('homectl',
2095 include_directories : includes,
2096 link_with : [libshared],
2097 dependencies : [threads,
2102 install_rpath : rootlibexecdir,
2104 install_dir : rootbindir)
2106 if conf.get('HAVE_PAM') == 1
2107 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2108 pam_systemd = shared_library(
2112 include_directories : includes,
2113 link_args : ['-shared',
2114 '-Wl,--version-script=' + version_script_arg],
2115 link_with : [libsystemd_static,
2117 dependencies : [threads,
2121 link_depends : pam_systemd_home_sym,
2123 install_dir : pamlibdir)
2127 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2128 meson.add_install_script(meson_make_symlink,
2129 join_paths(rootbindir, 'systemctl'),
2130 join_paths(rootsbindir, alias))
2133 if conf.get('ENABLE_BACKLIGHT') == 1
2134 executable('systemd-backlight',
2135 'src/backlight/backlight.c',
2136 include_directories : includes,
2137 link_with : [libshared],
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootlibexecdir)
2143 if conf.get('ENABLE_RFKILL') == 1
2144 executable('systemd-rfkill',
2145 'src/rfkill/rfkill.c',
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootlibexecdir)
2153 executable('systemd-system-update-generator',
2154 'src/system-update-generator/system-update-generator.c',
2155 include_directories : includes,
2156 link_with : [libshared],
2157 install_rpath : rootlibexecdir,
2159 install_dir : systemgeneratordir)
2161 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2162 systemd_cryptsetup_sources = files('''
2163 src/cryptsetup/cryptsetup.c
2164 src/cryptsetup/cryptsetup-pkcs11.h
2167 if conf.get('HAVE_P11KIT') == 1
2168 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2171 executable('systemd-cryptsetup',
2172 systemd_cryptsetup_sources,
2173 include_directories : includes,
2174 link_with : [libshared],
2175 dependencies : [libcryptsetup,
2177 install_rpath : rootlibexecdir,
2179 install_dir : rootlibexecdir)
2181 executable('systemd-cryptsetup-generator',
2182 'src/cryptsetup/cryptsetup-generator.c',
2183 include_directories : includes,
2184 link_with : [libshared],
2185 dependencies : [libcryptsetup],
2186 install_rpath : rootlibexecdir,
2188 install_dir : systemgeneratordir)
2190 executable('systemd-veritysetup',
2191 'src/veritysetup/veritysetup.c',
2192 include_directories : includes,
2193 link_with : [libshared],
2194 dependencies : [libcryptsetup],
2195 install_rpath : rootlibexecdir,
2197 install_dir : rootlibexecdir)
2199 executable('systemd-veritysetup-generator',
2200 'src/veritysetup/veritysetup-generator.c',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 dependencies : [libcryptsetup],
2204 install_rpath : rootlibexecdir,
2206 install_dir : systemgeneratordir)
2209 if conf.get('HAVE_SYSV_COMPAT') == 1
2210 executable('systemd-sysv-generator',
2211 'src/sysv-generator/sysv-generator.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2216 install_dir : systemgeneratordir)
2218 executable('systemd-rc-local-generator',
2219 'src/rc-local-generator/rc-local-generator.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2224 install_dir : systemgeneratordir)
2227 if conf.get('ENABLE_HOSTNAMED') == 1
2228 executable('systemd-hostnamed',
2229 'src/hostname/hostnamed.c',
2230 include_directories : includes,
2231 link_with : [libshared],
2232 install_rpath : rootlibexecdir,
2234 install_dir : rootlibexecdir)
2236 exe = executable('hostnamectl',
2237 'src/hostname/hostnamectl.c',
2238 include_directories : includes,
2239 link_with : [libshared],
2240 install_rpath : rootlibexecdir,
2242 public_programs += exe
2245 if conf.get('ENABLE_LOCALED') == 1
2246 if conf.get('HAVE_XKBCOMMON') == 1
2247 # logind will load libxkbcommon.so dynamically on its own
2253 executable('systemd-localed',
2254 systemd_localed_sources,
2255 include_directories : includes,
2256 link_with : [libshared],
2257 dependencies : deps,
2258 install_rpath : rootlibexecdir,
2260 install_dir : rootlibexecdir)
2262 exe = executable('localectl',
2264 include_directories : includes,
2265 link_with : [libshared],
2266 install_rpath : rootlibexecdir,
2268 public_programs += exe
2271 if conf.get('ENABLE_TIMEDATED') == 1
2272 executable('systemd-timedated',
2273 'src/timedate/timedated.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2278 install_dir : rootlibexecdir)
2281 if conf.get('ENABLE_TIMEDATECTL') == 1
2282 exe = executable('timedatectl',
2283 'src/timedate/timedatectl.c',
2284 include_directories : includes,
2285 install_rpath : rootlibexecdir,
2286 link_with : [libshared],
2287 dependencies : [libm],
2289 public_programs += exe
2292 if conf.get('ENABLE_TIMESYNCD') == 1
2293 executable('systemd-timesyncd',
2294 systemd_timesyncd_sources,
2295 include_directories : includes,
2296 link_with : [libshared],
2297 dependencies : [threads,
2299 install_rpath : rootlibexecdir,
2301 install_dir : rootlibexecdir)
2303 executable('systemd-time-wait-sync',
2304 'src/time-wait-sync/time-wait-sync.c',
2305 include_directories : includes,
2306 link_with : [libshared],
2307 install_rpath : rootlibexecdir,
2309 install_dir : rootlibexecdir)
2312 if conf.get('ENABLE_MACHINED') == 1
2313 executable('systemd-machined',
2314 systemd_machined_sources,
2315 include_directories : includes,
2316 link_with : [libmachine_core,
2318 install_rpath : rootlibexecdir,
2320 install_dir : rootlibexecdir)
2322 exe = executable('machinectl',
2323 'src/machine/machinectl.c',
2324 include_directories : includes,
2325 link_with : [libshared],
2326 dependencies : [threads,
2329 install_rpath : rootlibexecdir,
2331 install_dir : rootbindir)
2332 public_programs += exe
2335 if conf.get('ENABLE_IMPORTD') == 1
2336 executable('systemd-importd',
2337 systemd_importd_sources,
2338 include_directories : includes,
2339 link_with : [libshared],
2340 dependencies : [threads],
2341 install_rpath : rootlibexecdir,
2343 install_dir : rootlibexecdir)
2345 systemd_pull = executable('systemd-pull',
2346 systemd_pull_sources,
2347 include_directories : includes,
2348 link_with : [libshared],
2349 dependencies : [versiondep,
2355 install_rpath : rootlibexecdir,
2357 install_dir : rootlibexecdir)
2359 systemd_import = executable('systemd-import',
2360 systemd_import_sources,
2361 include_directories : includes,
2362 link_with : [libshared],
2363 dependencies : [libcurl,
2367 install_rpath : rootlibexecdir,
2369 install_dir : rootlibexecdir)
2371 systemd_import_fs = executable('systemd-import-fs',
2372 systemd_import_fs_sources,
2373 include_directories : includes,
2374 link_with : [libshared],
2375 install_rpath : rootlibexecdir,
2377 install_dir : rootlibexecdir)
2379 systemd_export = executable('systemd-export',
2380 systemd_export_sources,
2381 include_directories : includes,
2382 link_with : [libshared],
2383 dependencies : [libcurl,
2387 install_rpath : rootlibexecdir,
2389 install_dir : rootlibexecdir)
2391 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2394 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2395 exe = executable('systemd-journal-upload',
2396 systemd_journal_upload_sources,
2397 include_directories : includes,
2398 link_with : [libshared],
2399 dependencies : [versiondep,
2405 install_rpath : rootlibexecdir,
2407 install_dir : rootlibexecdir)
2408 public_programs += exe
2411 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2412 s_j_remote = executable('systemd-journal-remote',
2413 systemd_journal_remote_sources,
2414 include_directories : includes,
2415 link_with : [libshared,
2416 libsystemd_journal_remote],
2417 dependencies : [threads,
2422 install_rpath : rootlibexecdir,
2424 install_dir : rootlibexecdir)
2426 s_j_gatewayd = executable('systemd-journal-gatewayd',
2427 systemd_journal_gatewayd_sources,
2428 include_directories : includes,
2429 link_with : [libshared],
2430 dependencies : [threads,
2435 install_rpath : rootlibexecdir,
2437 install_dir : rootlibexecdir)
2438 public_programs += [s_j_remote, s_j_gatewayd]
2441 if conf.get('ENABLE_COREDUMP') == 1
2442 executable('systemd-coredump',
2443 systemd_coredump_sources,
2444 include_directories : includes,
2445 link_with : [libshared],
2446 dependencies : [threads,
2451 install_rpath : rootlibexecdir,
2453 install_dir : rootlibexecdir)
2455 exe = executable('coredumpctl',
2456 coredumpctl_sources,
2457 include_directories : includes,
2458 link_with : [libshared],
2459 dependencies : [threads,
2462 install_rpath : rootlibexecdir,
2464 public_programs += exe
2467 if conf.get('ENABLE_PSTORE') == 1
2468 executable('systemd-pstore',
2469 systemd_pstore_sources,
2470 include_directories : includes,
2471 link_with : [libshared],
2472 dependencies : [threads,
2477 install_rpath : rootlibexecdir,
2479 install_dir : rootlibexecdir)
2482 if conf.get('ENABLE_BINFMT') == 1
2483 exe = executable('systemd-binfmt',
2484 'src/binfmt/binfmt.c',
2485 include_directories : includes,
2486 link_with : [libshared],
2487 install_rpath : rootlibexecdir,
2489 install_dir : rootlibexecdir)
2490 public_programs += exe
2492 meson.add_install_script('sh', '-c',
2493 mkdir_p.format(binfmtdir))
2494 meson.add_install_script('sh', '-c',
2495 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2498 if conf.get('ENABLE_REPART') == 1
2499 executable('systemd-repart',
2500 systemd_repart_sources,
2501 include_directories : includes,
2502 link_with : [libshared],
2503 dependencies : [threads,
2508 install_rpath : rootlibexecdir,
2510 install_dir : rootbindir)
2513 if conf.get('ENABLE_VCONSOLE') == 1
2514 executable('systemd-vconsole-setup',
2515 'src/vconsole/vconsole-setup.c',
2516 include_directories : includes,
2517 link_with : [libshared],
2518 install_rpath : rootlibexecdir,
2520 install_dir : rootlibexecdir)
2523 if conf.get('ENABLE_RANDOMSEED') == 1
2524 executable('systemd-random-seed',
2525 'src/random-seed/random-seed.c',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 install_rpath : rootlibexecdir,
2530 install_dir : rootlibexecdir)
2533 if conf.get('ENABLE_FIRSTBOOT') == 1
2534 executable('systemd-firstboot',
2535 'src/firstboot/firstboot.c',
2536 include_directories : includes,
2537 link_with : [libshared],
2538 dependencies : [libcrypt],
2539 install_rpath : rootlibexecdir,
2541 install_dir : rootbindir)
2544 executable('systemd-remount-fs',
2545 'src/remount-fs/remount-fs.c',
2546 include_directories : includes,
2547 link_with : [libcore_shared,
2549 install_rpath : rootlibexecdir,
2551 install_dir : rootlibexecdir)
2553 executable('systemd-machine-id-setup',
2554 'src/machine-id-setup/machine-id-setup-main.c',
2555 include_directories : includes,
2556 link_with : [libcore_shared,
2558 install_rpath : rootlibexecdir,
2560 install_dir : rootbindir)
2562 executable('systemd-fsck',
2564 include_directories : includes,
2565 link_with : [libshared],
2566 install_rpath : rootlibexecdir,
2568 install_dir : rootlibexecdir)
2570 executable('systemd-growfs',
2571 'src/partition/growfs.c',
2572 include_directories : includes,
2573 link_with : [libshared],
2574 dependencies : [libcryptsetup],
2575 install_rpath : rootlibexecdir,
2577 install_dir : rootlibexecdir)
2579 executable('systemd-makefs',
2580 'src/partition/makefs.c',
2581 include_directories : includes,
2582 link_with : [libshared],
2583 install_rpath : rootlibexecdir,
2585 install_dir : rootlibexecdir)
2587 executable('systemd-sleep',
2588 'src/sleep/sleep.c',
2589 include_directories : includes,
2590 link_with : [libshared],
2591 install_rpath : rootlibexecdir,
2593 install_dir : rootlibexecdir)
2595 install_data('src/sleep/sleep.conf',
2596 install_dir : pkgsysconfdir)
2598 exe = executable('systemd-sysctl',
2599 'src/sysctl/sysctl.c',
2600 include_directories : includes,
2601 link_with : [libshared],
2602 install_rpath : rootlibexecdir,
2604 install_dir : rootlibexecdir)
2605 public_programs += exe
2607 executable('systemd-ac-power',
2608 'src/ac-power/ac-power.c',
2609 include_directories : includes,
2610 link_with : [libshared],
2611 install_rpath : rootlibexecdir,
2613 install_dir : rootlibexecdir)
2615 exe = executable('systemd-detect-virt',
2616 'src/detect-virt/detect-virt.c',
2617 include_directories : includes,
2618 link_with : [libshared],
2619 install_rpath : rootlibexecdir,
2621 public_programs += exe
2623 exe = executable('systemd-delta',
2624 'src/delta/delta.c',
2625 include_directories : includes,
2626 link_with : [libshared],
2627 install_rpath : rootlibexecdir,
2629 public_programs += exe
2631 exe = executable('systemd-escape',
2632 'src/escape/escape.c',
2633 include_directories : includes,
2634 link_with : [libshared],
2635 install_rpath : rootlibexecdir,
2637 install_dir : rootbindir)
2638 public_programs += exe
2640 exe = executable('systemd-notify',
2641 'src/notify/notify.c',
2642 include_directories : includes,
2643 link_with : [libshared],
2644 install_rpath : rootlibexecdir,
2646 install_dir : rootbindir)
2647 public_programs += exe
2649 executable('systemd-volatile-root',
2650 'src/volatile-root/volatile-root.c',
2651 include_directories : includes,
2652 link_with : [libshared],
2653 install_rpath : rootlibexecdir,
2655 install_dir : rootlibexecdir)
2657 executable('systemd-cgroups-agent',
2658 'src/cgroups-agent/cgroups-agent.c',
2659 include_directories : includes,
2660 link_with : [libshared],
2661 install_rpath : rootlibexecdir,
2663 install_dir : rootlibexecdir)
2665 exe = executable('systemd-id128',
2666 'src/id128/id128.c',
2667 include_directories : includes,
2668 link_with : [libshared],
2669 install_rpath : rootlibexecdir,
2671 public_programs += exe
2673 exe = executable('systemd-path',
2675 include_directories : includes,
2676 link_with : [libshared],
2677 install_rpath : rootlibexecdir,
2679 public_programs += exe
2681 exe = executable('systemd-ask-password',
2682 'src/ask-password/ask-password.c',
2683 include_directories : includes,
2684 link_with : [libshared],
2685 install_rpath : rootlibexecdir,
2687 install_dir : rootbindir)
2688 public_programs += exe
2690 executable('systemd-reply-password',
2691 'src/reply-password/reply-password.c',
2692 include_directories : includes,
2693 link_with : [libshared],
2694 install_rpath : rootlibexecdir,
2696 install_dir : rootlibexecdir)
2698 exe = executable('systemd-tty-ask-password-agent',
2699 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2700 include_directories : includes,
2701 link_with : [libshared],
2702 install_rpath : rootlibexecdir,
2704 install_dir : rootbindir)
2705 public_programs += exe
2707 exe = executable('systemd-cgls',
2709 include_directories : includes,
2710 link_with : [libshared],
2711 install_rpath : rootlibexecdir,
2713 public_programs += exe
2715 exe = executable('systemd-cgtop',
2716 'src/cgtop/cgtop.c',
2717 include_directories : includes,
2718 link_with : [libshared],
2719 install_rpath : rootlibexecdir,
2721 public_programs += exe
2723 executable('systemd-initctl',
2724 'src/initctl/initctl.c',
2725 include_directories : includes,
2726 link_with : [libshared],
2727 install_rpath : rootlibexecdir,
2729 install_dir : rootlibexecdir)
2731 exe = executable('systemd-mount',
2732 'src/mount/mount-tool.c',
2733 include_directories : includes,
2734 link_with : [libshared],
2735 dependencies: [libmount],
2736 install_rpath : rootlibexecdir,
2738 public_programs += exe
2740 meson.add_install_script(meson_make_symlink,
2741 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2743 exe = executable('systemd-run',
2745 include_directories : includes,
2746 link_with : [libshared],
2747 install_rpath : rootlibexecdir,
2749 public_programs += exe
2751 exe = executable('systemd-stdio-bridge',
2752 'src/stdio-bridge/stdio-bridge.c',
2753 include_directories : includes,
2754 link_with : [libshared],
2755 dependencies : [versiondep],
2756 install_rpath : rootlibexecdir,
2758 public_programs += exe
2760 exe = executable('busctl',
2761 'src/busctl/busctl.c',
2762 'src/busctl/busctl-introspect.c',
2763 'src/busctl/busctl-introspect.h',
2764 include_directories : includes,
2765 link_with : [libshared],
2766 install_rpath : rootlibexecdir,
2768 public_programs += exe
2770 if conf.get('ENABLE_SYSUSERS') == 1
2771 exe = executable('systemd-sysusers',
2772 'src/sysusers/sysusers.c',
2773 include_directories : includes,
2774 link_with : [libshared],
2775 install_rpath : rootlibexecdir,
2777 install_dir : rootbindir)
2778 public_programs += exe
2781 if conf.get('ENABLE_TMPFILES') == 1
2782 exe = executable('systemd-tmpfiles',
2783 'src/tmpfiles/tmpfiles.c',
2784 include_directories : includes,
2785 link_with : [libshared],
2786 dependencies : [libacl],
2787 install_rpath : rootlibexecdir,
2789 install_dir : rootbindir)
2790 public_programs += exe
2792 if want_tests != 'false'
2793 test('test-systemd-tmpfiles',
2794 test_systemd_tmpfiles_py,
2795 # https://github.com/mesonbuild/meson/issues/2681
2796 args : exe.full_path())
2800 if conf.get('ENABLE_HWDB') == 1
2801 exe = executable('systemd-hwdb',
2803 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2804 include_directories : includes,
2805 link_with : [libudev_static],
2806 install_rpath : udev_rpath,
2808 install_dir : rootbindir)
2809 public_programs += exe
2812 if conf.get('ENABLE_QUOTACHECK') == 1
2813 executable('systemd-quotacheck',
2814 'src/quotacheck/quotacheck.c',
2815 include_directories : includes,
2816 link_with : [libshared],
2817 install_rpath : rootlibexecdir,
2819 install_dir : rootlibexecdir)
2822 exe = executable('systemd-socket-proxyd',
2823 'src/socket-proxy/socket-proxyd.c',
2824 include_directories : includes,
2825 link_with : [libshared],
2826 dependencies : [threads],
2827 install_rpath : rootlibexecdir,
2829 install_dir : rootlibexecdir)
2830 public_programs += exe
2832 exe = executable('systemd-udevd',
2833 systemd_udevd_sources,
2834 include_directories : includes,
2835 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2836 link_with : [libudev_core,
2839 dependencies : [versiondep,
2845 install_rpath : udev_rpath,
2847 install_dir : rootlibexecdir)
2848 public_programs += exe
2850 exe = executable('udevadm',
2852 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2853 include_directories : includes,
2854 link_with : [libudev_core,
2857 dependencies : [versiondep,
2863 install_rpath : udev_rpath,
2865 install_dir : rootbindir)
2866 public_programs += exe
2868 executable('systemd-shutdown',
2869 systemd_shutdown_sources,
2870 include_directories : includes,
2871 link_with : [libcore_shared,
2873 dependencies : [libmount],
2874 install_rpath : rootlibexecdir,
2876 install_dir : rootlibexecdir)
2878 executable('systemd-update-done',
2879 'src/update-done/update-done.c',
2880 include_directories : includes,
2881 link_with : [libshared],
2882 install_rpath : rootlibexecdir,
2884 install_dir : rootlibexecdir)
2886 executable('systemd-update-utmp',
2887 'src/update-utmp/update-utmp.c',
2888 include_directories : includes,
2889 link_with : [libshared],
2890 dependencies : [libaudit],
2891 install_rpath : rootlibexecdir,
2893 install_dir : rootlibexecdir)
2895 if conf.get('HAVE_KMOD') == 1
2896 executable('systemd-modules-load',
2897 'src/modules-load/modules-load.c',
2898 include_directories : includes,
2899 link_with : [libshared],
2900 dependencies : [libkmod],
2901 install_rpath : rootlibexecdir,
2903 install_dir : rootlibexecdir)
2905 meson.add_install_script('sh', '-c',
2906 mkdir_p.format(modulesloaddir))
2907 meson.add_install_script('sh', '-c',
2908 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2911 exe = executable('systemd-nspawn',
2912 systemd_nspawn_sources,
2913 include_directories : includes,
2914 link_with : [libcore_shared,
2917 dependencies : [libblkid,
2919 install_rpath : rootlibexecdir,
2921 public_programs += exe
2923 if conf.get('ENABLE_NETWORKD') == 1
2924 executable('systemd-networkd',
2925 systemd_networkd_sources,
2926 include_directories : network_include_dir,
2927 link_with : [libnetworkd_core,
2930 networkd_link_with],
2931 dependencies : [threads],
2932 install_rpath : rootlibexecdir,
2934 install_dir : rootlibexecdir)
2936 executable('systemd-networkd-wait-online',
2937 systemd_networkd_wait_online_sources,
2938 include_directories : includes,
2939 link_with : [libnetworkd_core,
2940 networkd_link_with],
2941 install_rpath : rootlibexecdir,
2943 install_dir : rootlibexecdir)
2945 exe = executable('networkctl',
2947 include_directories : includes,
2948 link_with : [libsystemd_network,
2949 networkd_link_with],
2950 install_rpath : rootlibexecdir,
2952 install_dir : rootbindir)
2953 public_programs += exe
2955 executable('systemd-network-generator',
2956 network_generator_sources,
2957 include_directories : includes,
2958 link_with : [networkd_link_with],
2959 install_rpath : rootlibexecdir,
2961 install_dir : rootlibexecdir)
2964 executable('systemd-sulogin-shell',
2965 ['src/sulogin-shell/sulogin-shell.c'],
2966 include_directories : includes,
2967 link_with : [libshared],
2968 install_rpath : rootlibexecdir,
2970 install_dir : rootlibexecdir)
2972 ############################################################
2975 'systemd-runtest.env',
2976 output : 'systemd-runtest.env',
2977 command : ['sh', '-c', '{ ' +
2978 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2979 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2981 build_by_default : true)
2983 foreach tuple : tests
2985 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2986 dependencies = tuple[2]
2987 condition = tuple.length() >= 4 ? tuple[3] : ''
2988 type = tuple.length() >= 5 ? tuple[4] : ''
2989 defs = tuple.length() >= 6 ? tuple[5] : []
2990 incs = tuple.length() >= 7 ? tuple[6] : includes
2993 name = sources[0].split('/')[-1].split('.')[0]
2994 if type.startswith('timeout=')
2995 timeout = type.split('=')[1].to_int()
2999 if condition == '' or conf.get(condition) == 1
3003 include_directories : incs,
3004 link_with : link_with,
3005 dependencies : [versiondep,
3008 build_by_default : want_tests != 'false',
3009 install_rpath : rootlibexecdir,
3010 install : install_tests,
3011 install_dir : join_paths(testsdir, type))
3014 message('@0@ is a manual test'.format(name))
3015 elif type == 'unsafe' and want_tests != 'unsafe'
3016 message('@0@ is an unsafe test'.format(name))
3017 elif want_tests != 'false'
3023 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3028 'test-libsystemd-sym',
3029 test_libsystemd_sym_c,
3030 include_directories : includes,
3031 link_with : [libsystemd],
3032 build_by_default : want_tests != 'false',
3033 install : install_tests,
3034 install_dir : testsdir)
3035 if want_tests != 'false'
3036 test('test-libsystemd-sym', exe)
3040 'test-libsystemd-static-sym',
3041 test_libsystemd_sym_c,
3042 include_directories : includes,
3043 link_with : [install_libsystemd_static],
3044 dependencies : [threads], # threads is already included in dependencies on the library,
3045 # but does not seem to get propagated. Add here as a work-around.
3046 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3047 install : install_tests and static_libsystemd_pic,
3048 install_dir : testsdir)
3049 if want_tests != 'false' and static_libsystemd_pic
3050 test('test-libsystemd-static-sym', exe)
3056 include_directories : includes,
3057 c_args : '-Wno-deprecated-declarations',
3058 link_with : [libudev],
3059 build_by_default : want_tests != 'false',
3060 install : install_tests,
3061 install_dir : testsdir)
3062 if want_tests != 'false'
3063 test('test-libudev-sym', exe)
3067 'test-libudev-static-sym',
3069 include_directories : includes,
3070 c_args : '-Wno-deprecated-declarations',
3071 link_with : [install_libudev_static],
3072 build_by_default : want_tests != 'false' and static_libudev_pic,
3073 install : install_tests and static_libudev_pic,
3074 install_dir : testsdir)
3075 if want_tests != 'false' and static_libudev_pic
3076 test('test-libudev-static-sym', exe)
3079 ############################################################
3083 if get_option('tests') != 'false'
3084 foreach tuple : fuzzers
3086 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3087 dependencies = tuple[2]
3088 defs = tuple.length() >= 4 ? tuple[3] : []
3089 incs = tuple.length() >= 5 ? tuple[4] : includes
3092 if want_ossfuzz or want_fuzzbuzz
3093 dependencies += fuzzing_engine
3095 if fuzzing_engine.found()
3096 dependencies += fuzzing_engine
3098 link_args += ['-fsanitize=fuzzer']
3101 sources += 'src/fuzz/fuzz-main.c'
3105 sources += 'src/fuzz/fuzzer-entry-point.c'
3108 name = sources[0].split('/')[-1].split('.')[0]
3110 fuzzer_exes += executable(
3113 include_directories : [incs, include_directories('src/fuzz')],
3114 link_with : link_with,
3115 dependencies : dependencies,
3117 link_args: link_args,
3122 run_target('fuzzers',
3123 depends : fuzzer_exes,
3126 ############################################################
3128 make_directive_index_py = find_program('tools/make-directive-index.py')
3129 make_man_index_py = find_program('tools/make-man-index.py')
3130 xml_helper_py = find_program('tools/xml_helper.py')
3131 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3132 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3135 subdir('sysusers.d')
3136 subdir('tmpfiles.d')
3142 subdir('shell-completion/bash')
3143 subdir('shell-completion/zsh')
3144 subdir('docs/sysvinit')
3145 subdir('docs/var-log')
3147 install_subdir('factory/etc',
3148 install_dir : factorydir)
3150 install_data('xorg/50-systemd-user.sh',
3151 install_dir : xinitrcdir)
3152 install_data('modprobe.d/systemd.conf',
3153 install_dir : modprobedir)
3154 install_data('LICENSE.GPL2',
3158 'docs/CODING_STYLE.md',
3159 'docs/DISTRO_PORTING.md',
3160 'docs/ENVIRONMENT.md',
3162 'docs/TRANSIENT-SETTINGS.md',
3163 'docs/TRANSLATORS.md',
3164 'docs/UIDS-GIDS.md',
3165 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3166 install_dir : docdir)
3168 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3169 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3171 ############################################################
3173 meson_check_help = find_program('tools/meson-check-help.sh')
3175 foreach exec : public_programs
3176 name = exec.full_path().split('/')[-1]
3177 if want_tests != 'false'
3178 test('check-help-' + name,
3180 args : exec.full_path())
3184 ############################################################
3186 check_directives_sh = find_program('tools/check-directives.sh')
3188 if want_tests != 'false'
3189 test('check-directives',
3190 check_directives_sh,
3191 args : project_source_root)
3194 ############################################################
3196 # Enable tests for all supported sanitizers
3197 foreach tuple : sanitizers
3198 sanitizer = tuple[0]
3201 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3203 foreach p : fuzz_regression_tests
3204 b = p.split('/')[-2]
3205 c = p.split('/')[-1]
3207 name = '@0@:@1@'.format(b, sanitizer)
3210 if want_tests == 'false'
3211 message('Not compiling @0@ because tests is set to false'.format(name))
3213 exe = custom_target(
3217 command : [env, 'ln', '-fs',
3218 join_paths(build.full_path(), b),
3220 build_by_default : true)
3222 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3227 if want_tests != 'false' and slow_tests
3228 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3230 args : [exe.full_path(),
3231 join_paths(project_source_root, p)])
3238 ############################################################
3241 all_files = run_command(
3243 ['--git-dir=@0@/.git'.format(project_source_root),
3246 all_files = files(all_files.stdout().split())
3251 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3254 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3258 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3261 command : [meson_git_contrib_sh])
3265 git_head = run_command(
3267 ['--git-dir=@0@/.git'.format(project_source_root),
3268 'rev-parse', 'HEAD']).stdout().strip()
3269 git_head_short = run_command(
3271 ['--git-dir=@0@/.git'.format(project_source_root),
3272 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3276 command : ['git', 'archive',
3277 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3279 '--prefix', 'systemd-@0@/'.format(git_head),
3283 ############################################################
3285 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3288 depends : [man, libsystemd, libudev],
3289 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3291 ############################################################
3292 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3295 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3297 'split /usr: @0@'.format(split_usr),
3298 'split bin-sbin: @0@'.format(split_bin),
3299 'prefix directory: @0@'.format(prefixdir),
3300 'rootprefix directory: @0@'.format(rootprefixdir),
3301 'sysconf directory: @0@'.format(sysconfdir),
3302 'include directory: @0@'.format(includedir),
3303 'lib directory: @0@'.format(libdir),
3304 'rootlib directory: @0@'.format(rootlibdir),
3305 'SysV init scripts: @0@'.format(sysvinit_path),
3306 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3307 'PAM modules directory: @0@'.format(pamlibdir),
3308 'PAM configuration directory: @0@'.format(pamconfdir),
3309 'RPM macros directory: @0@'.format(rpmmacrosdir),
3310 'modprobe.d directory: @0@'.format(modprobedir),
3311 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3312 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3313 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3314 'bash completions directory: @0@'.format(bashcompletiondir),
3315 'zsh completions directory: @0@'.format(zshcompletiondir),
3316 'extra start script: @0@'.format(get_option('rc-local')),
3317 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3318 get_option('debug-tty')),
3319 'TTY GID: @0@'.format(tty_gid),
3320 'users GID: @0@'.format(substs.get('USERS_GID')),
3321 'maximum system UID: @0@'.format(system_uid_max),
3322 'maximum system GID: @0@'.format(system_gid_max),
3323 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3324 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3325 'minimum container UID base: @0@'.format(container_uid_base_min),
3326 'maximum container UID base: @0@'.format(container_uid_base_max),
3327 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3328 'render group access mode: @0@'.format(get_option('group-render-mode')),
3329 'certificate root directory: @0@'.format(get_option('certificate-root')),
3330 'support URL: @0@'.format(support_url),
3331 'nobody user name: @0@'.format(nobody_user),
3332 'nobody group name: @0@'.format(nobody_group),
3333 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3334 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3336 'default DNSSEC mode: @0@'.format(default_dnssec),
3337 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3338 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3339 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3340 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3341 'default locale: @0@'.format(default_locale),
3342 'default user $PATH: @0@'.format(default_user_path_display),
3343 'systemd service watchdog: @0@'.format(watchdog_opt)]
3345 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3346 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3348 'default DNS servers: @0@'.format(alt_dns_servers),
3349 'default NTP servers: @0@'.format(alt_ntp_servers)]
3351 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3352 '@@0@'.format(time_epoch)).stdout().strip()
3354 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3357 'static libsystemd: @0@'.format(static_libsystemd),
3358 'static libudev: @0@'.format(static_libudev)]
3361 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3362 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3363 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3365 if conf.get('ENABLE_EFI') == 1
3366 status += 'efi arch: @0@'.format(efi_arch)
3370 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3371 'EFI CC @0@'.format(' '.join(efi_cc)),
3372 'EFI lib directory: @0@'.format(efi_libdir),
3373 'EFI lds directory: @0@'.format(efi_ldsdir),
3374 'EFI include directory: @0@'.format(efi_incdir)]
3432 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3433 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3437 ['legacy pkla', install_polkit_pkla],
3439 ['gnu-efi', have_gnu_efi],
3452 ['man pages', want_man],
3453 ['html pages', want_html],
3454 ['man page indices', want_man and have_lxml],
3459 ['adm group', get_option('adm-group')],
3460 ['wheel group', get_option('wheel-group')],
3463 ['debug mmap cache'],
3465 ['valgrind', conf.get('VALGRIND') == 1],
3466 ['trace logging', conf.get('LOG_TRACE') == 1],
3467 ['link-udev-shared', get_option('link-udev-shared')],
3468 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3469 ['link-networkd-shared', get_option('link-networkd-shared')],
3472 if tuple.length() >= 2
3475 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3476 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3477 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3488 'enabled features: @0@'.format(', '.join(found)),
3490 'disabled features: @0@'.format(', '.join(missing)),
3492 message('\n '.join(status))
3494 if rootprefixdir != rootprefix_default
3496 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3497 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3498 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))