1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.28.0'
17 libudev_version = '1.6.17'
19 # We need the same data in two different formats, ugh!
20 # Also, for hysterical reasons, we use different variable
21 # names, sometimes. Not all variables are included in every
23 conf = configuration_data()
24 conf.set('PROJECT_VERSION', meson.project_version(),
25 description : 'Numerical project version (used where a simple number is expected)')
27 substs = configuration_data()
28 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
29 substs.set('PROJECT_VERSION', meson.project_version(),
30 description : 'Numerical project version (used where a simple number is expected)')
32 # This is to be used instead of meson.source_root(), as the latter will return
33 # the wrong result when systemd is being built as a meson subproject
34 project_source_root = meson.current_source_dir()
35 project_build_root = meson.current_build_dir()
36 relative_source_path = run_command('realpath',
37 '--relative-to=@0@'.format(project_build_root),
38 project_source_root).stdout().strip()
39 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
41 want_ossfuzz = get_option('oss-fuzz')
42 want_libfuzzer = get_option('llvm-fuzz')
43 if want_ossfuzz + want_libfuzzer > 1
44 error('only one of oss-fuzz or llvm-fuzz can be specified')
47 skip_deps = want_ossfuzz or want_libfuzzer
48 fuzzer_build = want_ossfuzz or want_libfuzzer
50 #####################################################################
52 # Try to install the git pre-commit hook
53 add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
54 if add_git_hook_sh.found()
55 git_hook = run_command(add_git_hook_sh)
56 if git_hook.returncode() == 0
57 message(git_hook.stdout().strip())
61 #####################################################################
63 if get_option('split-usr') == 'auto'
64 split_usr = run_command('test', '-L', '/bin').returncode() != 0
66 split_usr = get_option('split-usr') == 'true'
68 conf.set10('HAVE_SPLIT_USR', split_usr,
69 description : '/usr/bin and /bin directories are separate')
71 if get_option('split-bin') == 'auto'
72 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
74 split_bin = get_option('split-bin') == 'true'
76 conf.set10('HAVE_SPLIT_BIN', split_bin,
77 description : 'bin and sbin directories are separate')
79 rootprefixdir = get_option('rootprefix')
80 # Unusual rootprefixdir values are used by some distros
81 # (see https://github.com/systemd/systemd/pull/7461).
82 rootprefix_default = split_usr ? '/' : '/usr'
83 if rootprefixdir == ''
84 rootprefixdir = rootprefix_default
86 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
88 sysvinit_path = get_option('sysvinit-path')
89 sysvrcnd_path = get_option('sysvrcnd-path')
90 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
91 description : 'SysV init scripts and rcN.d links are supported')
93 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
94 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
95 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
97 # join_paths ignores the preceding arguments if an absolute component is
98 # encountered, so this should canonicalize various paths when they are
99 # absolute or relative.
100 prefixdir = get_option('prefix')
101 if not prefixdir.startswith('/')
102 error('Prefix is not absolute: "@0@"'.format(prefixdir))
104 bindir = join_paths(prefixdir, get_option('bindir'))
105 libdir = join_paths(prefixdir, get_option('libdir'))
106 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
107 includedir = join_paths(prefixdir, get_option('includedir'))
108 datadir = join_paths(prefixdir, get_option('datadir'))
109 localstatedir = join_paths('/', get_option('localstatedir'))
111 rootbindir = join_paths(rootprefixdir, 'bin')
112 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
113 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
115 rootlibdir = get_option('rootlibdir')
117 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
120 # Dirs of external packages
121 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
122 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
123 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
124 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
125 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
126 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
127 rpmmacrosdir = get_option('rpmmacrosdir')
128 if rpmmacrosdir != 'no'
129 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
131 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
134 pkgdatadir = join_paths(datadir, 'systemd')
135 environmentdir = join_paths(prefixdir, 'lib/environment.d')
136 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
137 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
138 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
139 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
140 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
141 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
142 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
143 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
144 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
145 pkgincludedir = join_paths(includedir, 'systemd')
146 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
147 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
148 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
149 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
150 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
151 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
152 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
153 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
154 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
155 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
156 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
157 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
158 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
159 factorydir = join_paths(datadir, 'factory')
160 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
161 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
162 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
163 catalogstatedir = join_paths(systemdstatedir, 'catalog')
164 randomseeddir = join_paths(localstatedir, 'lib/systemd')
165 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
166 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
168 docdir = get_option('docdir')
170 docdir = join_paths(datadir, 'doc/systemd')
173 dbuspolicydir = get_option('dbuspolicydir')
174 if dbuspolicydir == ''
175 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
178 dbussessionservicedir = get_option('dbussessionservicedir')
179 if dbussessionservicedir == ''
180 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
183 dbussystemservicedir = get_option('dbussystemservicedir')
184 if dbussystemservicedir == ''
185 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
188 pamlibdir = get_option('pamlibdir')
190 pamlibdir = join_paths(rootlibdir, 'security')
193 pamconfdir = get_option('pamconfdir')
195 pamconfdir = join_paths(sysconfdir, 'pam.d')
198 memory_accounting_default = get_option('memory-accounting-default')
199 status_unit_format_default = get_option('status-unit-format-default')
201 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
202 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
203 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
204 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
205 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
206 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
208 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
210 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
211 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
212 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
213 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
214 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
215 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
216 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
217 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
218 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
219 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
220 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
221 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
222 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
223 conf.set_quoted('ROOTPREFIX', rootprefixdir)
224 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
225 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
226 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
227 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
228 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
229 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
230 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
231 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
232 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
233 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
234 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
235 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
236 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
237 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
238 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
239 conf.set_quoted('LIBDIR', libdir)
240 conf.set_quoted('ROOTLIBDIR', rootlibdir)
241 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
242 conf.set_quoted('BOOTLIBDIR', bootlibdir)
243 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
244 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
245 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
246 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
247 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
248 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
249 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
250 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
251 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
252 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
253 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
254 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
256 substs.set('prefix', prefixdir)
257 substs.set('rootprefix', rootprefixdir)
258 substs.set('rootprefix_noslash', rootprefixdir_noslash)
259 substs.set('exec_prefix', prefixdir)
260 substs.set('libdir', libdir)
261 substs.set('rootlibdir', rootlibdir)
262 substs.set('includedir', includedir)
263 substs.set('sysconfdir', sysconfdir)
264 substs.set('bindir', bindir)
265 substs.set('rootbindir', rootbindir)
266 substs.set('rootlibexecdir', rootlibexecdir)
267 substs.set('systemunitdir', systemunitdir)
268 substs.set('userunitdir', userunitdir)
269 substs.set('systempresetdir', systempresetdir)
270 substs.set('userpresetdir', userpresetdir)
271 substs.set('udevhwdbdir', udevhwdbdir)
272 substs.set('udevrulesdir', udevrulesdir)
273 substs.set('udevlibexecdir', udevlibexecdir)
274 substs.set('environmentdir', environmentdir)
275 substs.set('catalogdir', catalogdir)
276 substs.set('tmpfilesdir', tmpfilesdir)
277 substs.set('sysusersdir', sysusersdir)
278 substs.set('sysctldir', sysctldir)
279 substs.set('binfmtdir', binfmtdir)
280 substs.set('modulesloaddir', modulesloaddir)
281 substs.set('modprobedir', modprobedir)
282 substs.set('systemgeneratordir', systemgeneratordir)
283 substs.set('usergeneratordir', usergeneratordir)
284 substs.set('systemenvgeneratordir', systemenvgeneratordir)
285 substs.set('userenvgeneratordir', userenvgeneratordir)
286 substs.set('systemshutdowndir', systemshutdowndir)
287 substs.set('systemsleepdir', systemsleepdir)
288 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
289 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
290 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
291 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
292 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
293 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
294 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
295 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
296 substs.set('BUILD_ROOT', project_build_root)
298 #####################################################################
300 cc = meson.get_compiler('c')
301 pkgconfig = import('pkgconfig')
302 check_compilation_sh = find_program('tools/check-compilation.sh')
303 meson_build_sh = find_program('tools/meson-build.sh')
305 want_tests = get_option('tests')
306 slow_tests = want_tests != 'false' and get_option('slow-tests')
307 install_tests = get_option('install-tests')
309 if add_languages('cpp', required : fuzzer_build)
310 # Used only for tests
311 cxx = meson.get_compiler('cpp')
312 cxx_cmd = ' '.join(cxx.cmd_array())
318 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
319 if fuzzing_engine.found()
320 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
321 elif cc.has_argument('-fsanitize=fuzzer-no-link')
322 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
324 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
327 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
330 # Those generate many false positives, and we do not want to change the code to
332 basic_disabled_warnings = [
333 '-Wno-unused-parameter',
334 '-Wno-missing-field-initializers',
335 '-Wno-unused-result',
336 '-Wno-format-signedness',
339 possible_cc_flags = [
342 '-Wmissing-include-dirs',
343 '-Wold-style-definition',
347 '-Wsuggest-attribute=noreturn',
348 '-Werror=missing-prototypes',
349 '-Werror=implicit-function-declaration',
350 '-Werror=missing-declarations',
351 '-Werror=return-type',
352 '-Werror=incompatible-pointer-types',
354 '-Wstrict-prototypes',
356 '-Wmissing-noreturn',
357 '-Wimplicit-fallthrough=5',
360 '-Wstrict-aliasing=2',
363 '-Werror=shift-count-overflow',
364 '-Werror=shift-overflow=2',
368 # negative arguments are correctly detected starting with meson 0.46.
369 '-Wno-error=#warnings', # clang
370 '-Wno-string-plus-int', # clang
372 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
373 # optimizations enabled, producing essentially false positives.
374 '-Wno-maybe-uninitialized',
378 '-fdiagnostics-show-option',
379 '-fno-strict-aliasing',
380 '-fvisibility=hidden',
382 '-fstack-protector-strong',
383 '--param=ssp-buffer-size=4',
386 # --as-needed and --no-undefined are provided by meson by default,
387 # run mesonconf to see what is enabled
388 possible_link_flags = [
394 if cc.get_id() == 'clang'
395 possible_cc_flags += [
396 '-Wno-typedef-redefinition',
397 '-Wno-gnu-variable-sized-type-not-at-end',
401 if get_option('buildtype') != 'debug'
402 possible_cc_flags += [
403 '-ffunction-sections',
407 possible_link_flags += '-Wl,--gc-sections'
410 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
411 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
412 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
416 #include <inttypes.h>
417 typedef uint64_t usec_t;
418 usec_t now(clockid_t clock);
423 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
424 add_project_arguments('-Werror=shadow', language : 'c')
428 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
431 cpp = ' '.join(cc.cmd_array()) + ' -E'
433 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
435 #####################################################################
436 # compilation result tests
438 conf.set('_GNU_SOURCE', true)
439 conf.set('__SANE_USERSPACE_TYPES__', true)
440 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
442 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
443 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
444 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
445 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
449 #include <sys/stat.h>
452 foreach decl : ['char16_t',
457 # We get -1 if the size cannot be determined
458 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
460 if decl == 'struct statx'
462 want_linux_stat_h = false
464 have = cc.sizeof(decl,
465 prefix : decl_headers + '#include <linux/stat.h>',
466 args : '-D_GNU_SOURCE') > 0
467 want_linux_stat_h = have
471 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
474 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
476 foreach ident : ['secure_getenv', '__secure_getenv']
477 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
481 ['memfd_create', '''#include <sys/mman.h>'''],
482 ['gettid', '''#include <sys/types.h>
483 #include <unistd.h>'''],
484 ['pivot_root', '''#include <stdlib.h>
485 #include <unistd.h>'''], # no known header declares pivot_root
486 ['name_to_handle_at', '''#include <sys/types.h>
487 #include <sys/stat.h>
488 #include <fcntl.h>'''],
489 ['setns', '''#include <sched.h>'''],
490 ['renameat2', '''#include <stdio.h>
491 #include <fcntl.h>'''],
492 ['kcmp', '''#include <linux/kcmp.h>'''],
493 ['keyctl', '''#include <sys/types.h>
494 #include <keyutils.h>'''],
495 ['copy_file_range', '''#include <sys/syscall.h>
496 #include <unistd.h>'''],
497 ['bpf', '''#include <sys/syscall.h>
498 #include <unistd.h>'''],
499 ['statx', '''#include <sys/types.h>
500 #include <sys/stat.h>
501 #include <unistd.h>'''],
502 ['explicit_bzero' , '''#include <string.h>'''],
503 ['reallocarray', '''#include <malloc.h>'''],
504 ['set_mempolicy', '''#include <stdlib.h>
505 #include <unistd.h>'''],
506 ['get_mempolicy', '''#include <stdlib.h>
507 #include <unistd.h>'''],
508 ['pidfd_send_signal', '''#include <stdlib.h>
511 #include <sys/wait.h>'''],
512 ['pidfd_open', '''#include <stdlib.h>
515 #include <sys/wait.h>'''],
516 ['rt_sigqueueinfo', '''#include <stdlib.h>
519 #include <sys/wait.h>'''],
522 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
523 conf.set10('HAVE_' + ident[0].to_upper(), have)
526 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
527 conf.set10('USE_SYS_RANDOM_H', true)
528 conf.set10('HAVE_GETRANDOM', true)
530 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
531 conf.set10('USE_SYS_RANDOM_H', false)
532 conf.set10('HAVE_GETRANDOM', have)
535 #####################################################################
537 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
539 get_option('version-tag'),
540 meson.project_version()]
543 input : 'src/version/version.h.in',
544 output : 'version.h',
547 versiondep = declare_dependency(sources: version_h)
549 sed = find_program('sed')
550 awk = find_program('awk')
551 m4 = find_program('m4')
552 stat = find_program('stat')
553 git = find_program('git', required : false)
554 env = find_program('env')
555 perl = find_program('perl', required : false)
557 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
558 mkdir_p = 'mkdir -p $DESTDIR/@0@'
559 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
560 splash_bmp = files('test/splash.bmp')
562 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
563 # /usr/sbin, /sbin, and fall back to the default from middle column.
564 progs = [['quotaon', '/usr/sbin/quotaon' ],
565 ['quotacheck', '/usr/sbin/quotacheck' ],
566 ['kmod', '/usr/bin/kmod' ],
567 ['kexec', '/usr/sbin/kexec' ],
568 ['sulogin', '/usr/sbin/sulogin' ],
569 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
570 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
571 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
572 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
573 ['nologin', '/usr/sbin/nologin', ],
576 path = get_option(prog[0] + '-path')
578 message('Using @1@ for @0@'.format(prog[0], path))
580 exe = find_program(prog[0],
581 '/usr/sbin/' + prog[0],
584 path = exe.found() ? exe.path() : prog[1]
586 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
587 conf.set_quoted(name, path)
588 substs.set(name, path)
591 conf.set_quoted('TELINIT', get_option('telinit-path'))
593 if run_command('ln', '--relative', '--help').returncode() != 0
594 error('ln does not support --relative (added in coreutils 8.16)')
597 ############################################################
599 gperf = find_program('gperf')
601 gperf_test_format = '''
603 const char * in_word_set(const char *, @0@);
606 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
607 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
608 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
609 if cc.compiles(gperf_test)
610 gperf_len_type = 'size_t'
612 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
613 if cc.compiles(gperf_test)
614 gperf_len_type = 'unsigned'
616 error('unable to determine gperf len type')
619 message('gperf len type is @0@'.format(gperf_len_type))
620 conf.set('GPERF_LEN_TYPE', gperf_len_type,
621 description : 'The type of gperf "len" parameter')
623 ############################################################
625 if not cc.has_header('sys/capability.h')
626 error('POSIX caps headers not found')
628 foreach header : ['crypt.h',
630 'linux/vm_sockets.h',
632 'valgrind/memcheck.h',
633 'valgrind/valgrind.h',
636 conf.set10('HAVE_' + header.underscorify().to_upper(),
637 cc.has_header(header))
640 ############################################################
642 fallback_hostname = get_option('fallback-hostname')
643 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
644 error('Invalid fallback-hostname configuration')
645 # A more extensive test is done in test-hostname-util. Let's catch
646 # the most obvious errors here so we don't fail with an assert later.
648 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
650 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
651 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
653 default_hierarchy = get_option('default-hierarchy')
654 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
655 description : 'default cgroup hierarchy as string')
656 if default_hierarchy == 'legacy'
657 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
658 elif default_hierarchy == 'hybrid'
659 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
661 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
664 default_net_naming_scheme = get_option('default-net-naming-scheme')
665 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
667 time_epoch = get_option('time-epoch')
670 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
672 conf.set('TIME_EPOCH', time_epoch)
674 system_uid_max = get_option('system-uid-max')
675 if system_uid_max == -1
676 system_uid_max = run_command(
678 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
679 '/etc/login.defs').stdout().strip()
680 if system_uid_max == ''
683 system_uid_max = system_uid_max.to_int()
686 conf.set('SYSTEM_UID_MAX', system_uid_max)
687 substs.set('systemuidmax', system_uid_max)
689 system_gid_max = get_option('system-gid-max')
690 if system_gid_max == -1
691 system_gid_max = run_command(
693 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
694 '/etc/login.defs').stdout().strip()
695 if system_gid_max == ''
698 system_gid_max = system_gid_max.to_int()
701 conf.set('SYSTEM_GID_MAX', system_gid_max)
702 substs.set('systemgidmax', system_gid_max)
704 dynamic_uid_min = get_option('dynamic-uid-min')
705 dynamic_uid_max = get_option('dynamic-uid-max')
706 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
707 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
708 substs.set('dynamicuidmin', dynamic_uid_min)
709 substs.set('dynamicuidmax', dynamic_uid_max)
711 container_uid_base_min = get_option('container-uid-base-min')
712 container_uid_base_max = get_option('container-uid-base-max')
713 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
714 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
715 substs.set('containeruidbasemin', container_uid_base_min)
716 substs.set('containeruidbasemax', container_uid_base_max)
718 nobody_user = get_option('nobody-user')
719 nobody_group = get_option('nobody-group')
721 if not meson.is_cross_build()
722 getent_result = run_command('getent', 'passwd', '65534')
723 if getent_result.returncode() == 0
724 name = getent_result.stdout().split(':')[0]
725 if name != nobody_user
727 '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) +
728 'Your build will result in an user table setup that is incompatible with the local system.')
731 id_result = run_command('id', '-u', nobody_user)
732 if id_result.returncode() == 0
733 id = id_result.stdout().to_int()
736 '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) +
737 'Your build will result in an user table setup that is incompatible with the local system.')
741 getent_result = run_command('getent', 'group', '65534')
742 if getent_result.returncode() == 0
743 name = getent_result.stdout().split(':')[0]
744 if name != nobody_group
746 '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) +
747 'Your build will result in an group table setup that is incompatible with the local system.')
750 id_result = run_command('id', '-g', nobody_group)
751 if id_result.returncode() == 0
752 id = id_result.stdout().to_int()
755 '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) +
756 'Your build will result in an group table setup that is incompatible with the local system.')
760 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
762 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
763 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
766 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
767 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
768 substs.set('NOBODY_USER_NAME', nobody_user)
769 substs.set('NOBODY_GROUP_NAME', nobody_group)
771 tty_gid = get_option('tty-gid')
772 conf.set('TTY_GID', tty_gid)
773 substs.set('TTY_GID', tty_gid)
775 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
776 users_gid = get_option('users-gid')
777 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
779 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
780 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
782 dev_kvm_mode = get_option('dev-kvm-mode')
783 substs.set('DEV_KVM_MODE', dev_kvm_mode)
784 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
785 group_render_mode = get_option('group-render-mode')
786 substs.set('GROUP_RENDER_MODE', group_render_mode)
787 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
789 kill_user_processes = get_option('default-kill-user-processes')
790 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
791 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
792 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
794 dns_servers = get_option('dns-servers')
795 conf.set_quoted('DNS_SERVERS', dns_servers)
796 substs.set('DNS_SERVERS', dns_servers)
798 ntp_servers = get_option('ntp-servers')
799 conf.set_quoted('NTP_SERVERS', ntp_servers)
800 substs.set('NTP_SERVERS', ntp_servers)
802 default_locale = get_option('default-locale')
803 if default_locale == ''
804 if not meson.is_cross_build()
805 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
806 default_locale = run_command(choose_default_locale_sh).stdout().strip()
808 default_locale = 'C.UTF-8'
811 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
813 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
815 service_watchdog = get_option('service-watchdog')
816 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
817 substs.set('SERVICE_WATCHDOG', watchdog_value)
819 substs.set('SUSHELL', get_option('debug-shell'))
820 substs.set('DEBUGTTY', get_option('debug-tty'))
821 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
823 enable_debug_hashmap = false
824 enable_debug_mmap_cache = false
825 enable_debug_siphash = false
826 foreach name : get_option('debug-extra')
828 enable_debug_hashmap = true
829 elif name == 'mmap-cache'
830 enable_debug_mmap_cache = true
831 elif name == 'siphash'
832 enable_debug_siphash = true
834 message('unknown debug option "@0@", ignoring'.format(name))
837 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
838 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
839 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
841 conf.set10('VALGRIND', get_option('valgrind'))
842 conf.set10('LOG_TRACE', get_option('log-trace'))
844 default_user_path = get_option('user-path')
845 if default_user_path != ''
846 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
847 default_user_path_display = default_user_path
849 # meson 0.49 fails when ?: is used in .format()
850 default_user_path_display = '(same as system services)'
854 #####################################################################
856 threads = dependency('threads')
857 librt = cc.find_library('rt')
858 libm = cc.find_library('m')
859 libdl = cc.find_library('dl')
860 libcrypt = cc.find_library('crypt')
862 libcap = dependency('libcap', required : false)
863 if not libcap.found()
864 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
865 libcap = cc.find_library('cap')
868 libmount = dependency('mount',
869 version : fuzzer_build ? '>= 0' : '>= 2.30')
871 want_libfdisk = get_option('fdisk')
872 if want_libfdisk != 'false' and not skip_deps
873 libfdisk = dependency('fdisk',
874 required : want_libfdisk == 'true')
875 have = libfdisk.found()
880 conf.set10('HAVE_LIBFDISK', have)
882 want_pwquality = get_option('pwquality')
883 if want_pwquality != 'false' and not skip_deps
884 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
885 have = libpwquality.found()
890 conf.set10('HAVE_PWQUALITY', have)
892 want_seccomp = get_option('seccomp')
893 if want_seccomp != 'false' and not skip_deps
894 libseccomp = dependency('libseccomp',
895 version : '>= 2.3.1',
896 required : want_seccomp == 'true')
897 have = libseccomp.found()
902 conf.set10('HAVE_SECCOMP', have)
904 want_selinux = get_option('selinux')
905 if want_selinux != 'false' and not skip_deps
906 libselinux = dependency('libselinux',
907 version : '>= 2.1.9',
908 required : want_selinux == 'true')
909 have = libselinux.found()
914 conf.set10('HAVE_SELINUX', have)
916 want_apparmor = get_option('apparmor')
917 if want_apparmor != 'false' and not skip_deps
918 libapparmor = dependency('libapparmor',
919 required : want_apparmor == 'true')
920 have = libapparmor.found()
925 conf.set10('HAVE_APPARMOR', have)
927 smack_run_label = get_option('smack-run-label')
928 if smack_run_label != ''
929 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
932 want_polkit = get_option('polkit')
933 install_polkit = false
934 install_polkit_pkla = false
935 if want_polkit != 'false' and not skip_deps
936 install_polkit = true
938 libpolkit = dependency('polkit-gobject-1',
940 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
941 message('Old polkit detected, will install pkla files')
942 install_polkit_pkla = true
945 conf.set10('ENABLE_POLKIT', install_polkit)
947 want_acl = get_option('acl')
948 if want_acl != 'false' and not skip_deps
949 libacl = cc.find_library('acl', required : want_acl == 'true')
950 have = libacl.found()
955 conf.set10('HAVE_ACL', have)
957 want_audit = get_option('audit')
958 if want_audit != 'false' and not skip_deps
959 libaudit = dependency('audit', required : want_audit == 'true')
960 have = libaudit.found()
965 conf.set10('HAVE_AUDIT', have)
967 want_blkid = get_option('blkid')
968 if want_blkid != 'false' and not skip_deps
969 libblkid = dependency('blkid', required : want_blkid == 'true')
970 have = libblkid.found()
975 conf.set10('HAVE_BLKID', have)
977 want_kmod = get_option('kmod')
978 if want_kmod != 'false' and not skip_deps
979 libkmod = dependency('libkmod',
981 required : want_kmod == 'true')
982 have = libkmod.found()
987 conf.set10('HAVE_KMOD', have)
989 want_pam = get_option('pam')
990 if want_pam != 'false' and not skip_deps
991 libpam = cc.find_library('pam', required : want_pam == 'true')
992 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
993 have = libpam.found() and libpam_misc.found()
999 conf.set10('HAVE_PAM', have)
1001 want_microhttpd = get_option('microhttpd')
1002 if want_microhttpd != 'false' and not skip_deps
1003 libmicrohttpd = dependency('libmicrohttpd',
1004 version : '>= 0.9.33',
1005 required : want_microhttpd == 'true')
1006 have = libmicrohttpd.found()
1011 conf.set10('HAVE_MICROHTTPD', have)
1013 want_libcryptsetup = get_option('libcryptsetup')
1014 if want_libcryptsetup != 'false' and not skip_deps
1015 libcryptsetup = dependency('libcryptsetup',
1016 version : '>= 2.0.1',
1017 required : want_libcryptsetup == 'true')
1018 have = libcryptsetup.found()
1020 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1021 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1026 conf.set10('HAVE_LIBCRYPTSETUP', have)
1028 want_libcurl = get_option('libcurl')
1029 if want_libcurl != 'false' and not skip_deps
1030 libcurl = dependency('libcurl',
1031 version : '>= 7.32.0',
1032 required : want_libcurl == 'true')
1033 have = libcurl.found()
1038 conf.set10('HAVE_LIBCURL', have)
1040 want_libidn = get_option('libidn')
1041 want_libidn2 = get_option('libidn2')
1042 if want_libidn == 'true' and want_libidn2 == 'true'
1043 error('libidn and libidn2 cannot be requested simultaneously')
1046 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1047 libidn = dependency('libidn2',
1048 required : want_libidn2 == 'true')
1049 have = libidn.found()
1054 conf.set10('HAVE_LIBIDN2', have)
1055 if not have and want_libidn != 'false' and not skip_deps
1056 # libidn is used for both libidn and libidn2 objects
1057 libidn = dependency('libidn',
1058 required : want_libidn == 'true')
1059 have = libidn.found()
1063 conf.set10('HAVE_LIBIDN', have)
1065 want_libiptc = get_option('libiptc')
1066 if want_libiptc != 'false' and not skip_deps
1067 libiptc = dependency('libiptc',
1068 required : want_libiptc == 'true')
1069 have = libiptc.found()
1074 conf.set10('HAVE_LIBIPTC', have)
1076 want_qrencode = get_option('qrencode')
1077 if want_qrencode != 'false' and not skip_deps
1078 libqrencode = dependency('libqrencode',
1079 required : want_qrencode == 'true')
1080 have = libqrencode.found()
1085 conf.set10('HAVE_QRENCODE', have)
1087 want_gcrypt = get_option('gcrypt')
1088 if want_gcrypt != 'false' and not skip_deps
1089 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1090 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1091 have = libgcrypt.found() and libgpg_error.found()
1096 # link to neither of the libs if one is not found
1100 conf.set10('HAVE_GCRYPT', have)
1102 want_gnutls = get_option('gnutls')
1103 if want_gnutls != 'false' and not skip_deps
1104 libgnutls = dependency('gnutls',
1105 version : '>= 3.1.4',
1106 required : want_gnutls == 'true')
1107 have = libgnutls.found()
1112 conf.set10('HAVE_GNUTLS', have)
1114 want_openssl = get_option('openssl')
1115 if want_openssl != 'false' and not skip_deps
1116 libopenssl = dependency('openssl',
1117 version : '>= 1.1.0',
1118 required : want_openssl == 'true')
1119 have = libopenssl.found()
1124 conf.set10('HAVE_OPENSSL', have)
1126 want_p11kit = get_option('p11kit')
1127 if want_p11kit != 'false' and not skip_deps
1128 libp11kit = dependency('p11-kit-1',
1129 version : '>= 0.23.3',
1130 required : want_p11kit == 'true')
1131 have = libp11kit.found()
1136 conf.set10('HAVE_P11KIT', have)
1138 want_elfutils = get_option('elfutils')
1139 if want_elfutils != 'false' and not skip_deps
1140 libdw = dependency('libdw',
1141 required : want_elfutils == 'true')
1142 have = libdw.found()
1147 conf.set10('HAVE_ELFUTILS', have)
1149 want_zlib = get_option('zlib')
1150 if want_zlib != 'false' and not skip_deps
1151 libz = dependency('zlib',
1152 required : want_zlib == 'true')
1158 conf.set10('HAVE_ZLIB', have)
1160 want_bzip2 = get_option('bzip2')
1161 if want_bzip2 != 'false' and not skip_deps
1162 libbzip2 = cc.find_library('bz2',
1163 required : want_bzip2 == 'true')
1164 have = libbzip2.found()
1169 conf.set10('HAVE_BZIP2', have)
1171 want_xz = get_option('xz')
1172 if want_xz != 'false' and not skip_deps
1173 libxz = dependency('liblzma',
1174 required : want_xz == 'true')
1175 have = libxz.found()
1180 conf.set10('HAVE_XZ', have)
1182 want_lz4 = get_option('lz4')
1183 if want_lz4 != 'false' and not skip_deps
1184 liblz4 = dependency('liblz4',
1185 version : '>= 1.3.0',
1186 required : want_lz4 == 'true')
1187 have = liblz4.found()
1192 conf.set10('HAVE_LZ4', have)
1194 want_zstd = get_option('zstd')
1195 if want_zstd != 'false' and not skip_deps
1196 libzstd = dependency('libzstd',
1197 required : want_zstd == 'true',
1198 version : '>= 1.4.0')
1199 have = libzstd.found()
1204 conf.set10('HAVE_ZSTD', have)
1206 want_xkbcommon = get_option('xkbcommon')
1207 if want_xkbcommon != 'false' and not skip_deps
1208 libxkbcommon = dependency('xkbcommon',
1209 version : '>= 0.3.0',
1210 required : want_xkbcommon == 'true')
1211 have = libxkbcommon.found()
1216 conf.set10('HAVE_XKBCOMMON', have)
1218 want_pcre2 = get_option('pcre2')
1219 if want_pcre2 != 'false'
1220 libpcre2 = dependency('libpcre2-8',
1221 required : want_pcre2 == 'true')
1222 have = libpcre2.found()
1227 conf.set10('HAVE_PCRE2', have)
1229 want_glib = get_option('glib')
1230 if want_glib != 'false' and not skip_deps
1231 libglib = dependency('glib-2.0',
1232 version : '>= 2.22.0',
1233 required : want_glib == 'true')
1234 libgobject = dependency('gobject-2.0',
1235 version : '>= 2.22.0',
1236 required : want_glib == 'true')
1237 libgio = dependency('gio-2.0',
1238 required : want_glib == 'true')
1239 have = libglib.found() and libgobject.found() and libgio.found()
1246 conf.set10('HAVE_GLIB', have)
1248 want_dbus = get_option('dbus')
1249 if want_dbus != 'false' and not skip_deps
1250 libdbus = dependency('dbus-1',
1251 version : '>= 1.3.2',
1252 required : want_dbus == 'true')
1253 have = libdbus.found()
1258 conf.set10('HAVE_DBUS', have)
1260 default_dnssec = get_option('default-dnssec')
1262 default_dnssec = 'no'
1264 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1265 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1266 default_dnssec = 'no'
1268 conf.set('DEFAULT_DNSSEC_MODE',
1269 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1270 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1272 dns_over_tls = get_option('dns-over-tls')
1273 if dns_over_tls != 'false'
1274 if dns_over_tls == 'openssl'
1277 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1278 if dns_over_tls == 'gnutls' and not have_gnutls
1279 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1282 if dns_over_tls == 'gnutls' or have_gnutls
1283 have_openssl = false
1285 have_openssl = conf.get('HAVE_OPENSSL') == 1
1286 if dns_over_tls != 'auto' and not have_openssl
1287 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1288 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1291 have = have_gnutls or have_openssl
1295 have_openssl = false
1297 conf.set10('ENABLE_DNS_OVER_TLS', have)
1298 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1299 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1301 default_dns_over_tls = get_option('default-dns-over-tls')
1303 default_dns_over_tls = 'no'
1305 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1306 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.')
1307 default_dns_over_tls = 'no'
1309 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1310 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1311 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1313 default_mdns = get_option('default-mdns')
1314 conf.set('DEFAULT_MDNS_MODE',
1315 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1316 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1318 default_llmnr = get_option('default-llmnr')
1319 conf.set('DEFAULT_LLMNR_MODE',
1320 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1321 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1323 want_repart = get_option('repart')
1324 if want_repart != 'false'
1325 have = (conf.get('HAVE_OPENSSL') == 1 and
1326 conf.get('HAVE_LIBFDISK') == 1)
1327 if want_repart == 'true' and not have
1328 error('repart support was requested, but dependencies are not available')
1333 conf.set10('ENABLE_REPART', have)
1335 want_importd = get_option('importd')
1336 if want_importd != 'false'
1337 have = (conf.get('HAVE_LIBCURL') == 1 and
1338 conf.get('HAVE_ZLIB') == 1 and
1339 conf.get('HAVE_XZ') == 1 and
1340 conf.get('HAVE_GCRYPT') == 1)
1341 if want_importd == 'true' and not have
1342 error('importd support was requested, but dependencies are not available')
1347 conf.set10('ENABLE_IMPORTD', have)
1349 want_homed = get_option('homed')
1350 if want_homed != 'false'
1351 have = (conf.get('HAVE_OPENSSL') == 1 and
1352 conf.get('HAVE_LIBFDISK') == 1 and
1353 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1354 if want_homed == 'true' and not have
1355 error('homed support was requested, but dependencies are not available')
1360 conf.set10('ENABLE_HOMED', have)
1362 have = have and conf.get('HAVE_PAM') == 1
1363 conf.set10('ENABLE_PAM_HOME', have)
1365 want_remote = get_option('remote')
1366 if want_remote != 'false'
1367 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1368 conf.get('HAVE_LIBCURL') == 1]
1369 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1370 # it's possible to build one without the other. Complain only if
1371 # support was explicitly requested. The auxiliary files like sysusers
1372 # config should be installed when any of the programs are built.
1373 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1374 error('remote support was requested, but dependencies are not available')
1376 have = have_deps[0] or have_deps[1]
1380 conf.set10('ENABLE_REMOTE', have)
1382 foreach term : ['utmp',
1416 have = get_option(term)
1417 name = 'ENABLE_' + term.underscorify().to_upper()
1418 conf.set10(name, have)
1421 foreach tuple : [['nss-mymachines', 'machined'],
1422 ['nss-resolve', 'resolve']]
1423 want = get_option(tuple[0])
1425 have = get_option(tuple[1])
1426 if want == 'true' and not have
1427 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1432 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1433 conf.set10(name, have)
1437 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1438 'ENABLE_NSS_MYMACHINES',
1439 'ENABLE_NSS_RESOLVE',
1440 'ENABLE_NSS_SYSTEMD']
1441 if conf.get(term) == 1
1445 conf.set10('ENABLE_NSS', enable_nss)
1447 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1452 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1454 #####################################################################
1456 if get_option('efi')
1457 efi_arch = host_machine.cpu_family()
1459 if efi_arch == 'x86'
1460 EFI_MACHINE_TYPE_NAME = 'ia32'
1461 gnu_efi_arch = 'ia32'
1462 elif efi_arch == 'x86_64'
1463 EFI_MACHINE_TYPE_NAME = 'x64'
1464 gnu_efi_arch = 'x86_64'
1465 elif efi_arch == 'arm'
1466 EFI_MACHINE_TYPE_NAME = 'arm'
1467 gnu_efi_arch = 'arm'
1468 elif efi_arch == 'aarch64'
1469 EFI_MACHINE_TYPE_NAME = 'aa64'
1470 gnu_efi_arch = 'aarch64'
1472 EFI_MACHINE_TYPE_NAME = ''
1477 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1479 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1483 conf.set10('ENABLE_EFI', have)
1485 #####################################################################
1487 config_h = configure_file(
1488 output : 'config.h',
1489 configuration : conf)
1491 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1493 includes = include_directories('src/basic',
1499 'src/journal-remote',
1503 'src/time-wait-sync',
1509 'src/libsystemd/sd-bus',
1510 'src/libsystemd/sd-device',
1511 'src/libsystemd/sd-event',
1512 'src/libsystemd/sd-hwdb',
1513 'src/libsystemd/sd-id128',
1514 'src/libsystemd/sd-netlink',
1515 'src/libsystemd/sd-network',
1516 'src/libsystemd/sd-resolve',
1517 'src/libsystemd-network',
1520 add_project_arguments('-include', 'config.h', language : 'c')
1522 generate_gperfs = find_program('tools/generate-gperfs.py')
1526 subdir('src/systemd')
1528 subdir('src/libsystemd')
1529 subdir('src/libsystemd-network')
1530 subdir('src/journal')
1533 libjournal_core = static_library(
1535 libjournal_core_sources,
1537 include_directories : includes,
1540 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1541 libsystemd = shared_library(
1544 version : libsystemd_version,
1545 include_directories : includes,
1546 link_args : ['-shared',
1547 '-Wl,--version-script=' + libsystemd_sym_path],
1548 link_with : [libbasic,
1550 link_whole : [libsystemd_static,
1552 dependencies : [threads,
1557 link_depends : libsystemd_sym,
1559 install_dir : rootlibdir)
1561 static_libsystemd = get_option('static-libsystemd')
1562 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1564 install_libsystemd_static = static_library(
1567 journal_client_sources,
1569 basic_gcrypt_sources,
1571 include_directories : includes,
1572 build_by_default : static_libsystemd != 'false',
1573 install : static_libsystemd != 'false',
1574 install_dir : rootlibdir,
1575 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1576 dependencies : [threads,
1586 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1588 # Generate autosuspend rules
1589 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1591 ############################################################
1593 # binaries that have --help and are intended for use by humans,
1594 # usually, but not always, installed in /bin.
1595 public_programs = []
1597 subdir('src/libudev')
1598 subdir('src/shared')
1600 subdir('src/shutdown')
1602 subdir('src/network')
1604 subdir('src/analyze')
1605 subdir('src/journal-remote')
1606 subdir('src/coredump')
1607 subdir('src/pstore')
1608 subdir('src/hostname')
1609 subdir('src/import')
1610 subdir('src/partition')
1611 subdir('src/kernel-install')
1612 subdir('src/locale')
1613 subdir('src/machine')
1614 subdir('src/portable')
1615 subdir('src/userdb')
1617 subdir('src/nspawn')
1618 subdir('src/resolve')
1619 subdir('src/timedate')
1620 subdir('src/timesync')
1621 subdir('src/vconsole')
1622 subdir('src/boot/efi')
1629 ############################################################
1631 # only static linking apart from libdl, to make sure that the
1632 # module is linked to all libraries that it uses.
1633 test_dlopen = executable(
1637 include_directories : includes,
1638 link_with : [libbasic],
1639 dependencies : [libdl],
1640 build_by_default : want_tests != 'false')
1642 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1643 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1644 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1645 ['resolve', 'ENABLE_NSS_RESOLVE']]
1647 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1651 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1652 version_script_arg = join_paths(project_source_root, sym)
1654 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1655 if tuple.length() > 2
1656 sources += tuple[2].split()
1659 nss = shared_library(
1664 include_directories : includes,
1665 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1666 link_args : ['-Wl,-z,nodelete',
1668 '-Wl,--version-script=' + version_script_arg],
1669 link_with : [libsystemd_static,
1672 dependencies : [threads,
1676 install_dir : rootlibdir)
1678 # We cannot use shared_module because it does not support version suffix.
1679 # Unfortunately shared_library insists on creating the symlink…
1680 meson.add_install_script('sh', '-c',
1681 'rm $DESTDIR@0@/libnss_@1@.so'
1682 .format(rootlibdir, module))
1684 if want_tests != 'false'
1685 test('dlopen-nss_' + module,
1687 # path to dlopen must include a slash
1688 args : nss.full_path())
1693 ############################################################
1698 include_directories : includes,
1699 link_with : [libcore,
1701 dependencies : [versiondep,
1708 install_rpath : rootlibexecdir,
1710 install_dir : rootlibexecdir)
1712 meson.add_install_script(meson_make_symlink,
1713 join_paths(rootlibexecdir, 'systemd'),
1714 join_paths(rootsbindir, 'init'))
1716 public_programs += executable(
1718 systemd_analyze_sources,
1719 include_directories : includes,
1720 link_with : [libcore,
1722 dependencies : [versiondep,
1729 install_rpath : rootlibexecdir,
1730 install : get_option('analyze'))
1734 systemd_journald_sources,
1735 include_directories : includes,
1736 link_with : [libjournal_core,
1738 dependencies : [threads,
1743 install_rpath : rootlibexecdir,
1745 install_dir : rootlibexecdir)
1747 public_programs += executable(
1749 systemd_cat_sources,
1750 include_directories : includes,
1751 link_with : [libjournal_core,
1753 dependencies : [threads],
1754 install_rpath : rootlibexecdir,
1757 public_programs += executable(
1760 include_directories : includes,
1761 link_with : [libshared],
1762 dependencies : [threads,
1768 install_rpath : rootlibexecdir,
1770 install_dir : rootbindir)
1773 'systemd-getty-generator',
1774 'src/getty-generator/getty-generator.c',
1775 include_directories : includes,
1776 link_with : [libshared],
1777 install_rpath : rootlibexecdir,
1779 install_dir : systemgeneratordir)
1782 'systemd-debug-generator',
1783 'src/debug-generator/debug-generator.c',
1784 include_directories : includes,
1785 link_with : [libshared],
1786 install_rpath : rootlibexecdir,
1788 install_dir : systemgeneratordir)
1791 'systemd-run-generator',
1792 'src/run-generator/run-generator.c',
1793 include_directories : includes,
1794 link_with : [libshared],
1795 install_rpath : rootlibexecdir,
1797 install_dir : systemgeneratordir)
1800 'systemd-fstab-generator',
1801 'src/fstab-generator/fstab-generator.c',
1802 include_directories : includes,
1803 link_with : [libcore_shared,
1805 install_rpath : rootlibexecdir,
1807 install_dir : systemgeneratordir)
1809 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1811 '30-systemd-environment-d-generator',
1812 'src/environment-d-generator/environment-d-generator.c',
1813 include_directories : includes,
1814 link_with : [libshared],
1815 install_rpath : rootlibexecdir,
1817 install_dir : userenvgeneratordir)
1819 meson.add_install_script(meson_make_symlink,
1820 join_paths(sysconfdir, 'environment'),
1821 join_paths(environmentdir, '99-environment.conf'))
1824 if conf.get('ENABLE_HIBERNATE') == 1
1826 'systemd-hibernate-resume-generator',
1827 'src/hibernate-resume/hibernate-resume-generator.c',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 install_rpath : rootlibexecdir,
1832 install_dir : systemgeneratordir)
1835 'systemd-hibernate-resume',
1836 'src/hibernate-resume/hibernate-resume.c',
1837 include_directories : includes,
1838 link_with : [libshared],
1839 install_rpath : rootlibexecdir,
1841 install_dir : rootlibexecdir)
1844 if conf.get('HAVE_BLKID') == 1
1846 'systemd-gpt-auto-generator',
1847 'src/gpt-auto-generator/gpt-auto-generator.c',
1848 'src/shared/blkid-util.h',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 dependencies : libblkid,
1852 install_rpath : rootlibexecdir,
1854 install_dir : systemgeneratordir)
1856 public_programs += executable(
1858 'src/dissect/dissect.c',
1859 include_directories : includes,
1860 link_with : [libshared],
1861 install_rpath : rootlibexecdir,
1863 install_dir : rootlibexecdir)
1866 if conf.get('ENABLE_RESOLVE') == 1
1869 systemd_resolved_sources,
1870 include_directories : includes,
1871 link_with : [libshared,
1873 libsystemd_resolve_core],
1874 dependencies : systemd_resolved_dependencies,
1875 install_rpath : rootlibexecdir,
1877 install_dir : rootlibexecdir)
1879 public_programs += executable(
1882 include_directories : includes,
1883 link_with : [libshared,
1885 libsystemd_resolve_core],
1886 dependencies : [threads,
1890 install_rpath : rootlibexecdir,
1893 meson.add_install_script(meson_make_symlink,
1894 join_paths(bindir, 'resolvectl'),
1895 join_paths(rootsbindir, 'resolvconf'))
1897 meson.add_install_script(meson_make_symlink,
1898 join_paths(bindir, 'resolvectl'),
1899 join_paths(bindir, 'systemd-resolve'))
1902 if conf.get('ENABLE_LOGIND') == 1
1905 systemd_logind_sources,
1906 include_directories : includes,
1907 link_with : [liblogind_core,
1909 dependencies : [threads,
1911 install_rpath : rootlibexecdir,
1913 install_dir : rootlibexecdir)
1915 public_programs += executable(
1918 include_directories : includes,
1919 link_with : [libshared],
1920 dependencies : [threads,
1924 install_rpath : rootlibexecdir,
1926 install_dir : rootbindir)
1928 public_programs += executable(
1930 'src/login/inhibit.c',
1931 include_directories : includes,
1932 link_with : [libshared],
1933 install_rpath : rootlibexecdir,
1935 install_dir : rootbindir)
1937 if conf.get('HAVE_PAM') == 1
1938 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1939 pam_systemd = shared_library(
1943 include_directories : includes,
1944 link_args : ['-shared',
1945 '-Wl,--version-script=' + version_script_arg],
1946 link_with : [libsystemd_static,
1948 dependencies : [threads,
1951 link_depends : pam_systemd_sym,
1953 install_dir : pamlibdir)
1955 if want_tests != 'false'
1956 test('dlopen-pam_systemd',
1958 # path to dlopen must include a slash
1959 args : pam_systemd.full_path())
1964 'systemd-user-runtime-dir',
1965 user_runtime_dir_sources,
1966 include_directories : includes,
1967 link_with : [libshared],
1968 install_rpath : rootlibexecdir,
1970 install_dir : rootlibexecdir)
1973 if conf.get('HAVE_PAM') == 1
1975 'systemd-user-sessions',
1976 'src/user-sessions/user-sessions.c',
1977 include_directories : includes,
1978 link_with : [libshared],
1979 install_rpath : rootlibexecdir,
1981 install_dir : rootlibexecdir)
1984 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1985 public_programs += executable(
1987 'src/boot/bootctl.c',
1988 include_directories : includes,
1989 link_with : [libshared],
1990 dependencies : [libblkid],
1991 install_rpath : rootlibexecdir,
1994 public_programs += executable(
1995 'systemd-bless-boot',
1996 'src/boot/bless-boot.c',
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : [libblkid],
2000 install_rpath : rootlibexecdir,
2002 install_dir : rootlibexecdir)
2005 'systemd-bless-boot-generator',
2006 'src/boot/bless-boot-generator.c',
2007 include_directories : includes,
2008 link_with : [libshared],
2009 install_rpath : rootlibexecdir,
2011 install_dir : systemgeneratordir)
2015 'systemd-boot-check-no-failures',
2016 'src/boot/boot-check-no-failures.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : [libblkid],
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootlibexecdir)
2024 public_programs += executable(
2025 'systemd-socket-activate',
2026 'src/activate/activate.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 dependencies : [threads],
2030 install_rpath : rootlibexecdir,
2033 if get_option('link-systemctl-shared')
2034 systemctl_link_with = [libshared]
2036 systemctl_link_with = [libsystemd_static,
2042 public_programs += executable(
2044 'src/systemctl/systemctl.c',
2045 'src/systemctl/sysv-compat.h',
2046 'src/systemctl/sysv-compat.c',
2047 include_directories : includes,
2048 link_with : systemctl_link_with,
2049 dependencies : [threads,
2055 install_rpath : rootlibexecdir,
2057 install_dir : rootbindir)
2059 if conf.get('ENABLE_PORTABLED') == 1
2061 'systemd-portabled',
2062 systemd_portabled_sources,
2063 include_directories : includes,
2064 link_with : [libshared],
2065 dependencies : [threads],
2066 install_rpath : rootlibexecdir,
2068 install_dir : rootlibexecdir)
2070 public_programs += executable(
2072 'src/portable/portablectl.c',
2073 include_directories : includes,
2074 link_with : [libshared],
2075 dependencies : [threads],
2076 install_rpath : rootlibexecdir,
2078 install_dir : rootbindir)
2081 if conf.get('ENABLE_USERDB') == 1
2084 systemd_userwork_sources,
2085 include_directories : includes,
2086 link_with : [libshared],
2087 dependencies : [threads],
2088 install_rpath : rootlibexecdir,
2090 install_dir : rootlibexecdir)
2094 systemd_userdbd_sources,
2095 include_directories : includes,
2096 link_with : [libshared],
2097 dependencies : [threads],
2098 install_rpath : rootlibexecdir,
2100 install_dir : rootlibexecdir)
2102 public_programs += executable(
2105 include_directories : includes,
2106 link_with : [libshared],
2107 dependencies : [threads],
2108 install_rpath : rootlibexecdir,
2110 install_dir : rootbindir)
2113 if conf.get('ENABLE_HOMED') == 1
2116 systemd_homework_sources,
2117 include_directories : includes,
2118 link_with : [libshared],
2119 dependencies : [threads,
2126 install_rpath : rootlibexecdir,
2128 install_dir : rootlibexecdir)
2132 systemd_homed_sources,
2133 include_directories : includes,
2134 link_with : [libshared],
2135 dependencies : [threads,
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2143 public_programs += executable(
2146 include_directories : includes,
2147 link_with : [libshared],
2148 dependencies : [threads,
2153 install_rpath : rootlibexecdir,
2155 install_dir : rootbindir)
2157 if conf.get('HAVE_PAM') == 1
2158 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2159 pam_systemd = shared_library(
2163 include_directories : includes,
2164 link_args : ['-shared',
2165 '-Wl,--version-script=' + version_script_arg],
2166 link_with : [libsystemd_static,
2168 dependencies : [threads,
2172 link_depends : pam_systemd_home_sym,
2174 install_dir : pamlibdir)
2178 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2179 meson.add_install_script(meson_make_symlink,
2180 join_paths(rootbindir, 'systemctl'),
2181 join_paths(rootsbindir, alias))
2184 if conf.get('ENABLE_BACKLIGHT') == 1
2186 'systemd-backlight',
2187 'src/backlight/backlight.c',
2188 include_directories : includes,
2189 link_with : [libshared],
2190 install_rpath : rootlibexecdir,
2192 install_dir : rootlibexecdir)
2195 if conf.get('ENABLE_RFKILL') == 1
2198 'src/rfkill/rfkill.c',
2199 include_directories : includes,
2200 link_with : [libshared],
2201 install_rpath : rootlibexecdir,
2203 install_dir : rootlibexecdir)
2207 'systemd-system-update-generator',
2208 'src/system-update-generator/system-update-generator.c',
2209 include_directories : includes,
2210 link_with : [libshared],
2211 install_rpath : rootlibexecdir,
2213 install_dir : systemgeneratordir)
2215 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2216 systemd_cryptsetup_sources = files('''
2217 src/cryptsetup/cryptsetup.c
2218 src/cryptsetup/cryptsetup-pkcs11.h
2221 if conf.get('HAVE_P11KIT') == 1
2222 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2226 'systemd-cryptsetup',
2227 systemd_cryptsetup_sources,
2228 include_directories : includes,
2229 link_with : [libshared],
2230 dependencies : [libcryptsetup,
2232 install_rpath : rootlibexecdir,
2234 install_dir : rootlibexecdir)
2237 'systemd-cryptsetup-generator',
2238 'src/cryptsetup/cryptsetup-generator.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 dependencies : [libcryptsetup],
2242 install_rpath : rootlibexecdir,
2244 install_dir : systemgeneratordir)
2247 'systemd-veritysetup',
2248 'src/veritysetup/veritysetup.c',
2249 include_directories : includes,
2250 link_with : [libshared],
2251 dependencies : [libcryptsetup],
2252 install_rpath : rootlibexecdir,
2254 install_dir : rootlibexecdir)
2257 'systemd-veritysetup-generator',
2258 'src/veritysetup/veritysetup-generator.c',
2259 include_directories : includes,
2260 link_with : [libshared],
2261 dependencies : [libcryptsetup],
2262 install_rpath : rootlibexecdir,
2264 install_dir : systemgeneratordir)
2267 if conf.get('HAVE_SYSV_COMPAT') == 1
2269 'systemd-sysv-generator',
2270 'src/sysv-generator/sysv-generator.c',
2271 include_directories : includes,
2272 link_with : [libshared],
2273 install_rpath : rootlibexecdir,
2275 install_dir : systemgeneratordir)
2278 'systemd-rc-local-generator',
2279 'src/rc-local-generator/rc-local-generator.c',
2280 include_directories : includes,
2281 link_with : [libshared],
2282 install_rpath : rootlibexecdir,
2284 install_dir : systemgeneratordir)
2287 if conf.get('ENABLE_HOSTNAMED') == 1
2289 'systemd-hostnamed',
2290 'src/hostname/hostnamed.c',
2291 include_directories : includes,
2292 link_with : [libshared],
2293 install_rpath : rootlibexecdir,
2295 install_dir : rootlibexecdir)
2297 public_programs += executable(
2299 'src/hostname/hostnamectl.c',
2300 include_directories : includes,
2301 link_with : [libshared],
2302 install_rpath : rootlibexecdir,
2306 if conf.get('ENABLE_LOCALED') == 1
2307 if conf.get('HAVE_XKBCOMMON') == 1
2308 # logind will load libxkbcommon.so dynamically on its own
2316 systemd_localed_sources,
2317 include_directories : includes,
2318 link_with : [libshared],
2319 dependencies : deps,
2320 install_rpath : rootlibexecdir,
2322 install_dir : rootlibexecdir)
2324 public_programs += executable(
2327 include_directories : includes,
2328 link_with : [libshared],
2329 install_rpath : rootlibexecdir,
2333 if conf.get('ENABLE_TIMEDATED') == 1
2335 'systemd-timedated',
2336 'src/timedate/timedated.c',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2341 install_dir : rootlibexecdir)
2344 if conf.get('ENABLE_TIMEDATECTL') == 1
2345 public_programs += executable(
2347 'src/timedate/timedatectl.c',
2348 include_directories : includes,
2349 install_rpath : rootlibexecdir,
2350 link_with : [libshared],
2351 dependencies : [libm],
2355 if conf.get('ENABLE_TIMESYNCD') == 1
2356 if get_option('link-timesyncd-shared')
2357 timesyncd_link_with = [libshared]
2359 timesyncd_link_with = [libsystemd_static,
2366 'systemd-timesyncd',
2367 systemd_timesyncd_sources,
2368 include_directories : includes,
2369 link_with : [timesyncd_link_with],
2370 dependencies : [threads,
2372 install_rpath : rootlibexecdir,
2374 install_dir : rootlibexecdir)
2377 'systemd-time-wait-sync',
2378 'src/time-wait-sync/time-wait-sync.c',
2379 include_directories : includes,
2380 link_with : [timesyncd_link_with],
2381 install_rpath : rootlibexecdir,
2383 install_dir : rootlibexecdir)
2386 if conf.get('ENABLE_MACHINED') == 1
2389 systemd_machined_sources,
2390 include_directories : includes,
2391 link_with : [libmachine_core,
2393 install_rpath : rootlibexecdir,
2395 install_dir : rootlibexecdir)
2397 public_programs += executable(
2399 'src/machine/machinectl.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 dependencies : [threads,
2406 install_rpath : rootlibexecdir,
2408 install_dir : rootbindir)
2411 if conf.get('ENABLE_IMPORTD') == 1
2414 systemd_importd_sources,
2415 include_directories : includes,
2416 link_with : [libshared],
2417 dependencies : [threads],
2418 install_rpath : rootlibexecdir,
2420 install_dir : rootlibexecdir)
2422 systemd_pull = executable(
2424 systemd_pull_sources,
2425 include_directories : includes,
2426 link_with : [libshared],
2427 dependencies : [versiondep,
2433 install_rpath : rootlibexecdir,
2435 install_dir : rootlibexecdir)
2437 systemd_import = executable(
2439 systemd_import_sources,
2440 include_directories : includes,
2441 link_with : [libshared],
2442 dependencies : [libcurl,
2446 install_rpath : rootlibexecdir,
2448 install_dir : rootlibexecdir)
2450 systemd_import_fs = executable(
2451 'systemd-import-fs',
2452 systemd_import_fs_sources,
2453 include_directories : includes,
2454 link_with : [libshared],
2455 install_rpath : rootlibexecdir,
2457 install_dir : rootlibexecdir)
2459 systemd_export = executable(
2461 systemd_export_sources,
2462 include_directories : includes,
2463 link_with : [libshared],
2464 dependencies : [libcurl,
2468 install_rpath : rootlibexecdir,
2470 install_dir : rootlibexecdir)
2472 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2475 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2476 public_programs += executable(
2477 'systemd-journal-upload',
2478 systemd_journal_upload_sources,
2479 include_directories : includes,
2480 link_with : [libshared],
2481 dependencies : [versiondep,
2488 install_rpath : rootlibexecdir,
2490 install_dir : rootlibexecdir)
2493 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2494 public_programs += executable(
2495 'systemd-journal-remote',
2496 systemd_journal_remote_sources,
2497 include_directories : includes,
2498 link_with : [libshared,
2499 libsystemd_journal_remote],
2500 dependencies : [threads,
2506 install_rpath : rootlibexecdir,
2508 install_dir : rootlibexecdir)
2510 public_programs += executable(
2511 'systemd-journal-gatewayd',
2512 systemd_journal_gatewayd_sources,
2513 include_directories : includes,
2514 link_with : [libshared],
2515 dependencies : [threads,
2521 install_rpath : rootlibexecdir,
2523 install_dir : rootlibexecdir)
2526 if conf.get('ENABLE_COREDUMP') == 1
2529 systemd_coredump_sources,
2530 include_directories : includes,
2531 link_with : [libshared],
2532 dependencies : [threads,
2538 install_rpath : rootlibexecdir,
2540 install_dir : rootlibexecdir)
2542 public_programs += executable(
2544 coredumpctl_sources,
2545 include_directories : includes,
2546 link_with : [libshared],
2547 dependencies : [threads,
2551 install_rpath : rootlibexecdir,
2555 if conf.get('ENABLE_PSTORE') == 1
2558 systemd_pstore_sources,
2559 include_directories : includes,
2560 link_with : [libshared],
2561 dependencies : [threads,
2567 install_rpath : rootlibexecdir,
2569 install_dir : rootlibexecdir)
2572 if conf.get('ENABLE_BINFMT') == 1
2573 public_programs += executable(
2575 'src/binfmt/binfmt.c',
2576 include_directories : includes,
2577 link_with : [libshared],
2578 install_rpath : rootlibexecdir,
2580 install_dir : rootlibexecdir)
2582 meson.add_install_script('sh', '-c',
2583 mkdir_p.format(binfmtdir))
2584 meson.add_install_script('sh', '-c',
2585 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2588 if conf.get('ENABLE_REPART') == 1
2591 systemd_repart_sources,
2592 include_directories : includes,
2593 link_with : [libshared],
2594 dependencies : [threads,
2599 install_rpath : rootlibexecdir,
2601 install_dir : rootbindir)
2603 if want_tests != 'false'
2606 args : exe.full_path())
2610 if conf.get('ENABLE_VCONSOLE') == 1
2612 'systemd-vconsole-setup',
2613 'src/vconsole/vconsole-setup.c',
2614 include_directories : includes,
2615 link_with : [libshared],
2616 install_rpath : rootlibexecdir,
2618 install_dir : rootlibexecdir)
2621 if conf.get('ENABLE_RANDOMSEED') == 1
2623 'systemd-random-seed',
2624 'src/random-seed/random-seed.c',
2625 include_directories : includes,
2626 link_with : [libshared],
2627 install_rpath : rootlibexecdir,
2629 install_dir : rootlibexecdir)
2632 if conf.get('ENABLE_FIRSTBOOT') == 1
2634 'systemd-firstboot',
2635 'src/firstboot/firstboot.c',
2636 include_directories : includes,
2637 link_with : [libshared],
2638 dependencies : [libcrypt],
2639 install_rpath : rootlibexecdir,
2641 install_dir : rootbindir)
2645 'systemd-remount-fs',
2646 'src/remount-fs/remount-fs.c',
2647 include_directories : includes,
2648 link_with : [libcore_shared,
2650 install_rpath : rootlibexecdir,
2652 install_dir : rootlibexecdir)
2655 'systemd-machine-id-setup',
2656 'src/machine-id-setup/machine-id-setup-main.c',
2657 include_directories : includes,
2658 link_with : [libcore_shared,
2660 install_rpath : rootlibexecdir,
2662 install_dir : rootbindir)
2667 include_directories : includes,
2668 link_with : [libshared],
2669 install_rpath : rootlibexecdir,
2671 install_dir : rootlibexecdir)
2673 executable('systemd-growfs',
2674 'src/partition/growfs.c',
2675 include_directories : includes,
2676 link_with : [libshared],
2677 dependencies : [libcryptsetup],
2678 install_rpath : rootlibexecdir,
2680 install_dir : rootlibexecdir)
2684 'src/partition/makefs.c',
2685 include_directories : includes,
2686 link_with : [libshared],
2687 install_rpath : rootlibexecdir,
2689 install_dir : rootlibexecdir)
2693 'src/sleep/sleep.c',
2694 include_directories : includes,
2695 link_with : [libshared],
2696 install_rpath : rootlibexecdir,
2698 install_dir : rootlibexecdir)
2700 install_data('src/sleep/sleep.conf',
2701 install_dir : pkgsysconfdir)
2703 public_programs += executable(
2705 'src/sysctl/sysctl.c',
2706 include_directories : includes,
2707 link_with : [libshared],
2708 install_rpath : rootlibexecdir,
2710 install_dir : rootlibexecdir)
2714 'src/ac-power/ac-power.c',
2715 include_directories : includes,
2716 link_with : [libshared],
2717 install_rpath : rootlibexecdir,
2719 install_dir : rootlibexecdir)
2721 public_programs += executable(
2722 'systemd-detect-virt',
2723 'src/detect-virt/detect-virt.c',
2724 include_directories : includes,
2725 link_with : [libshared],
2726 install_rpath : rootlibexecdir,
2729 public_programs += executable(
2731 'src/delta/delta.c',
2732 include_directories : includes,
2733 link_with : [libshared],
2734 install_rpath : rootlibexecdir,
2737 public_programs += executable(
2739 'src/escape/escape.c',
2740 include_directories : includes,
2741 link_with : [libshared],
2742 install_rpath : rootlibexecdir,
2744 install_dir : rootbindir)
2746 public_programs += executable(
2748 'src/notify/notify.c',
2749 include_directories : includes,
2750 link_with : [libshared],
2751 install_rpath : rootlibexecdir,
2753 install_dir : rootbindir)
2756 'systemd-volatile-root',
2757 'src/volatile-root/volatile-root.c',
2758 include_directories : includes,
2759 link_with : [libshared],
2760 install_rpath : rootlibexecdir,
2762 install_dir : rootlibexecdir)
2765 'systemd-cgroups-agent',
2766 'src/cgroups-agent/cgroups-agent.c',
2767 include_directories : includes,
2768 link_with : [libshared],
2769 install_rpath : rootlibexecdir,
2771 install_dir : rootlibexecdir)
2773 public_programs += executable(
2775 'src/id128/id128.c',
2776 include_directories : includes,
2777 link_with : [libshared],
2778 install_rpath : rootlibexecdir,
2781 public_programs += executable(
2784 include_directories : includes,
2785 link_with : [libshared],
2786 install_rpath : rootlibexecdir,
2789 public_programs += executable(
2790 'systemd-ask-password',
2791 'src/ask-password/ask-password.c',
2792 include_directories : includes,
2793 link_with : [libshared],
2794 install_rpath : rootlibexecdir,
2796 install_dir : rootbindir)
2799 'systemd-reply-password',
2800 'src/reply-password/reply-password.c',
2801 include_directories : includes,
2802 link_with : [libshared],
2803 install_rpath : rootlibexecdir,
2805 install_dir : rootlibexecdir)
2807 public_programs += executable(
2808 'systemd-tty-ask-password-agent',
2809 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2810 include_directories : includes,
2811 link_with : [libshared],
2812 install_rpath : rootlibexecdir,
2814 install_dir : rootbindir)
2816 public_programs += executable(
2819 include_directories : includes,
2820 link_with : [libshared],
2821 install_rpath : rootlibexecdir,
2824 public_programs += executable(
2826 'src/cgtop/cgtop.c',
2827 include_directories : includes,
2828 link_with : [libshared],
2829 install_rpath : rootlibexecdir,
2834 'src/initctl/initctl.c',
2835 include_directories : includes,
2836 link_with : [libshared],
2837 install_rpath : rootlibexecdir,
2839 install_dir : rootlibexecdir)
2841 public_programs += executable(
2843 'src/mount/mount-tool.c',
2844 include_directories : includes,
2845 link_with : [libshared],
2846 dependencies: [libmount],
2847 install_rpath : rootlibexecdir,
2850 meson.add_install_script(meson_make_symlink,
2851 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2853 public_programs += executable(
2856 include_directories : includes,
2857 link_with : [libshared],
2858 install_rpath : rootlibexecdir,
2861 public_programs += executable(
2862 'systemd-stdio-bridge',
2863 'src/stdio-bridge/stdio-bridge.c',
2864 include_directories : includes,
2865 link_with : [libshared],
2866 dependencies : [versiondep],
2867 install_rpath : rootlibexecdir,
2870 public_programs += executable(
2872 'src/busctl/busctl.c',
2873 'src/busctl/busctl-introspect.c',
2874 'src/busctl/busctl-introspect.h',
2875 include_directories : includes,
2876 link_with : [libshared],
2877 install_rpath : rootlibexecdir,
2880 if conf.get('ENABLE_SYSUSERS') == 1
2881 public_programs += executable(
2883 'src/sysusers/sysusers.c',
2884 include_directories : includes,
2885 link_with : [libshared],
2886 install_rpath : rootlibexecdir,
2888 install_dir : rootbindir)
2891 if conf.get('ENABLE_TMPFILES') == 1
2894 'src/tmpfiles/tmpfiles.c',
2895 'src/tmpfiles/offline-passwd.c',
2896 'src/tmpfiles/offline-passwd.h',
2897 include_directories : includes,
2898 link_with : [libshared],
2899 dependencies : [libacl],
2900 install_rpath : rootlibexecdir,
2902 install_dir : rootbindir)
2903 public_programs += exe
2905 if want_tests != 'false'
2906 test('test-systemd-tmpfiles',
2907 test_systemd_tmpfiles_py,
2908 # https://github.com/mesonbuild/meson/issues/2681
2909 args : exe.full_path())
2913 if conf.get('ENABLE_HWDB') == 1
2914 public_programs += executable(
2917 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2918 include_directories : includes,
2919 link_with : [libudev_static],
2920 install_rpath : udev_rpath,
2922 install_dir : rootbindir)
2925 if conf.get('ENABLE_QUOTACHECK') == 1
2927 'systemd-quotacheck',
2928 'src/quotacheck/quotacheck.c',
2929 include_directories : includes,
2930 link_with : [libshared],
2931 install_rpath : rootlibexecdir,
2933 install_dir : rootlibexecdir)
2936 public_programs += executable(
2937 'systemd-socket-proxyd',
2938 'src/socket-proxy/socket-proxyd.c',
2939 include_directories : includes,
2940 link_with : [libshared],
2941 dependencies : [threads],
2942 install_rpath : rootlibexecdir,
2944 install_dir : rootlibexecdir)
2946 public_programs += executable(
2948 systemd_udevd_sources,
2949 include_directories : includes,
2950 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2951 link_with : [libudev_core,
2954 dependencies : [versiondep,
2960 install_rpath : udev_rpath,
2962 install_dir : rootlibexecdir)
2964 public_programs += executable(
2967 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2968 include_directories : includes,
2969 link_with : [libudev_core,
2972 dependencies : [versiondep,
2978 install_rpath : udev_rpath,
2980 install_dir : rootbindir)
2984 systemd_shutdown_sources,
2985 include_directories : includes,
2986 link_with : [libcore_shared,
2988 dependencies : [libmount],
2989 install_rpath : rootlibexecdir,
2991 install_dir : rootlibexecdir)
2994 'systemd-update-done',
2995 'src/update-done/update-done.c',
2996 include_directories : includes,
2997 link_with : [libshared],
2998 install_rpath : rootlibexecdir,
3000 install_dir : rootlibexecdir)
3003 'systemd-update-utmp',
3004 'src/update-utmp/update-utmp.c',
3005 include_directories : includes,
3006 link_with : [libshared],
3007 dependencies : [libaudit],
3008 install_rpath : rootlibexecdir,
3010 install_dir : rootlibexecdir)
3012 if conf.get('HAVE_KMOD') == 1
3014 'systemd-modules-load',
3015 'src/modules-load/modules-load.c',
3016 include_directories : includes,
3017 link_with : [libshared],
3018 dependencies : [libkmod],
3019 install_rpath : rootlibexecdir,
3021 install_dir : rootlibexecdir)
3023 meson.add_install_script('sh', '-c',
3024 mkdir_p.format(modulesloaddir))
3025 meson.add_install_script('sh', '-c',
3026 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3029 public_programs += executable(
3031 systemd_nspawn_sources,
3032 include_directories : includes,
3033 link_with : [libcore_shared,
3036 dependencies : [libblkid,
3038 install_rpath : rootlibexecdir,
3041 if conf.get('ENABLE_NETWORKD') == 1
3044 systemd_networkd_sources,
3045 include_directories : network_include_dir,
3046 link_with : [libnetworkd_core,
3049 networkd_link_with],
3050 dependencies : [threads],
3051 install_rpath : rootlibexecdir,
3053 install_dir : rootlibexecdir)
3056 'systemd-networkd-wait-online',
3057 systemd_networkd_wait_online_sources,
3058 include_directories : includes,
3059 link_with : [libnetworkd_core,
3060 networkd_link_with],
3061 install_rpath : rootlibexecdir,
3063 install_dir : rootlibexecdir)
3065 public_programs += executable(
3068 include_directories : includes,
3069 link_with : [libsystemd_network,
3070 networkd_link_with],
3071 install_rpath : rootlibexecdir,
3073 install_dir : rootbindir)
3076 'systemd-network-generator',
3077 network_generator_sources,
3078 include_directories : includes,
3079 link_with : [networkd_link_with],
3080 install_rpath : rootlibexecdir,
3082 install_dir : rootlibexecdir)
3084 if want_tests != 'false'
3085 test('test-network-generator-conversion',
3086 test_network_generator_conversion_sh,
3087 # https://github.com/mesonbuild/meson/issues/2681
3088 args : exe.full_path())
3093 'systemd-sulogin-shell',
3094 ['src/sulogin-shell/sulogin-shell.c'],
3095 include_directories : includes,
3096 link_with : [libshared],
3097 install_rpath : rootlibexecdir,
3099 install_dir : rootlibexecdir)
3101 ############################################################
3104 'systemd-runtest.env',
3105 output : 'systemd-runtest.env',
3106 command : ['sh', '-c', '{ ' +
3107 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3108 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3110 build_by_default : true)
3112 foreach tuple : tests
3114 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3115 dependencies = tuple[2]
3116 condition = tuple.length() >= 4 ? tuple[3] : ''
3117 type = tuple.length() >= 5 ? tuple[4] : ''
3118 defs = tuple.length() >= 6 ? tuple[5] : []
3119 incs = tuple.length() >= 7 ? tuple[6] : includes
3122 name = sources[0].split('/')[-1].split('.')[0]
3123 if type.startswith('timeout=')
3124 timeout = type.split('=')[1].to_int()
3128 if condition == '' or conf.get(condition) == 1
3132 include_directories : incs,
3133 link_with : link_with,
3134 dependencies : [versiondep,
3137 build_by_default : want_tests != 'false',
3138 install_rpath : rootlibexecdir,
3139 install : install_tests,
3140 install_dir : join_paths(testsdir, type))
3143 message('@0@ is a manual test'.format(name))
3144 elif type == 'unsafe' and want_tests != 'unsafe'
3145 message('@0@ is an unsafe test'.format(name))
3146 elif want_tests != 'false'
3152 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3157 'test-libsystemd-sym',
3158 test_libsystemd_sym_c,
3159 include_directories : includes,
3160 link_with : [libsystemd],
3161 build_by_default : want_tests != 'false',
3162 install : install_tests,
3163 install_dir : testsdir)
3164 if want_tests != 'false'
3165 test('test-libsystemd-sym', exe)
3169 'test-libsystemd-static-sym',
3170 test_libsystemd_sym_c,
3171 include_directories : includes,
3172 link_with : [install_libsystemd_static],
3173 dependencies : [threads], # threads is already included in dependencies on the library,
3174 # but does not seem to get propagated. Add here as a work-around.
3175 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3176 install : install_tests and static_libsystemd_pic,
3177 install_dir : testsdir)
3178 if want_tests != 'false' and static_libsystemd_pic
3179 test('test-libsystemd-static-sym', exe)
3185 include_directories : includes,
3186 c_args : '-Wno-deprecated-declarations',
3187 link_with : [libudev],
3188 build_by_default : want_tests != 'false',
3189 install : install_tests,
3190 install_dir : testsdir)
3191 if want_tests != 'false'
3192 test('test-libudev-sym', exe)
3196 'test-libudev-static-sym',
3198 include_directories : includes,
3199 c_args : '-Wno-deprecated-declarations',
3200 link_with : [install_libudev_static],
3201 build_by_default : want_tests != 'false' and static_libudev_pic,
3202 install : install_tests and static_libudev_pic,
3203 install_dir : testsdir)
3204 if want_tests != 'false' and static_libudev_pic
3205 test('test-libudev-static-sym', exe)
3208 ############################################################
3212 if get_option('tests') != 'false'
3213 foreach tuple : fuzzers
3215 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3216 dependencies = tuple[2]
3217 defs = tuple.length() >= 4 ? tuple[3] : []
3218 incs = tuple.length() >= 5 ? tuple[4] : includes
3222 dependencies += fuzzing_engine
3224 if fuzzing_engine.found()
3225 dependencies += fuzzing_engine
3227 link_args += ['-fsanitize=fuzzer']
3230 sources += 'src/fuzz/fuzz-main.c'
3233 name = sources[0].split('/')[-1].split('.')[0]
3235 fuzzer_exes += executable(
3238 include_directories : [incs, include_directories('src/fuzz')],
3239 link_with : link_with,
3240 dependencies : dependencies,
3242 link_args: link_args,
3249 depends : fuzzer_exes,
3252 ############################################################
3254 make_directive_index_py = find_program('tools/make-directive-index.py')
3255 make_man_index_py = find_program('tools/make-man-index.py')
3256 xml_helper_py = find_program('tools/xml_helper.py')
3257 hwdb_update_sh = find_program('tools/hwdb-update.sh')
3258 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
3261 subdir('sysusers.d')
3262 subdir('tmpfiles.d')
3268 subdir('shell-completion/bash')
3269 subdir('shell-completion/zsh')
3270 subdir('docs/sysvinit')
3271 subdir('docs/var-log')
3273 install_subdir('factory/etc',
3274 install_dir : factorydir)
3276 install_data('xorg/50-systemd-user.sh',
3277 install_dir : xinitrcdir)
3278 install_data('modprobe.d/systemd.conf',
3279 install_dir : modprobedir)
3280 install_data('LICENSE.GPL2',
3284 'docs/CODING_STYLE.md',
3285 'docs/DISTRO_PORTING.md',
3286 'docs/ENVIRONMENT.md',
3288 'docs/TRANSIENT-SETTINGS.md',
3289 'docs/TRANSLATORS.md',
3290 'docs/UIDS-GIDS.md',
3291 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3292 install_dir : docdir)
3294 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3295 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3297 ############################################################
3299 check_help = find_program('tools/check-help.sh')
3301 foreach exec : public_programs
3302 name = exec.full_path().split('/')[-1]
3303 if want_tests != 'false'
3304 test('check-help-' + name,
3306 args : exec.full_path())
3310 ############################################################
3312 check_directives_sh = find_program('tools/check-directives.sh')
3314 if want_tests != 'false'
3315 test('check-directives',
3316 check_directives_sh,
3317 args : project_source_root)
3320 ############################################################
3322 # Enable tests for all supported sanitizers
3323 foreach tuple : sanitizers
3324 sanitizer = tuple[0]
3327 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3329 foreach p : fuzz_regression_tests
3330 b = p.split('/')[-2]
3331 c = p.split('/')[-1]
3333 name = '@0@:@1@'.format(b, sanitizer)
3336 if want_tests == 'false'
3337 message('Not compiling @0@ because tests is set to false'.format(name))
3339 exe = custom_target(
3343 command : [env, 'ln', '-fs',
3344 join_paths(build.full_path(), b),
3346 build_by_default : true)
3348 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3353 if want_tests != 'false' and slow_tests
3354 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3356 args : [exe.full_path(),
3357 join_paths(project_source_root, p)])
3364 ############################################################
3367 all_files = run_command(
3369 ['--git-dir=@0@/.git'.format(project_source_root),
3372 all_files = files(all_files.stdout().split())
3377 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3380 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3384 git_contrib_sh = find_program('tools/git-contrib.sh')
3387 command : [git_contrib_sh])
3391 git_head = run_command(
3393 ['--git-dir=@0@/.git'.format(project_source_root),
3394 'rev-parse', 'HEAD']).stdout().strip()
3395 git_head_short = run_command(
3397 ['--git-dir=@0@/.git'.format(project_source_root),
3398 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3402 command : ['git', 'archive',
3403 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3405 '--prefix', 'systemd-@0@/'.format(git_head),
3409 ############################################################
3411 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3414 depends : [man, libsystemd, libudev],
3415 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3417 ############################################################
3418 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3421 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3423 'split /usr: @0@'.format(split_usr),
3424 'split bin-sbin: @0@'.format(split_bin),
3425 'prefix directory: @0@'.format(prefixdir),
3426 'rootprefix directory: @0@'.format(rootprefixdir),
3427 'sysconf directory: @0@'.format(sysconfdir),
3428 'include directory: @0@'.format(includedir),
3429 'lib directory: @0@'.format(libdir),
3430 'rootlib directory: @0@'.format(rootlibdir),
3431 'SysV init scripts: @0@'.format(sysvinit_path),
3432 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3433 'PAM modules directory: @0@'.format(pamlibdir),
3434 'PAM configuration directory: @0@'.format(pamconfdir),
3435 'RPM macros directory: @0@'.format(rpmmacrosdir),
3436 'modprobe.d directory: @0@'.format(modprobedir),
3437 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3438 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3439 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3440 'bash completions directory: @0@'.format(bashcompletiondir),
3441 'zsh completions directory: @0@'.format(zshcompletiondir),
3442 'extra start script: @0@'.format(get_option('rc-local')),
3443 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3444 get_option('debug-tty')),
3445 'TTY GID: @0@'.format(tty_gid),
3446 'users GID: @0@'.format(substs.get('USERS_GID')),
3447 'maximum system UID: @0@'.format(system_uid_max),
3448 'maximum system GID: @0@'.format(system_gid_max),
3449 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3450 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3451 'minimum container UID base: @0@'.format(container_uid_base_min),
3452 'maximum container UID base: @0@'.format(container_uid_base_max),
3453 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3454 'render group access mode: @0@'.format(get_option('group-render-mode')),
3455 'certificate root directory: @0@'.format(get_option('certificate-root')),
3456 'support URL: @0@'.format(support_url),
3457 'nobody user name: @0@'.format(nobody_user),
3458 'nobody group name: @0@'.format(nobody_group),
3459 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3460 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3462 'default DNSSEC mode: @0@'.format(default_dnssec),
3463 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3464 'default mDNS mode: @0@'.format(default_mdns),
3465 'default LLMNR mode: @0@'.format(default_llmnr),
3466 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3467 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3468 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3469 'default locale: @0@'.format(default_locale),
3470 'default user $PATH: @0@'.format(default_user_path_display),
3471 'systemd service watchdog: @0@'.format(watchdog_opt)]
3473 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3474 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3476 'default DNS servers: @0@'.format(alt_dns_servers),
3477 'default NTP servers: @0@'.format(alt_ntp_servers)]
3479 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3480 '@@0@'.format(time_epoch)).stdout().strip()
3482 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3485 'static libsystemd: @0@'.format(static_libsystemd),
3486 'static libudev: @0@'.format(static_libudev)]
3489 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3490 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3491 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3493 if conf.get('ENABLE_EFI') == 1
3494 status += 'efi arch: @0@'.format(efi_arch)
3498 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3499 'EFI CC @0@'.format(' '.join(efi_cc)),
3500 'EFI lds: @0@'.format(efi_lds),
3501 'EFI crt0: @0@'.format(efi_crt0),
3502 'EFI include directory: @0@'.format(efi_incdir)]
3561 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3562 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3566 ['legacy pkla', install_polkit_pkla],
3568 ['gnu-efi', have_gnu_efi],
3581 ['man pages', want_man],
3582 ['html pages', want_html],
3583 ['man page indices', want_man and have_lxml],
3588 ['adm group', get_option('adm-group')],
3589 ['wheel group', get_option('wheel-group')],
3592 ['debug mmap cache'],
3594 ['valgrind', conf.get('VALGRIND') == 1],
3595 ['trace logging', conf.get('LOG_TRACE') == 1],
3596 ['install tests', install_tests],
3597 ['link-udev-shared', get_option('link-udev-shared')],
3598 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3599 ['link-networkd-shared', get_option('link-networkd-shared')],
3600 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3601 ['kernel-install', get_option('kernel-install')],
3602 ['systemd-analyze', get_option('analyze')],
3605 if tuple.length() >= 2
3608 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3609 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3610 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3621 'enabled features: @0@'.format(', '.join(found)),
3623 'disabled features: @0@'.format(', '.join(missing)),
3625 message('\n '.join(status))
3627 if rootprefixdir != rootprefix_default
3629 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3630 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3631 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))