]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
journalctl: make pcre2 a dlopen() dependency
[thirdparty/systemd.git] / meson.build
1 # SPDX-License-Identifier: LGPL-2.1+
2
3 project('systemd', 'c',
4 version : '246',
5 license : 'LGPLv2+',
6 default_options: [
7 'c_std=gnu99',
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
11 'warning_level=2',
12 ],
13 meson_version : '>= 0.46',
14 )
15
16 libsystemd_version = '0.29.0'
17 libudev_version = '1.6.18'
18
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
22 # set. Ugh, ugh, ugh!
23 conf = configuration_data()
24 conf.set('PROJECT_VERSION', meson.project_version(),
25 description : 'Numerical project version (used where a simple number is expected)')
26
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)')
31
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)
40
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')
45 endif
46
47 skip_deps = want_ossfuzz or want_libfuzzer
48 fuzzer_build = want_ossfuzz or want_libfuzzer
49
50 #####################################################################
51
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())
58 endif
59 endif
60
61 #####################################################################
62
63 if get_option('split-usr') == 'auto'
64 split_usr = run_command('test', '-L', '/bin').returncode() != 0
65 else
66 split_usr = get_option('split-usr') == 'true'
67 endif
68 conf.set10('HAVE_SPLIT_USR', split_usr,
69 description : '/usr/bin and /bin directories are separate')
70
71 if get_option('split-bin') == 'auto'
72 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
73 else
74 split_bin = get_option('split-bin') == 'true'
75 endif
76 conf.set10('HAVE_SPLIT_BIN', split_bin,
77 description : 'bin and sbin directories are separate')
78
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
85 endif
86 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
87
88 have_standalone_binaries = get_option('standalone-binaries')
89
90 sysvinit_path = get_option('sysvinit-path')
91 sysvrcnd_path = get_option('sysvrcnd-path')
92 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
93 description : 'SysV init scripts and rcN.d links are supported')
94
95 if get_option('hibernate') and not get_option('initrd')
96 error('hibernate depends on initrd')
97 endif
98
99 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
100 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
101 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
102
103 # join_paths ignores the preceding arguments if an absolute component is
104 # encountered, so this should canonicalize various paths when they are
105 # absolute or relative.
106 prefixdir = get_option('prefix')
107 if not prefixdir.startswith('/')
108 error('Prefix is not absolute: "@0@"'.format(prefixdir))
109 endif
110 bindir = join_paths(prefixdir, get_option('bindir'))
111 libdir = join_paths(prefixdir, get_option('libdir'))
112 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
113 includedir = join_paths(prefixdir, get_option('includedir'))
114 datadir = join_paths(prefixdir, get_option('datadir'))
115 localstatedir = join_paths('/', get_option('localstatedir'))
116
117 rootbindir = join_paths(rootprefixdir, 'bin')
118 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
119 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
120
121 rootlibdir = get_option('rootlibdir')
122 if rootlibdir == ''
123 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
124 endif
125
126 # Dirs of external packages
127 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
128 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
129 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
130 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
131 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
132 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
133 rpmmacrosdir = get_option('rpmmacrosdir')
134 if rpmmacrosdir != 'no'
135 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
136 endif
137 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
138
139 # Our own paths
140 pkgdatadir = join_paths(datadir, 'systemd')
141 environmentdir = join_paths(prefixdir, 'lib/environment.d')
142 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
143 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
144 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
145 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
146 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
147 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
148 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
149 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
150 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
151 pkgincludedir = join_paths(includedir, 'systemd')
152 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
153 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
154 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
155 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
156 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
157 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
158 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
159 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
160 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
161 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
162 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
163 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
164 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
165 factorydir = join_paths(datadir, 'factory')
166 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
167 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
168 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
169 catalogstatedir = join_paths(systemdstatedir, 'catalog')
170 randomseeddir = join_paths(localstatedir, 'lib/systemd')
171 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
172 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
173
174 docdir = get_option('docdir')
175 if docdir == ''
176 docdir = join_paths(datadir, 'doc/systemd')
177 endif
178
179 dbuspolicydir = get_option('dbuspolicydir')
180 if dbuspolicydir == ''
181 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
182 endif
183
184 dbussessionservicedir = get_option('dbussessionservicedir')
185 if dbussessionservicedir == ''
186 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
187 endif
188
189 dbussystemservicedir = get_option('dbussystemservicedir')
190 if dbussystemservicedir == ''
191 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
192 endif
193
194 pamlibdir = get_option('pamlibdir')
195 if pamlibdir == ''
196 pamlibdir = join_paths(rootlibdir, 'security')
197 endif
198
199 pamconfdir = get_option('pamconfdir')
200 if pamconfdir == ''
201 pamconfdir = join_paths(sysconfdir, 'pam.d')
202 endif
203
204 memory_accounting_default = get_option('memory-accounting-default')
205 status_unit_format_default = get_option('status-unit-format-default')
206
207 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
208 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
209 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
210 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
211 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
212 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
213
214 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
215
216 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
217 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
218 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
219 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
220 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
221 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
222 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
223 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
224 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
225 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
226 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
227 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
228 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
229 conf.set_quoted('ROOTPREFIX', rootprefixdir)
230 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
231 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
232 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
233 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
234 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
235 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
236 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
237 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
238 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
239 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
240 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
241 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
242 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
243 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
244 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
245 conf.set_quoted('LIBDIR', libdir)
246 conf.set_quoted('ROOTLIBDIR', rootlibdir)
247 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
248 conf.set_quoted('BOOTLIBDIR', bootlibdir)
249 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
250 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
251 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
252 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
253 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
254 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
255 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
256 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
257 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
258 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
259 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
260 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
261
262 substs.set('prefix', prefixdir)
263 substs.set('rootprefix', rootprefixdir)
264 substs.set('rootprefix_noslash', rootprefixdir_noslash)
265 substs.set('exec_prefix', prefixdir)
266 substs.set('libdir', libdir)
267 substs.set('rootlibdir', rootlibdir)
268 substs.set('includedir', includedir)
269 substs.set('sysconfdir', sysconfdir)
270 substs.set('bindir', bindir)
271 substs.set('rootbindir', rootbindir)
272 substs.set('rootlibexecdir', rootlibexecdir)
273 substs.set('systemunitdir', systemunitdir)
274 substs.set('userunitdir', userunitdir)
275 substs.set('systempresetdir', systempresetdir)
276 substs.set('userpresetdir', userpresetdir)
277 substs.set('udevhwdbdir', udevhwdbdir)
278 substs.set('udevrulesdir', udevrulesdir)
279 substs.set('udevlibexecdir', udevlibexecdir)
280 substs.set('environmentdir', environmentdir)
281 substs.set('catalogdir', catalogdir)
282 substs.set('tmpfilesdir', tmpfilesdir)
283 substs.set('sysusersdir', sysusersdir)
284 substs.set('sysctldir', sysctldir)
285 substs.set('binfmtdir', binfmtdir)
286 substs.set('modulesloaddir', modulesloaddir)
287 substs.set('modprobedir', modprobedir)
288 substs.set('systemgeneratordir', systemgeneratordir)
289 substs.set('usergeneratordir', usergeneratordir)
290 substs.set('systemenvgeneratordir', systemenvgeneratordir)
291 substs.set('userenvgeneratordir', userenvgeneratordir)
292 substs.set('systemshutdowndir', systemshutdowndir)
293 substs.set('systemsleepdir', systemsleepdir)
294 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
295 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
296 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
297 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
298 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
299 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
300 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
301 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
302 substs.set('BUILD_ROOT', project_build_root)
303
304 #####################################################################
305
306 cc = meson.get_compiler('c')
307 pkgconfig = import('pkgconfig')
308 check_compilation_sh = find_program('tools/check-compilation.sh')
309 meson_build_sh = find_program('tools/meson-build.sh')
310
311 want_tests = get_option('tests')
312 slow_tests = want_tests != 'false' and get_option('slow-tests')
313 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
314 install_tests = get_option('install-tests')
315
316 if add_languages('cpp', required : fuzzer_build)
317 # Used only for tests
318 cxx = meson.get_compiler('cpp')
319 cxx_cmd = ' '.join(cxx.cmd_array())
320 else
321 cxx_cmd = ''
322 endif
323
324 if want_libfuzzer
325 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
326 if fuzzing_engine.found()
327 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
328 elif cc.has_argument('-fsanitize=fuzzer-no-link')
329 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
330 else
331 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
332 endif
333 elif want_ossfuzz
334 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
335 endif
336
337 # Those generate many false positives, and we do not want to change the code to
338 # avoid them.
339 basic_disabled_warnings = [
340 '-Wno-unused-parameter',
341 '-Wno-missing-field-initializers',
342 '-Wno-unused-result',
343 '-Wno-format-signedness',
344 ]
345
346 possible_cc_flags = [
347 '-Werror=undef',
348 '-Wlogical-op',
349 '-Wmissing-include-dirs',
350 '-Wold-style-definition',
351 '-Wpointer-arith',
352 '-Winit-self',
353 '-Wfloat-equal',
354 '-Wsuggest-attribute=noreturn',
355 '-Werror=missing-prototypes',
356 '-Werror=implicit-function-declaration',
357 '-Werror=missing-declarations',
358 '-Werror=return-type',
359 '-Werror=incompatible-pointer-types',
360 '-Werror=format=2',
361 '-Wstrict-prototypes',
362 '-Wredundant-decls',
363 '-Wmissing-noreturn',
364 '-Wimplicit-fallthrough=5',
365 '-Wshadow',
366 '-Wendif-labels',
367 '-Wstrict-aliasing=2',
368 '-Wwrite-strings',
369 '-Werror=overflow',
370 '-Werror=shift-count-overflow',
371 '-Werror=shift-overflow=2',
372 '-Wdate-time',
373 '-Wnested-externs',
374
375 # negative arguments are correctly detected starting with meson 0.46.
376 '-Wno-error=#warnings', # clang
377 '-Wno-string-plus-int', # clang
378
379 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
380 # optimizations enabled, producing essentially false positives.
381 '-Wno-maybe-uninitialized',
382
383 '-ffast-math',
384 '-fno-common',
385 '-fdiagnostics-show-option',
386 '-fno-strict-aliasing',
387 '-fvisibility=hidden',
388 '-fstack-protector',
389 '-fstack-protector-strong',
390 '--param=ssp-buffer-size=4',
391 ]
392
393 # --as-needed and --no-undefined are provided by meson by default,
394 # run mesonconf to see what is enabled
395 possible_link_flags = [
396 '-Wl,-z,relro',
397 '-Wl,-z,now',
398 '-fstack-protector',
399 ]
400
401 if cc.get_id() == 'clang'
402 possible_cc_flags += [
403 '-Wno-typedef-redefinition',
404 '-Wno-gnu-variable-sized-type-not-at-end',
405 ]
406 endif
407
408 if get_option('buildtype') != 'debug'
409 possible_cc_flags += [
410 '-ffunction-sections',
411 '-fdata-sections',
412 ]
413
414 possible_link_flags += '-Wl,--gc-sections'
415 endif
416
417 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
418 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
419 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
420
421 have = cc.has_argument('-Wzero-length-bounds')
422 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
423
424 if cc.compiles('''
425 #include <time.h>
426 #include <inttypes.h>
427 typedef uint64_t usec_t;
428 usec_t now(clockid_t clock);
429 int main(void) {
430 struct timespec now;
431 return 0;
432 }
433 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
434 add_project_arguments('-Werror=shadow', language : 'c')
435 endif
436
437 if cxx_cmd != ''
438 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
439 endif
440
441 cpp = ' '.join(cc.cmd_array()) + ' -E'
442
443 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
444
445 #####################################################################
446 # compilation result tests
447
448 conf.set('_GNU_SOURCE', true)
449 conf.set('__SANE_USERSPACE_TYPES__', true)
450 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
451
452 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
453 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
454 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
455 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
456
457 decl_headers = '''
458 #include <uchar.h>
459 #include <sys/stat.h>
460 '''
461
462 foreach decl : ['char16_t',
463 'char32_t',
464 'struct statx',
465 ]
466
467 # We get -1 if the size cannot be determined
468 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
469
470 if decl == 'struct statx'
471 if have
472 want_linux_stat_h = false
473 else
474 have = cc.sizeof(decl,
475 prefix : decl_headers + '#include <linux/stat.h>',
476 args : '-D_GNU_SOURCE') > 0
477 want_linux_stat_h = have
478 endif
479 endif
480
481 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
482 endforeach
483
484 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
485
486 foreach ident : ['secure_getenv', '__secure_getenv']
487 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
488 endforeach
489
490 foreach ident : [
491 ['memfd_create', '''#include <sys/mman.h>'''],
492 ['gettid', '''#include <sys/types.h>
493 #include <unistd.h>'''],
494 ['pivot_root', '''#include <stdlib.h>
495 #include <unistd.h>'''], # no known header declares pivot_root
496 ['name_to_handle_at', '''#include <sys/types.h>
497 #include <sys/stat.h>
498 #include <fcntl.h>'''],
499 ['setns', '''#include <sched.h>'''],
500 ['renameat2', '''#include <stdio.h>
501 #include <fcntl.h>'''],
502 ['kcmp', '''#include <linux/kcmp.h>'''],
503 ['keyctl', '''#include <sys/types.h>
504 #include <keyutils.h>'''],
505 ['copy_file_range', '''#include <sys/syscall.h>
506 #include <unistd.h>'''],
507 ['bpf', '''#include <sys/syscall.h>
508 #include <unistd.h>'''],
509 ['statx', '''#include <sys/types.h>
510 #include <sys/stat.h>
511 #include <unistd.h>'''],
512 ['explicit_bzero' , '''#include <string.h>'''],
513 ['reallocarray', '''#include <malloc.h>'''],
514 ['set_mempolicy', '''#include <stdlib.h>
515 #include <unistd.h>'''],
516 ['get_mempolicy', '''#include <stdlib.h>
517 #include <unistd.h>'''],
518 ['pidfd_send_signal', '''#include <stdlib.h>
519 #include <unistd.h>
520 #include <signal.h>
521 #include <sys/wait.h>'''],
522 ['pidfd_open', '''#include <stdlib.h>
523 #include <unistd.h>
524 #include <signal.h>
525 #include <sys/wait.h>'''],
526 ['rt_sigqueueinfo', '''#include <stdlib.h>
527 #include <unistd.h>
528 #include <signal.h>
529 #include <sys/wait.h>'''],
530 ]
531
532 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
533 conf.set10('HAVE_' + ident[0].to_upper(), have)
534 endforeach
535
536 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
537 conf.set10('USE_SYS_RANDOM_H', true)
538 conf.set10('HAVE_GETRANDOM', true)
539 else
540 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
541 conf.set10('USE_SYS_RANDOM_H', false)
542 conf.set10('HAVE_GETRANDOM', have)
543 endif
544
545 #####################################################################
546
547 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
548 project_source_root,
549 get_option('version-tag'),
550 meson.project_version()]
551
552 version_h = vcs_tag(
553 input : 'src/version/version.h.in',
554 output : 'version.h',
555 command: vcs_tagger)
556
557 versiondep = declare_dependency(sources: version_h)
558
559 sed = find_program('sed')
560 awk = find_program('awk')
561 m4 = find_program('m4')
562 stat = find_program('stat')
563 git = find_program('git', required : false)
564 env = find_program('env')
565 perl = find_program('perl', required : false)
566
567 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
568 mkdir_p = 'mkdir -p $DESTDIR/@0@'
569 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
570 splash_bmp = files('test/splash.bmp')
571
572 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
573 # /usr/sbin, /sbin, and fall back to the default from middle column.
574 progs = [['quotaon', '/usr/sbin/quotaon' ],
575 ['quotacheck', '/usr/sbin/quotacheck' ],
576 ['kmod', '/usr/bin/kmod' ],
577 ['kexec', '/usr/sbin/kexec' ],
578 ['sulogin', '/usr/sbin/sulogin' ],
579 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
580 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
581 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
582 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
583 ['nologin', '/usr/sbin/nologin', ],
584 ]
585 foreach prog : progs
586 path = get_option(prog[0] + '-path')
587 if path != ''
588 message('Using @1@ for @0@'.format(prog[0], path))
589 else
590 exe = find_program(prog[0],
591 '/usr/sbin/' + prog[0],
592 '/sbin/' + prog[0],
593 required: false)
594 path = exe.found() ? exe.path() : prog[1]
595 endif
596 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
597 conf.set_quoted(name, path)
598 substs.set(name, path)
599 endforeach
600
601 conf.set_quoted('TELINIT', get_option('telinit-path'))
602
603 if run_command('ln', '--relative', '--help').returncode() != 0
604 error('ln does not support --relative (added in coreutils 8.16)')
605 endif
606
607 ############################################################
608
609 gperf = find_program('gperf')
610
611 gperf_test_format = '''
612 #include <string.h>
613 const char * in_word_set(const char *, @0@);
614 @1@
615 '''
616 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
617 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
618 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
619 if cc.compiles(gperf_test)
620 gperf_len_type = 'size_t'
621 else
622 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
623 if cc.compiles(gperf_test)
624 gperf_len_type = 'unsigned'
625 else
626 error('unable to determine gperf len type')
627 endif
628 endif
629 message('gperf len type is @0@'.format(gperf_len_type))
630 conf.set('GPERF_LEN_TYPE', gperf_len_type,
631 description : 'The type of gperf "len" parameter')
632
633 ############################################################
634
635 if not cc.has_header('sys/capability.h')
636 error('POSIX caps headers not found')
637 endif
638 foreach header : ['crypt.h',
639 'linux/memfd.h',
640 'linux/vm_sockets.h',
641 'sys/auxv.h',
642 'valgrind/memcheck.h',
643 'valgrind/valgrind.h',
644 ]
645
646 conf.set10('HAVE_' + header.underscorify().to_upper(),
647 cc.has_header(header))
648 endforeach
649
650 ############################################################
651
652 fallback_hostname = get_option('fallback-hostname')
653 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
654 error('Invalid fallback-hostname configuration')
655 # A more extensive test is done in test-hostname-util. Let's catch
656 # the most obvious errors here so we don't fail with an assert later.
657 endif
658 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
659
660 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
661 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
662
663 default_hierarchy = get_option('default-hierarchy')
664 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
665 description : 'default cgroup hierarchy as string')
666 if default_hierarchy == 'legacy'
667 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
668 elif default_hierarchy == 'hybrid'
669 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
670 else
671 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
672 endif
673
674 default_net_naming_scheme = get_option('default-net-naming-scheme')
675 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
676
677 time_epoch = get_option('time-epoch')
678 if time_epoch == -1
679 source_date_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
680 if source_date_epoch != ''
681 time_epoch = source_date_epoch.to_int()
682 else
683 NEWS = files('NEWS')
684 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
685 endif
686 endif
687 conf.set('TIME_EPOCH', time_epoch)
688
689 system_uid_max = get_option('system-uid-max')
690 if system_uid_max == -1
691 system_uid_max = run_command(
692 awk,
693 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
694 '/etc/login.defs').stdout().strip()
695 if system_uid_max == ''
696 system_uid_max = 999
697 else
698 system_uid_max = system_uid_max.to_int()
699 endif
700 endif
701 conf.set('SYSTEM_UID_MAX', system_uid_max)
702 substs.set('systemuidmax', system_uid_max)
703
704 system_gid_max = get_option('system-gid-max')
705 if system_gid_max == -1
706 system_gid_max = run_command(
707 awk,
708 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
709 '/etc/login.defs').stdout().strip()
710 if system_gid_max == ''
711 system_gid_max = 999
712 else
713 system_gid_max = system_gid_max.to_int()
714 endif
715 endif
716 conf.set('SYSTEM_GID_MAX', system_gid_max)
717 substs.set('systemgidmax', system_gid_max)
718
719 dynamic_uid_min = get_option('dynamic-uid-min')
720 dynamic_uid_max = get_option('dynamic-uid-max')
721 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
722 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
723 substs.set('dynamicuidmin', dynamic_uid_min)
724 substs.set('dynamicuidmax', dynamic_uid_max)
725
726 container_uid_base_min = get_option('container-uid-base-min')
727 container_uid_base_max = get_option('container-uid-base-max')
728 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
729 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
730 substs.set('containeruidbasemin', container_uid_base_min)
731 substs.set('containeruidbasemax', container_uid_base_max)
732
733 nobody_user = get_option('nobody-user')
734 nobody_group = get_option('nobody-group')
735
736 if not meson.is_cross_build()
737 getent_result = run_command('getent', 'passwd', '65534')
738 if getent_result.returncode() == 0
739 name = getent_result.stdout().split(':')[0]
740 if name != nobody_user
741 warning('\n' +
742 '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) +
743 'Your build will result in an user table setup that is incompatible with the local system.')
744 endif
745 endif
746 id_result = run_command('id', '-u', nobody_user)
747 if id_result.returncode() == 0
748 id = id_result.stdout().to_int()
749 if id != 65534
750 warning('\n' +
751 '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) +
752 'Your build will result in an user table setup that is incompatible with the local system.')
753 endif
754 endif
755
756 getent_result = run_command('getent', 'group', '65534')
757 if getent_result.returncode() == 0
758 name = getent_result.stdout().split(':')[0]
759 if name != nobody_group
760 warning('\n' +
761 '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) +
762 'Your build will result in an group table setup that is incompatible with the local system.')
763 endif
764 endif
765 id_result = run_command('id', '-g', nobody_group)
766 if id_result.returncode() == 0
767 id = id_result.stdout().to_int()
768 if id != 65534
769 warning('\n' +
770 '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) +
771 'Your build will result in an group table setup that is incompatible with the local system.')
772 endif
773 endif
774 endif
775 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
776 warning('\n' +
777 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
778 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
779 endif
780
781 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
782 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
783 substs.set('NOBODY_USER_NAME', nobody_user)
784 substs.set('NOBODY_GROUP_NAME', nobody_group)
785
786 tty_gid = get_option('tty-gid')
787 conf.set('TTY_GID', tty_gid)
788 substs.set('TTY_GID', tty_gid)
789
790 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
791 users_gid = get_option('users-gid')
792 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
793
794 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
795 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
796
797 dev_kvm_mode = get_option('dev-kvm-mode')
798 substs.set('DEV_KVM_MODE', dev_kvm_mode)
799 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
800 group_render_mode = get_option('group-render-mode')
801 substs.set('GROUP_RENDER_MODE', group_render_mode)
802 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
803
804 kill_user_processes = get_option('default-kill-user-processes')
805 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
806 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
807 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
808
809 dns_servers = get_option('dns-servers')
810 conf.set_quoted('DNS_SERVERS', dns_servers)
811 substs.set('DNS_SERVERS', dns_servers)
812
813 ntp_servers = get_option('ntp-servers')
814 conf.set_quoted('NTP_SERVERS', ntp_servers)
815 substs.set('NTP_SERVERS', ntp_servers)
816
817 default_locale = get_option('default-locale')
818 if default_locale == ''
819 if not meson.is_cross_build()
820 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
821 default_locale = run_command(choose_default_locale_sh).stdout().strip()
822 else
823 default_locale = 'C.UTF-8'
824 endif
825 endif
826 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
827
828 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
829
830 service_watchdog = get_option('service-watchdog')
831 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
832 substs.set('SERVICE_WATCHDOG', watchdog_value)
833
834 substs.set('SUSHELL', get_option('debug-shell'))
835 substs.set('DEBUGTTY', get_option('debug-tty'))
836 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
837
838 enable_debug_hashmap = false
839 enable_debug_mmap_cache = false
840 enable_debug_siphash = false
841 foreach name : get_option('debug-extra')
842 if name == 'hashmap'
843 enable_debug_hashmap = true
844 elif name == 'mmap-cache'
845 enable_debug_mmap_cache = true
846 elif name == 'siphash'
847 enable_debug_siphash = true
848 else
849 message('unknown debug option "@0@", ignoring'.format(name))
850 endif
851 endforeach
852 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
853 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
854 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
855
856 conf.set10('VALGRIND', get_option('valgrind'))
857 conf.set10('LOG_TRACE', get_option('log-trace'))
858
859 default_user_path = get_option('user-path')
860 if default_user_path != ''
861 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
862 default_user_path_display = default_user_path
863 else
864 # meson 0.49 fails when ?: is used in .format()
865 default_user_path_display = '(same as system services)'
866 endif
867
868
869 #####################################################################
870
871 threads = dependency('threads')
872 librt = cc.find_library('rt')
873 libm = cc.find_library('m')
874 libdl = cc.find_library('dl')
875 libcrypt = cc.find_library('crypt')
876
877 libcap = dependency('libcap', required : false)
878 if not libcap.found()
879 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
880 libcap = cc.find_library('cap')
881 endif
882
883 libmount = dependency('mount',
884 version : fuzzer_build ? '>= 0' : '>= 2.30')
885
886 want_libfdisk = get_option('fdisk')
887 if want_libfdisk != 'false' and not skip_deps
888 libfdisk = dependency('fdisk',
889 required : want_libfdisk == 'true')
890 have = libfdisk.found()
891 else
892 have = false
893 libfdisk = []
894 endif
895 conf.set10('HAVE_LIBFDISK', have)
896
897 want_pwquality = get_option('pwquality')
898 if want_pwquality != 'false' and not skip_deps
899 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
900 have = libpwquality.found()
901 else
902 have = false
903 libpwquality = []
904 endif
905 conf.set10('HAVE_PWQUALITY', have)
906
907 want_seccomp = get_option('seccomp')
908 if want_seccomp != 'false' and not skip_deps
909 libseccomp = dependency('libseccomp',
910 version : '>= 2.3.1',
911 required : want_seccomp == 'true')
912 have = libseccomp.found()
913 else
914 have = false
915 libseccomp = []
916 endif
917 conf.set10('HAVE_SECCOMP', have)
918
919 want_selinux = get_option('selinux')
920 if want_selinux != 'false' and not skip_deps
921 libselinux = dependency('libselinux',
922 version : '>= 2.1.9',
923 required : want_selinux == 'true')
924 have = libselinux.found()
925 else
926 have = false
927 libselinux = []
928 endif
929 conf.set10('HAVE_SELINUX', have)
930
931 want_apparmor = get_option('apparmor')
932 if want_apparmor != 'false' and not skip_deps
933 libapparmor = dependency('libapparmor',
934 version : '>= 2.13',
935 required : want_apparmor == 'true')
936 have = libapparmor.found()
937 else
938 have = false
939 libapparmor = []
940 endif
941 conf.set10('HAVE_APPARMOR', have)
942
943 smack_run_label = get_option('smack-run-label')
944 if smack_run_label != ''
945 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
946 endif
947
948 want_polkit = get_option('polkit')
949 install_polkit = false
950 install_polkit_pkla = false
951 if want_polkit != 'false' and not skip_deps
952 install_polkit = true
953
954 libpolkit = dependency('polkit-gobject-1',
955 required : false)
956 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
957 message('Old polkit detected, will install pkla files')
958 install_polkit_pkla = true
959 endif
960 endif
961 conf.set10('ENABLE_POLKIT', install_polkit)
962
963 want_acl = get_option('acl')
964 if want_acl != 'false' and not skip_deps
965 libacl = cc.find_library('acl', required : want_acl == 'true')
966 have = libacl.found()
967 else
968 have = false
969 libacl = []
970 endif
971 conf.set10('HAVE_ACL', have)
972
973 want_audit = get_option('audit')
974 if want_audit != 'false' and not skip_deps
975 libaudit = dependency('audit', required : want_audit == 'true')
976 have = libaudit.found()
977 else
978 have = false
979 libaudit = []
980 endif
981 conf.set10('HAVE_AUDIT', have)
982
983 want_blkid = get_option('blkid')
984 if want_blkid != 'false' and not skip_deps
985 libblkid = dependency('blkid', required : want_blkid == 'true')
986 have = libblkid.found()
987 else
988 have = false
989 libblkid = []
990 endif
991 conf.set10('HAVE_BLKID', have)
992
993 want_kmod = get_option('kmod')
994 if want_kmod != 'false' and not skip_deps
995 libkmod = dependency('libkmod',
996 version : '>= 15',
997 required : want_kmod == 'true')
998 have = libkmod.found()
999 else
1000 have = false
1001 libkmod = []
1002 endif
1003 conf.set10('HAVE_KMOD', have)
1004
1005 want_pam = get_option('pam')
1006 if want_pam != 'false' and not skip_deps
1007 libpam = cc.find_library('pam', required : want_pam == 'true')
1008 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1009 have = libpam.found() and libpam_misc.found()
1010 else
1011 have = false
1012 libpam = []
1013 libpam_misc = []
1014 endif
1015 conf.set10('HAVE_PAM', have)
1016
1017 want_microhttpd = get_option('microhttpd')
1018 if want_microhttpd != 'false' and not skip_deps
1019 libmicrohttpd = dependency('libmicrohttpd',
1020 version : '>= 0.9.33',
1021 required : want_microhttpd == 'true')
1022 have = libmicrohttpd.found()
1023 else
1024 have = false
1025 libmicrohttpd = []
1026 endif
1027 conf.set10('HAVE_MICROHTTPD', have)
1028
1029 want_libcryptsetup = get_option('libcryptsetup')
1030 if want_libcryptsetup != 'false' and not skip_deps
1031 libcryptsetup = dependency('libcryptsetup',
1032 version : '>= 2.0.1',
1033 required : want_libcryptsetup == 'true')
1034 have = libcryptsetup.found()
1035
1036 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1037 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1038 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1039 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1040 else
1041 have = false
1042 libcryptsetup = []
1043 endif
1044 conf.set10('HAVE_LIBCRYPTSETUP', have)
1045
1046 want_libcurl = get_option('libcurl')
1047 if want_libcurl != 'false' and not skip_deps
1048 libcurl = dependency('libcurl',
1049 version : '>= 7.32.0',
1050 required : want_libcurl == 'true')
1051 have = libcurl.found()
1052 else
1053 have = false
1054 libcurl = []
1055 endif
1056 conf.set10('HAVE_LIBCURL', have)
1057
1058 want_libidn = get_option('libidn')
1059 want_libidn2 = get_option('libidn2')
1060 if want_libidn == 'true' and want_libidn2 == 'true'
1061 error('libidn and libidn2 cannot be requested simultaneously')
1062 endif
1063
1064 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1065 libidn = dependency('libidn2',
1066 required : want_libidn2 == 'true')
1067 have = libidn.found()
1068 else
1069 have = false
1070 libidn = []
1071 endif
1072 conf.set10('HAVE_LIBIDN2', have)
1073 if not have and want_libidn != 'false' and not skip_deps
1074 # libidn is used for both libidn and libidn2 objects
1075 libidn = dependency('libidn',
1076 required : want_libidn == 'true')
1077 have = libidn.found()
1078 else
1079 have = false
1080 endif
1081 conf.set10('HAVE_LIBIDN', have)
1082
1083 want_libiptc = get_option('libiptc')
1084 if want_libiptc != 'false' and not skip_deps
1085 libiptc = dependency('libiptc',
1086 required : want_libiptc == 'true')
1087 have = libiptc.found()
1088 else
1089 have = false
1090 libiptc = []
1091 endif
1092 conf.set10('HAVE_LIBIPTC', have)
1093
1094 want_qrencode = get_option('qrencode')
1095 if want_qrencode != 'false' and not skip_deps
1096 libqrencode = dependency('libqrencode',
1097 required : want_qrencode == 'true')
1098 have = libqrencode.found()
1099 else
1100 have = false
1101 libqrencode = []
1102 endif
1103 conf.set10('HAVE_QRENCODE', have)
1104
1105 want_gcrypt = get_option('gcrypt')
1106 if want_gcrypt != 'false' and not skip_deps
1107 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1108 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1109 have = libgcrypt.found() and libgpg_error.found()
1110 else
1111 have = false
1112 endif
1113 if not have
1114 # link to neither of the libs if one is not found
1115 libgcrypt = []
1116 libgpg_error = []
1117 endif
1118 conf.set10('HAVE_GCRYPT', have)
1119
1120 want_gnutls = get_option('gnutls')
1121 if want_gnutls != 'false' and not skip_deps
1122 libgnutls = dependency('gnutls',
1123 version : '>= 3.1.4',
1124 required : want_gnutls == 'true')
1125 have = libgnutls.found()
1126 else
1127 have = false
1128 libgnutls = []
1129 endif
1130 conf.set10('HAVE_GNUTLS', have)
1131
1132 want_openssl = get_option('openssl')
1133 if want_openssl != 'false' and not skip_deps
1134 libopenssl = dependency('openssl',
1135 version : '>= 1.1.0',
1136 required : want_openssl == 'true')
1137 have = libopenssl.found()
1138 else
1139 have = false
1140 libopenssl = []
1141 endif
1142 conf.set10('HAVE_OPENSSL', have)
1143
1144 want_p11kit = get_option('p11kit')
1145 if want_p11kit != 'false' and not skip_deps
1146 libp11kit = dependency('p11-kit-1',
1147 version : '>= 0.23.3',
1148 required : want_p11kit == 'true')
1149 have = libp11kit.found()
1150 else
1151 have = false
1152 libp11kit = []
1153 endif
1154 conf.set10('HAVE_P11KIT', have)
1155
1156 want_libfido2 = get_option('libfido2')
1157 if want_libfido2 != 'false' and not skip_deps
1158 libfido2 = dependency('libfido2',
1159 required : want_libfido2 == 'true')
1160 have = libfido2.found()
1161 else
1162 have = false
1163 libfido2 = []
1164 endif
1165 conf.set10('HAVE_LIBFIDO2', have)
1166
1167 want_elfutils = get_option('elfutils')
1168 if want_elfutils != 'false' and not skip_deps
1169 libdw = dependency('libdw',
1170 required : want_elfutils == 'true')
1171 have = libdw.found()
1172 else
1173 have = false
1174 libdw = []
1175 endif
1176 conf.set10('HAVE_ELFUTILS', have)
1177
1178 want_zlib = get_option('zlib')
1179 if want_zlib != 'false' and not skip_deps
1180 libz = dependency('zlib',
1181 required : want_zlib == 'true')
1182 have = libz.found()
1183 else
1184 have = false
1185 libz = []
1186 endif
1187 conf.set10('HAVE_ZLIB', have)
1188
1189 want_bzip2 = get_option('bzip2')
1190 if want_bzip2 != 'false' and not skip_deps
1191 libbzip2 = cc.find_library('bz2',
1192 required : want_bzip2 == 'true')
1193 have = libbzip2.found()
1194 else
1195 have = false
1196 libbzip2 = []
1197 endif
1198 conf.set10('HAVE_BZIP2', have)
1199
1200 want_xz = get_option('xz')
1201 if want_xz != 'false' and not skip_deps
1202 libxz = dependency('liblzma',
1203 required : want_xz == 'true')
1204 have_xz = libxz.found()
1205 else
1206 have_xz = false
1207 libxz = []
1208 endif
1209 conf.set10('HAVE_XZ', have_xz)
1210
1211 want_lz4 = get_option('lz4')
1212 if want_lz4 != 'false' and not skip_deps
1213 liblz4 = dependency('liblz4',
1214 version : '>= 1.3.0',
1215 required : want_lz4 == 'true')
1216 have_lz4 = liblz4.found()
1217 else
1218 have_lz4 = false
1219 liblz4 = []
1220 endif
1221 conf.set10('HAVE_LZ4', have_lz4)
1222
1223 want_zstd = get_option('zstd')
1224 if want_zstd != 'false' and not skip_deps
1225 libzstd = dependency('libzstd',
1226 required : want_zstd == 'true',
1227 version : '>= 1.4.0')
1228 have_zstd = libzstd.found()
1229 else
1230 have_zstd = false
1231 libzstd = []
1232 endif
1233 conf.set10('HAVE_ZSTD', have_zstd)
1234
1235 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1236
1237 want_xkbcommon = get_option('xkbcommon')
1238 if want_xkbcommon != 'false' and not skip_deps
1239 libxkbcommon = dependency('xkbcommon',
1240 version : '>= 0.3.0',
1241 required : want_xkbcommon == 'true')
1242 have = libxkbcommon.found()
1243 else
1244 have = false
1245 libxkbcommon = []
1246 endif
1247 conf.set10('HAVE_XKBCOMMON', have)
1248
1249 want_pcre2 = get_option('pcre2')
1250 if want_pcre2 != 'false'
1251 libpcre2 = dependency('libpcre2-8',
1252 required : want_pcre2 == 'true')
1253 have = libpcre2.found()
1254 else
1255 have = false
1256 libpcre2 = []
1257 endif
1258 conf.set10('HAVE_PCRE2', have)
1259
1260 want_glib = get_option('glib')
1261 if want_glib != 'false' and not skip_deps
1262 libglib = dependency('glib-2.0',
1263 version : '>= 2.22.0',
1264 required : want_glib == 'true')
1265 libgobject = dependency('gobject-2.0',
1266 version : '>= 2.22.0',
1267 required : want_glib == 'true')
1268 libgio = dependency('gio-2.0',
1269 required : want_glib == 'true')
1270 have = libglib.found() and libgobject.found() and libgio.found()
1271 else
1272 have = false
1273 libglib = []
1274 libgobject = []
1275 libgio = []
1276 endif
1277 conf.set10('HAVE_GLIB', have)
1278
1279 want_dbus = get_option('dbus')
1280 if want_dbus != 'false' and not skip_deps
1281 libdbus = dependency('dbus-1',
1282 version : '>= 1.3.2',
1283 required : want_dbus == 'true')
1284 have = libdbus.found()
1285 else
1286 have = false
1287 libdbus = []
1288 endif
1289 conf.set10('HAVE_DBUS', have)
1290
1291 default_dnssec = get_option('default-dnssec')
1292 if skip_deps
1293 default_dnssec = 'no'
1294 endif
1295 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1296 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1297 default_dnssec = 'no'
1298 endif
1299 conf.set('DEFAULT_DNSSEC_MODE',
1300 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1301 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1302
1303 dns_over_tls = get_option('dns-over-tls')
1304 if dns_over_tls != 'false'
1305 if dns_over_tls == 'openssl'
1306 have_gnutls = false
1307 else
1308 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1309 if dns_over_tls == 'gnutls' and not have_gnutls
1310 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1311 endif
1312 endif
1313 if dns_over_tls == 'gnutls' or have_gnutls
1314 have_openssl = false
1315 else
1316 have_openssl = conf.get('HAVE_OPENSSL') == 1
1317 if dns_over_tls != 'auto' and not have_openssl
1318 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1319 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1320 endif
1321 endif
1322 have = have_gnutls or have_openssl
1323 else
1324 have = false
1325 have_gnutls = false
1326 have_openssl = false
1327 endif
1328 conf.set10('ENABLE_DNS_OVER_TLS', have)
1329 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1330 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1331
1332 default_dns_over_tls = get_option('default-dns-over-tls')
1333 if skip_deps
1334 default_dns_over_tls = 'no'
1335 endif
1336 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1337 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.')
1338 default_dns_over_tls = 'no'
1339 endif
1340 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1341 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1342 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1343
1344 default_mdns = get_option('default-mdns')
1345 conf.set('DEFAULT_MDNS_MODE',
1346 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1347 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1348
1349 default_llmnr = get_option('default-llmnr')
1350 conf.set('DEFAULT_LLMNR_MODE',
1351 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1352 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1353
1354 want_repart = get_option('repart')
1355 if want_repart != 'false'
1356 have = (conf.get('HAVE_OPENSSL') == 1 and
1357 conf.get('HAVE_LIBFDISK') == 1)
1358 if want_repart == 'true' and not have
1359 error('repart support was requested, but dependencies are not available')
1360 endif
1361 else
1362 have = false
1363 endif
1364 conf.set10('ENABLE_REPART', have)
1365
1366 want_importd = get_option('importd')
1367 if want_importd != 'false'
1368 have = (conf.get('HAVE_LIBCURL') == 1 and
1369 conf.get('HAVE_ZLIB') == 1 and
1370 conf.get('HAVE_XZ') == 1 and
1371 conf.get('HAVE_GCRYPT') == 1)
1372 if want_importd == 'true' and not have
1373 error('importd support was requested, but dependencies are not available')
1374 endif
1375 else
1376 have = false
1377 endif
1378 conf.set10('ENABLE_IMPORTD', have)
1379
1380 want_homed = get_option('homed')
1381 if want_homed != 'false'
1382 have = (conf.get('HAVE_OPENSSL') == 1 and
1383 conf.get('HAVE_LIBFDISK') == 1 and
1384 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1385 if want_homed == 'true' and not have
1386 error('homed support was requested, but dependencies are not available')
1387 endif
1388 else
1389 have = false
1390 endif
1391 conf.set10('ENABLE_HOMED', have)
1392
1393 have = have and conf.get('HAVE_PAM') == 1
1394 conf.set10('ENABLE_PAM_HOME', have)
1395
1396 want_remote = get_option('remote')
1397 if want_remote != 'false'
1398 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1399 conf.get('HAVE_LIBCURL') == 1]
1400 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1401 # it's possible to build one without the other. Complain only if
1402 # support was explicitly requested. The auxiliary files like sysusers
1403 # config should be installed when any of the programs are built.
1404 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1405 error('remote support was requested, but dependencies are not available')
1406 endif
1407 have = have_deps[0] or have_deps[1]
1408 else
1409 have = false
1410 endif
1411 conf.set10('ENABLE_REMOTE', have)
1412
1413 foreach term : ['utmp',
1414 'hibernate',
1415 'environment-d',
1416 'binfmt',
1417 'coredump',
1418 'pstore',
1419 'resolve',
1420 'logind',
1421 'hostnamed',
1422 'localed',
1423 'machined',
1424 'portabled',
1425 'userdb',
1426 'networkd',
1427 'timedated',
1428 'timesyncd',
1429 'firstboot',
1430 'randomseed',
1431 'backlight',
1432 'vconsole',
1433 'quotacheck',
1434 'sysusers',
1435 'tmpfiles',
1436 'hwdb',
1437 'rfkill',
1438 'xdg-autostart',
1439 'ldconfig',
1440 'efi',
1441 'tpm',
1442 'ima',
1443 'smack',
1444 'gshadow',
1445 'idn',
1446 'initrd',
1447 'nss-myhostname',
1448 'nss-systemd']
1449 have = get_option(term)
1450 name = 'ENABLE_' + term.underscorify().to_upper()
1451 conf.set10(name, have)
1452 endforeach
1453
1454 foreach tuple : [['nss-mymachines', 'machined'],
1455 ['nss-resolve', 'resolve']]
1456 want = get_option(tuple[0])
1457 if want != 'false'
1458 have = get_option(tuple[1])
1459 if want == 'true' and not have
1460 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1461 endif
1462 else
1463 have = false
1464 endif
1465 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1466 conf.set10(name, have)
1467 endforeach
1468
1469 enable_nss = false
1470 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1471 'ENABLE_NSS_MYMACHINES',
1472 'ENABLE_NSS_RESOLVE',
1473 'ENABLE_NSS_SYSTEMD']
1474 if conf.get(term) == 1
1475 enable_nss = true
1476 endif
1477 endforeach
1478 conf.set10('ENABLE_NSS', enable_nss)
1479
1480 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1481
1482 tests = []
1483 fuzzers = []
1484
1485 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1486
1487 #####################################################################
1488
1489 if get_option('efi')
1490 efi_arch = host_machine.cpu_family()
1491
1492 if efi_arch == 'x86'
1493 EFI_MACHINE_TYPE_NAME = 'ia32'
1494 gnu_efi_arch = 'ia32'
1495 elif efi_arch == 'x86_64'
1496 EFI_MACHINE_TYPE_NAME = 'x64'
1497 gnu_efi_arch = 'x86_64'
1498 elif efi_arch == 'arm'
1499 EFI_MACHINE_TYPE_NAME = 'arm'
1500 gnu_efi_arch = 'arm'
1501 elif efi_arch == 'aarch64'
1502 EFI_MACHINE_TYPE_NAME = 'aa64'
1503 gnu_efi_arch = 'aarch64'
1504 else
1505 EFI_MACHINE_TYPE_NAME = ''
1506 gnu_efi_arch = ''
1507 endif
1508
1509 have = true
1510 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1511
1512 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1513 else
1514 have = false
1515 endif
1516 conf.set10('ENABLE_EFI', have)
1517
1518 #####################################################################
1519
1520 config_h = configure_file(
1521 output : 'config.h',
1522 configuration : conf)
1523
1524 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1525
1526 includes = include_directories('src/basic',
1527 'src/boot',
1528 'src/home',
1529 'src/shared',
1530 'src/systemd',
1531 'src/journal',
1532 'src/journal-remote',
1533 'src/nspawn',
1534 'src/resolve',
1535 'src/timesync',
1536 'src/time-wait-sync',
1537 'src/login',
1538 'src/udev',
1539 'src/libudev',
1540 'src/core',
1541 'src/shutdown',
1542 'src/xdg-autostart-generator',
1543 'src/libsystemd/sd-bus',
1544 'src/libsystemd/sd-device',
1545 'src/libsystemd/sd-event',
1546 'src/libsystemd/sd-hwdb',
1547 'src/libsystemd/sd-id128',
1548 'src/libsystemd/sd-netlink',
1549 'src/libsystemd/sd-network',
1550 'src/libsystemd/sd-resolve',
1551 'src/libsystemd-network',
1552 '.')
1553
1554 add_project_arguments('-include', 'config.h', language : 'c')
1555
1556 generate_gperfs = find_program('tools/generate-gperfs.py')
1557
1558 subdir('po')
1559 subdir('catalog')
1560 subdir('src/systemd')
1561 subdir('src/basic')
1562 subdir('src/libsystemd')
1563 subdir('src/libsystemd-network')
1564 subdir('src/journal')
1565 subdir('src/login')
1566
1567 libjournal_core = static_library(
1568 'journal-core',
1569 libjournal_core_sources,
1570 journald_gperf_c,
1571 include_directories : includes,
1572 install : false)
1573
1574 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1575 libsystemd = shared_library(
1576 'systemd',
1577 disable_mempool_c,
1578 version : libsystemd_version,
1579 include_directories : includes,
1580 link_args : ['-shared',
1581 '-Wl,--version-script=' + libsystemd_sym_path],
1582 link_with : [libbasic,
1583 libbasic_gcrypt],
1584 link_whole : [libsystemd_static,
1585 libjournal_client],
1586 dependencies : [threads,
1587 librt,
1588 libxz,
1589 libzstd,
1590 liblz4],
1591 link_depends : libsystemd_sym,
1592 install : true,
1593 install_dir : rootlibdir)
1594
1595 static_libsystemd = get_option('static-libsystemd')
1596 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1597
1598 install_libsystemd_static = static_library(
1599 'systemd',
1600 libsystemd_sources,
1601 journal_client_sources,
1602 basic_sources,
1603 basic_gcrypt_sources,
1604 disable_mempool_c,
1605 include_directories : includes,
1606 build_by_default : static_libsystemd != 'false',
1607 install : static_libsystemd != 'false',
1608 install_dir : rootlibdir,
1609 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1610 dependencies : [threads,
1611 librt,
1612 libxz,
1613 libzstd,
1614 liblz4,
1615 libcap,
1616 libblkid,
1617 libmount,
1618 libselinux,
1619 libgcrypt],
1620 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1621
1622 # Generate autosuspend rules
1623 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1624
1625 ############################################################
1626
1627 # binaries that have --help and are intended for use by humans,
1628 # usually, but not always, installed in /bin.
1629 public_programs = []
1630
1631 subdir('src/libudev')
1632 subdir('src/shared')
1633 subdir('src/core')
1634 subdir('src/shutdown')
1635 subdir('src/udev')
1636 subdir('src/network')
1637
1638 subdir('src/analyze')
1639 subdir('src/journal-remote')
1640 subdir('src/coredump')
1641 subdir('src/pstore')
1642 subdir('src/hostname')
1643 subdir('src/import')
1644 subdir('src/partition')
1645 subdir('src/kernel-install')
1646 subdir('src/locale')
1647 subdir('src/machine')
1648 subdir('src/portable')
1649 subdir('src/userdb')
1650 subdir('src/home')
1651 subdir('src/nspawn')
1652 subdir('src/resolve')
1653 subdir('src/timedate')
1654 subdir('src/timesync')
1655 subdir('src/tmpfiles')
1656 subdir('src/vconsole')
1657 subdir('src/boot/efi')
1658
1659 subdir('src/test')
1660 subdir('src/fuzz')
1661 subdir('rules.d')
1662 subdir('test')
1663
1664 ############################################################
1665
1666 # only static linking apart from libdl, to make sure that the
1667 # module is linked to all libraries that it uses.
1668 test_dlopen = executable(
1669 'test-dlopen',
1670 test_dlopen_c,
1671 disable_mempool_c,
1672 include_directories : includes,
1673 link_with : [libbasic],
1674 dependencies : [libdl],
1675 build_by_default : want_tests != 'false')
1676
1677 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1678 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1679 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1680 ['resolve', 'ENABLE_NSS_RESOLVE']]
1681
1682 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1683 if condition
1684 module = tuple[0]
1685
1686 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1687 version_script_arg = join_paths(project_source_root, sym)
1688
1689 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1690 if tuple.length() > 2
1691 sources += tuple[2].split()
1692 endif
1693
1694 nss = shared_library(
1695 'nss_' + module,
1696 sources,
1697 disable_mempool_c,
1698 version : '2',
1699 include_directories : includes,
1700 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1701 link_args : ['-Wl,-z,nodelete',
1702 '-shared',
1703 '-Wl,--version-script=' + version_script_arg],
1704 link_with : [libsystemd_static,
1705 libshared_static,
1706 libbasic],
1707 dependencies : [threads,
1708 librt],
1709 link_depends : sym,
1710 install : true,
1711 install_dir : rootlibdir)
1712
1713 # We cannot use shared_module because it does not support version suffix.
1714 # Unfortunately shared_library insists on creating the symlink…
1715 meson.add_install_script('sh', '-c',
1716 'rm $DESTDIR@0@/libnss_@1@.so'
1717 .format(rootlibdir, module))
1718
1719 if want_tests != 'false'
1720 test('dlopen-nss_' + module,
1721 test_dlopen,
1722 # path to dlopen must include a slash
1723 args : nss.full_path())
1724 endif
1725 endif
1726 endforeach
1727
1728 ############################################################
1729
1730 executable(
1731 'systemd',
1732 systemd_sources,
1733 include_directories : includes,
1734 link_with : [libcore,
1735 libshared],
1736 dependencies : [versiondep,
1737 threads,
1738 librt,
1739 libseccomp,
1740 libselinux,
1741 libmount,
1742 libblkid],
1743 install_rpath : rootlibexecdir,
1744 install : true,
1745 install_dir : rootlibexecdir)
1746
1747 meson.add_install_script(meson_make_symlink,
1748 join_paths(rootlibexecdir, 'systemd'),
1749 join_paths(rootsbindir, 'init'))
1750
1751 public_programs += executable(
1752 'systemd-analyze',
1753 systemd_analyze_sources,
1754 include_directories : includes,
1755 link_with : [libcore,
1756 libshared],
1757 dependencies : [versiondep,
1758 threads,
1759 librt,
1760 libseccomp,
1761 libselinux,
1762 libmount,
1763 libblkid],
1764 install_rpath : rootlibexecdir,
1765 install : get_option('analyze'))
1766
1767 executable(
1768 'systemd-journald',
1769 systemd_journald_sources,
1770 include_directories : includes,
1771 link_with : [libjournal_core,
1772 libshared],
1773 dependencies : [threads,
1774 libxz,
1775 liblz4,
1776 libselinux,
1777 libzstd],
1778 install_rpath : rootlibexecdir,
1779 install : true,
1780 install_dir : rootlibexecdir)
1781
1782 public_programs += executable(
1783 'systemd-cat',
1784 systemd_cat_sources,
1785 include_directories : includes,
1786 link_with : [libjournal_core,
1787 libshared],
1788 dependencies : [threads],
1789 install_rpath : rootlibexecdir,
1790 install : true)
1791
1792 public_programs += executable(
1793 'journalctl',
1794 journalctl_sources,
1795 include_directories : includes,
1796 link_with : [libshared],
1797 dependencies : [threads,
1798 libqrencode,
1799 libxz,
1800 liblz4,
1801 libzstd,
1802 libdl],
1803 install_rpath : rootlibexecdir,
1804 install : true,
1805 install_dir : rootbindir)
1806
1807 executable(
1808 'systemd-getty-generator',
1809 'src/getty-generator/getty-generator.c',
1810 include_directories : includes,
1811 link_with : [libshared],
1812 install_rpath : rootlibexecdir,
1813 install : true,
1814 install_dir : systemgeneratordir)
1815
1816 executable(
1817 'systemd-debug-generator',
1818 'src/debug-generator/debug-generator.c',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 install_rpath : rootlibexecdir,
1822 install : true,
1823 install_dir : systemgeneratordir)
1824
1825 executable(
1826 'systemd-run-generator',
1827 'src/run-generator/run-generator.c',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 install_rpath : rootlibexecdir,
1831 install : true,
1832 install_dir : systemgeneratordir)
1833
1834 executable(
1835 'systemd-fstab-generator',
1836 'src/fstab-generator/fstab-generator.c',
1837 include_directories : includes,
1838 link_with : [libcore_shared,
1839 libshared],
1840 install_rpath : rootlibexecdir,
1841 install : true,
1842 install_dir : systemgeneratordir)
1843
1844 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1845 executable(
1846 '30-systemd-environment-d-generator',
1847 'src/environment-d-generator/environment-d-generator.c',
1848 include_directories : includes,
1849 link_with : [libshared],
1850 install_rpath : rootlibexecdir,
1851 install : true,
1852 install_dir : userenvgeneratordir)
1853
1854 meson.add_install_script(meson_make_symlink,
1855 join_paths(sysconfdir, 'environment'),
1856 join_paths(environmentdir, '99-environment.conf'))
1857 endif
1858
1859 if conf.get('ENABLE_HIBERNATE') == 1
1860 executable(
1861 'systemd-hibernate-resume-generator',
1862 'src/hibernate-resume/hibernate-resume-generator.c',
1863 include_directories : includes,
1864 link_with : [libshared],
1865 install_rpath : rootlibexecdir,
1866 install : true,
1867 install_dir : systemgeneratordir)
1868
1869 executable(
1870 'systemd-hibernate-resume',
1871 'src/hibernate-resume/hibernate-resume.c',
1872 include_directories : includes,
1873 link_with : [libshared],
1874 install_rpath : rootlibexecdir,
1875 install : true,
1876 install_dir : rootlibexecdir)
1877 endif
1878
1879 if conf.get('HAVE_BLKID') == 1
1880 executable(
1881 'systemd-gpt-auto-generator',
1882 'src/gpt-auto-generator/gpt-auto-generator.c',
1883 'src/shared/blkid-util.h',
1884 include_directories : includes,
1885 link_with : [libshared],
1886 dependencies : libblkid,
1887 install_rpath : rootlibexecdir,
1888 install : true,
1889 install_dir : systemgeneratordir)
1890
1891 public_programs += executable(
1892 'systemd-dissect',
1893 'src/dissect/dissect.c',
1894 include_directories : includes,
1895 link_with : [libshared],
1896 install_rpath : rootlibexecdir,
1897 install : true,
1898 install_dir : rootlibexecdir)
1899 endif
1900
1901 if conf.get('ENABLE_RESOLVE') == 1
1902 executable(
1903 'systemd-resolved',
1904 systemd_resolved_sources,
1905 include_directories : includes,
1906 link_with : [libshared,
1907 libbasic_gcrypt,
1908 libsystemd_resolve_core],
1909 dependencies : systemd_resolved_dependencies,
1910 install_rpath : rootlibexecdir,
1911 install : true,
1912 install_dir : rootlibexecdir)
1913
1914 public_programs += executable(
1915 'resolvectl',
1916 resolvectl_sources,
1917 include_directories : includes,
1918 link_with : [libshared,
1919 libbasic_gcrypt,
1920 libsystemd_resolve_core],
1921 dependencies : [threads,
1922 libgpg_error,
1923 libm,
1924 libidn],
1925 install_rpath : rootlibexecdir,
1926 install : true)
1927
1928 meson.add_install_script(meson_make_symlink,
1929 join_paths(bindir, 'resolvectl'),
1930 join_paths(rootsbindir, 'resolvconf'))
1931
1932 meson.add_install_script(meson_make_symlink,
1933 join_paths(bindir, 'resolvectl'),
1934 join_paths(bindir, 'systemd-resolve'))
1935 endif
1936
1937 if conf.get('ENABLE_LOGIND') == 1
1938 executable(
1939 'systemd-logind',
1940 systemd_logind_sources,
1941 include_directories : includes,
1942 link_with : [liblogind_core,
1943 libshared],
1944 dependencies : [threads,
1945 libacl],
1946 install_rpath : rootlibexecdir,
1947 install : true,
1948 install_dir : rootlibexecdir)
1949
1950 public_programs += executable(
1951 'loginctl',
1952 loginctl_sources,
1953 include_directories : includes,
1954 link_with : [libshared],
1955 dependencies : [threads,
1956 liblz4,
1957 libxz,
1958 libzstd],
1959 install_rpath : rootlibexecdir,
1960 install : true,
1961 install_dir : rootbindir)
1962
1963 public_programs += executable(
1964 'systemd-inhibit',
1965 'src/login/inhibit.c',
1966 include_directories : includes,
1967 link_with : [libshared],
1968 install_rpath : rootlibexecdir,
1969 install : true,
1970 install_dir : rootbindir)
1971
1972 if conf.get('HAVE_PAM') == 1
1973 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1974 pam_systemd = shared_library(
1975 'pam_systemd',
1976 pam_systemd_c,
1977 name_prefix : '',
1978 include_directories : includes,
1979 link_args : ['-shared',
1980 '-Wl,--version-script=' + version_script_arg],
1981 link_with : [libsystemd_static,
1982 libshared_static],
1983 dependencies : [threads,
1984 libpam,
1985 libpam_misc],
1986 link_depends : pam_systemd_sym,
1987 install : true,
1988 install_dir : pamlibdir)
1989
1990 if want_tests != 'false'
1991 test('dlopen-pam_systemd',
1992 test_dlopen,
1993 # path to dlopen must include a slash
1994 args : pam_systemd.full_path())
1995 endif
1996 endif
1997
1998 executable(
1999 'systemd-user-runtime-dir',
2000 user_runtime_dir_sources,
2001 include_directories : includes,
2002 link_with : [libshared],
2003 install_rpath : rootlibexecdir,
2004 install : true,
2005 install_dir : rootlibexecdir)
2006 endif
2007
2008 if conf.get('HAVE_PAM') == 1
2009 executable(
2010 'systemd-user-sessions',
2011 'src/user-sessions/user-sessions.c',
2012 include_directories : includes,
2013 link_with : [libshared],
2014 install_rpath : rootlibexecdir,
2015 install : true,
2016 install_dir : rootlibexecdir)
2017 endif
2018
2019 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2020 public_programs += executable(
2021 'bootctl',
2022 'src/boot/bootctl.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [libblkid],
2026 install_rpath : rootlibexecdir,
2027 install : true)
2028
2029 public_programs += executable(
2030 'systemd-bless-boot',
2031 'src/boot/bless-boot.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 dependencies : [libblkid],
2035 install_rpath : rootlibexecdir,
2036 install : true,
2037 install_dir : rootlibexecdir)
2038
2039 executable(
2040 'systemd-bless-boot-generator',
2041 'src/boot/bless-boot-generator.c',
2042 include_directories : includes,
2043 link_with : [libshared],
2044 install_rpath : rootlibexecdir,
2045 install : true,
2046 install_dir : systemgeneratordir)
2047 endif
2048
2049 executable(
2050 'systemd-boot-check-no-failures',
2051 'src/boot/boot-check-no-failures.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 dependencies : [libblkid],
2055 install_rpath : rootlibexecdir,
2056 install : true,
2057 install_dir : rootlibexecdir)
2058
2059 public_programs += executable(
2060 'systemd-socket-activate',
2061 'src/activate/activate.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 dependencies : [threads],
2065 install_rpath : rootlibexecdir,
2066 install : true)
2067
2068 if get_option('link-systemctl-shared')
2069 systemctl_link_with = [libshared]
2070 else
2071 systemctl_link_with = [libsystemd_static,
2072 libshared_static,
2073 libjournal_client,
2074 libbasic_gcrypt]
2075 endif
2076
2077 public_programs += executable(
2078 'systemctl',
2079 'src/systemctl/systemctl.c',
2080 'src/systemctl/sysv-compat.h',
2081 'src/systemctl/sysv-compat.c',
2082 include_directories : includes,
2083 link_with : systemctl_link_with,
2084 dependencies : [threads,
2085 libcap,
2086 libselinux,
2087 libxz,
2088 liblz4,
2089 libzstd],
2090 install_rpath : rootlibexecdir,
2091 install : true,
2092 install_dir : rootbindir)
2093
2094 if conf.get('ENABLE_PORTABLED') == 1
2095 executable(
2096 'systemd-portabled',
2097 systemd_portabled_sources,
2098 include_directories : includes,
2099 link_with : [libshared],
2100 dependencies : [threads],
2101 install_rpath : rootlibexecdir,
2102 install : true,
2103 install_dir : rootlibexecdir)
2104
2105 public_programs += executable(
2106 'portablectl',
2107 'src/portable/portablectl.c',
2108 include_directories : includes,
2109 link_with : [libshared],
2110 dependencies : [threads],
2111 install_rpath : rootlibexecdir,
2112 install : true,
2113 install_dir : rootbindir)
2114 endif
2115
2116 if conf.get('ENABLE_USERDB') == 1
2117 executable(
2118 'systemd-userwork',
2119 systemd_userwork_sources,
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [threads],
2123 install_rpath : rootlibexecdir,
2124 install : true,
2125 install_dir : rootlibexecdir)
2126
2127 executable(
2128 'systemd-userdbd',
2129 systemd_userdbd_sources,
2130 include_directories : includes,
2131 link_with : [libshared],
2132 dependencies : [threads],
2133 install_rpath : rootlibexecdir,
2134 install : true,
2135 install_dir : rootlibexecdir)
2136
2137 public_programs += executable(
2138 'userdbctl',
2139 userdbctl_sources,
2140 include_directories : includes,
2141 link_with : [libshared],
2142 dependencies : [threads],
2143 install_rpath : rootlibexecdir,
2144 install : true,
2145 install_dir : rootbindir)
2146 endif
2147
2148 if conf.get('ENABLE_HOMED') == 1
2149 executable(
2150 'systemd-homework',
2151 systemd_homework_sources,
2152 include_directories : includes,
2153 link_with : [libshared],
2154 dependencies : [threads,
2155 libcryptsetup,
2156 libblkid,
2157 libcrypt,
2158 libopenssl,
2159 libfdisk,
2160 libp11kit,
2161 libfido2],
2162 install_rpath : rootlibexecdir,
2163 install : true,
2164 install_dir : rootlibexecdir)
2165
2166 executable(
2167 'systemd-homed',
2168 systemd_homed_sources,
2169 include_directories : includes,
2170 link_with : [libshared],
2171 dependencies : [threads,
2172 libcrypt,
2173 libopenssl,
2174 libpwquality],
2175 install_rpath : rootlibexecdir,
2176 install : true,
2177 install_dir : rootlibexecdir)
2178
2179 public_programs += executable(
2180 'homectl',
2181 homectl_sources,
2182 include_directories : includes,
2183 link_with : [libshared],
2184 dependencies : [threads,
2185 libcrypt,
2186 libopenssl,
2187 libp11kit,
2188 libfido2,
2189 libpwquality],
2190 install_rpath : rootlibexecdir,
2191 install : true,
2192 install_dir : rootbindir)
2193
2194 if conf.get('HAVE_PAM') == 1
2195 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2196 pam_systemd = shared_library(
2197 'pam_systemd_home',
2198 pam_systemd_home_c,
2199 name_prefix : '',
2200 include_directories : includes,
2201 link_args : ['-shared',
2202 '-Wl,--version-script=' + version_script_arg],
2203 link_with : [libsystemd_static,
2204 libshared_static],
2205 dependencies : [threads,
2206 libpam,
2207 libpam_misc,
2208 libcrypt],
2209 link_depends : pam_systemd_home_sym,
2210 install : true,
2211 install_dir : pamlibdir)
2212 endif
2213 endif
2214
2215 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2216 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2217 meson.add_install_script(meson_make_symlink,
2218 join_paths(rootbindir, 'systemctl'),
2219 join_paths(rootsbindir, alias))
2220 endforeach
2221
2222 meson.add_install_script(meson_make_symlink,
2223 join_paths(rootbindir, 'udevadm'),
2224 join_paths(rootlibexecdir, 'systemd-udevd'))
2225
2226 if conf.get('ENABLE_BACKLIGHT') == 1
2227 executable(
2228 'systemd-backlight',
2229 'src/backlight/backlight.c',
2230 include_directories : includes,
2231 link_with : [libshared],
2232 install_rpath : rootlibexecdir,
2233 install : true,
2234 install_dir : rootlibexecdir)
2235 endif
2236
2237 if conf.get('ENABLE_RFKILL') == 1
2238 executable(
2239 'systemd-rfkill',
2240 'src/rfkill/rfkill.c',
2241 include_directories : includes,
2242 link_with : [libshared],
2243 install_rpath : rootlibexecdir,
2244 install : true,
2245 install_dir : rootlibexecdir)
2246 endif
2247
2248 executable(
2249 'systemd-system-update-generator',
2250 'src/system-update-generator/system-update-generator.c',
2251 include_directories : includes,
2252 link_with : [libshared],
2253 install_rpath : rootlibexecdir,
2254 install : true,
2255 install_dir : systemgeneratordir)
2256
2257 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2258 systemd_cryptsetup_sources = files('''
2259 src/cryptsetup/cryptsetup-pkcs11.h
2260 src/cryptsetup/cryptsetup-util.c
2261 src/cryptsetup/cryptsetup-util.h
2262 src/cryptsetup/cryptsetup.c
2263 '''.split())
2264
2265 if conf.get('HAVE_P11KIT') == 1
2266 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2267 endif
2268
2269 executable(
2270 'systemd-cryptsetup',
2271 systemd_cryptsetup_sources,
2272 include_directories : includes,
2273 link_with : [libshared],
2274 dependencies : [libcryptsetup,
2275 libp11kit],
2276 install_rpath : rootlibexecdir,
2277 install : true,
2278 install_dir : rootlibexecdir)
2279
2280 executable(
2281 'systemd-cryptsetup-generator',
2282 'src/cryptsetup/cryptsetup-generator.c',
2283 include_directories : includes,
2284 link_with : [libshared],
2285 dependencies : [libcryptsetup],
2286 install_rpath : rootlibexecdir,
2287 install : true,
2288 install_dir : systemgeneratordir)
2289
2290 executable(
2291 'systemd-veritysetup',
2292 'src/veritysetup/veritysetup.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 dependencies : [libcryptsetup],
2296 install_rpath : rootlibexecdir,
2297 install : true,
2298 install_dir : rootlibexecdir)
2299
2300 executable(
2301 'systemd-veritysetup-generator',
2302 'src/veritysetup/veritysetup-generator.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 dependencies : [libcryptsetup],
2306 install_rpath : rootlibexecdir,
2307 install : true,
2308 install_dir : systemgeneratordir)
2309 endif
2310
2311 if conf.get('HAVE_SYSV_COMPAT') == 1
2312 executable(
2313 'systemd-sysv-generator',
2314 'src/sysv-generator/sysv-generator.c',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 install_rpath : rootlibexecdir,
2318 install : true,
2319 install_dir : systemgeneratordir)
2320
2321 executable(
2322 'systemd-rc-local-generator',
2323 'src/rc-local-generator/rc-local-generator.c',
2324 include_directories : includes,
2325 link_with : [libshared],
2326 install_rpath : rootlibexecdir,
2327 install : true,
2328 install_dir : systemgeneratordir)
2329 endif
2330
2331 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2332 executable(
2333 'systemd-xdg-autostart-generator',
2334 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2335 'src/xdg-autostart-generator/xdg-autostart-service.c',
2336 include_directories : includes,
2337 link_with : [libshared],
2338 install_rpath : rootlibexecdir,
2339 install : true,
2340 install_dir : usergeneratordir)
2341
2342 executable(
2343 'systemd-xdg-autostart-condition',
2344 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2348 install : true,
2349 install_dir : rootlibexecdir)
2350 endif
2351
2352 if conf.get('ENABLE_HOSTNAMED') == 1
2353 executable(
2354 'systemd-hostnamed',
2355 'src/hostname/hostnamed.c',
2356 include_directories : includes,
2357 link_with : [libshared],
2358 install_rpath : rootlibexecdir,
2359 install : true,
2360 install_dir : rootlibexecdir)
2361
2362 public_programs += executable(
2363 'hostnamectl',
2364 'src/hostname/hostnamectl.c',
2365 include_directories : includes,
2366 link_with : [libshared],
2367 install_rpath : rootlibexecdir,
2368 install : true)
2369 endif
2370
2371 if conf.get('ENABLE_LOCALED') == 1
2372 if conf.get('HAVE_XKBCOMMON') == 1
2373 # logind will load libxkbcommon.so dynamically on its own
2374 deps = [libdl]
2375 else
2376 deps = []
2377 endif
2378
2379 executable(
2380 'systemd-localed',
2381 systemd_localed_sources,
2382 include_directories : includes,
2383 link_with : [libshared],
2384 dependencies : deps,
2385 install_rpath : rootlibexecdir,
2386 install : true,
2387 install_dir : rootlibexecdir)
2388
2389 public_programs += executable(
2390 'localectl',
2391 localectl_sources,
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2395 install : true)
2396 endif
2397
2398 if conf.get('ENABLE_TIMEDATED') == 1
2399 executable(
2400 'systemd-timedated',
2401 'src/timedate/timedated.c',
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2405 install : true,
2406 install_dir : rootlibexecdir)
2407 endif
2408
2409 if conf.get('ENABLE_TIMEDATECTL') == 1
2410 public_programs += executable(
2411 'timedatectl',
2412 'src/timedate/timedatectl.c',
2413 include_directories : includes,
2414 install_rpath : rootlibexecdir,
2415 link_with : [libshared],
2416 dependencies : [libm],
2417 install : true)
2418 endif
2419
2420 if conf.get('ENABLE_TIMESYNCD') == 1
2421 if get_option('link-timesyncd-shared')
2422 timesyncd_link_with = [libshared]
2423 else
2424 timesyncd_link_with = [libsystemd_static,
2425 libshared_static,
2426 libjournal_client,
2427 libbasic_gcrypt]
2428 endif
2429
2430 executable(
2431 'systemd-timesyncd',
2432 systemd_timesyncd_sources,
2433 include_directories : includes,
2434 link_with : [timesyncd_link_with],
2435 dependencies : [threads,
2436 libm],
2437 install_rpath : rootlibexecdir,
2438 install : true,
2439 install_dir : rootlibexecdir)
2440
2441 executable(
2442 'systemd-time-wait-sync',
2443 'src/time-wait-sync/time-wait-sync.c',
2444 include_directories : includes,
2445 link_with : [timesyncd_link_with],
2446 install_rpath : rootlibexecdir,
2447 install : true,
2448 install_dir : rootlibexecdir)
2449 endif
2450
2451 if conf.get('ENABLE_MACHINED') == 1
2452 executable(
2453 'systemd-machined',
2454 systemd_machined_sources,
2455 include_directories : includes,
2456 link_with : [libmachine_core,
2457 libshared],
2458 install_rpath : rootlibexecdir,
2459 install : true,
2460 install_dir : rootlibexecdir)
2461
2462 public_programs += executable(
2463 'machinectl',
2464 'src/machine/machinectl.c',
2465 include_directories : includes,
2466 link_with : [libshared],
2467 dependencies : [threads,
2468 libxz,
2469 liblz4,
2470 libzstd],
2471 install_rpath : rootlibexecdir,
2472 install : true,
2473 install_dir : rootbindir)
2474 endif
2475
2476 if conf.get('ENABLE_IMPORTD') == 1
2477 executable(
2478 'systemd-importd',
2479 systemd_importd_sources,
2480 include_directories : includes,
2481 link_with : [libshared],
2482 dependencies : [threads],
2483 install_rpath : rootlibexecdir,
2484 install : true,
2485 install_dir : rootlibexecdir)
2486
2487 systemd_pull = executable(
2488 'systemd-pull',
2489 systemd_pull_sources,
2490 include_directories : includes,
2491 link_with : [libshared],
2492 dependencies : [versiondep,
2493 libcurl,
2494 libz,
2495 libbzip2,
2496 libxz,
2497 libgcrypt],
2498 install_rpath : rootlibexecdir,
2499 install : true,
2500 install_dir : rootlibexecdir)
2501
2502 systemd_import = executable(
2503 'systemd-import',
2504 systemd_import_sources,
2505 include_directories : includes,
2506 link_with : [libshared],
2507 dependencies : [libcurl,
2508 libz,
2509 libbzip2,
2510 libxz],
2511 install_rpath : rootlibexecdir,
2512 install : true,
2513 install_dir : rootlibexecdir)
2514
2515 systemd_import_fs = executable(
2516 'systemd-import-fs',
2517 systemd_import_fs_sources,
2518 include_directories : includes,
2519 link_with : [libshared],
2520 install_rpath : rootlibexecdir,
2521 install : true,
2522 install_dir : rootlibexecdir)
2523
2524 systemd_export = executable(
2525 'systemd-export',
2526 systemd_export_sources,
2527 include_directories : includes,
2528 link_with : [libshared],
2529 dependencies : [libcurl,
2530 libz,
2531 libbzip2,
2532 libxz],
2533 install_rpath : rootlibexecdir,
2534 install : true,
2535 install_dir : rootlibexecdir)
2536
2537 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2538 endif
2539
2540 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2541 public_programs += executable(
2542 'systemd-journal-upload',
2543 systemd_journal_upload_sources,
2544 include_directories : includes,
2545 link_with : [libshared],
2546 dependencies : [versiondep,
2547 threads,
2548 libcurl,
2549 libgnutls,
2550 libxz,
2551 liblz4,
2552 libzstd],
2553 install_rpath : rootlibexecdir,
2554 install : true,
2555 install_dir : rootlibexecdir)
2556 endif
2557
2558 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2559 public_programs += executable(
2560 'systemd-journal-remote',
2561 systemd_journal_remote_sources,
2562 include_directories : includes,
2563 link_with : [libshared,
2564 libsystemd_journal_remote],
2565 dependencies : [threads,
2566 libmicrohttpd,
2567 libgnutls,
2568 libxz,
2569 liblz4,
2570 libzstd],
2571 install_rpath : rootlibexecdir,
2572 install : true,
2573 install_dir : rootlibexecdir)
2574
2575 public_programs += executable(
2576 'systemd-journal-gatewayd',
2577 systemd_journal_gatewayd_sources,
2578 include_directories : includes,
2579 link_with : [libshared],
2580 dependencies : [threads,
2581 libmicrohttpd,
2582 libgnutls,
2583 libxz,
2584 liblz4,
2585 libzstd],
2586 install_rpath : rootlibexecdir,
2587 install : true,
2588 install_dir : rootlibexecdir)
2589 endif
2590
2591 if conf.get('ENABLE_COREDUMP') == 1
2592 executable(
2593 'systemd-coredump',
2594 systemd_coredump_sources,
2595 include_directories : includes,
2596 link_with : [libshared],
2597 dependencies : [threads,
2598 libacl,
2599 libdw,
2600 libxz,
2601 liblz4,
2602 libzstd],
2603 install_rpath : rootlibexecdir,
2604 install : true,
2605 install_dir : rootlibexecdir)
2606
2607 public_programs += executable(
2608 'coredumpctl',
2609 coredumpctl_sources,
2610 include_directories : includes,
2611 link_with : [libshared],
2612 dependencies : [threads,
2613 libxz,
2614 liblz4,
2615 libzstd],
2616 install_rpath : rootlibexecdir,
2617 install : true)
2618 endif
2619
2620 if conf.get('ENABLE_PSTORE') == 1
2621 executable(
2622 'systemd-pstore',
2623 systemd_pstore_sources,
2624 include_directories : includes,
2625 link_with : [libshared],
2626 dependencies : [threads,
2627 libacl,
2628 libdw,
2629 libxz,
2630 liblz4,
2631 libzstd],
2632 install_rpath : rootlibexecdir,
2633 install : true,
2634 install_dir : rootlibexecdir)
2635 endif
2636
2637 if conf.get('ENABLE_BINFMT') == 1
2638 public_programs += executable(
2639 'systemd-binfmt',
2640 'src/binfmt/binfmt.c',
2641 include_directories : includes,
2642 link_with : [libshared],
2643 install_rpath : rootlibexecdir,
2644 install : true,
2645 install_dir : rootlibexecdir)
2646
2647 meson.add_install_script('sh', '-c',
2648 mkdir_p.format(binfmtdir))
2649 meson.add_install_script('sh', '-c',
2650 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2651 endif
2652
2653 if conf.get('ENABLE_REPART') == 1
2654 exe = executable(
2655 'systemd-repart',
2656 systemd_repart_sources,
2657 include_directories : includes,
2658 link_with : [libshared],
2659 dependencies : [threads,
2660 libcryptsetup,
2661 libblkid,
2662 libfdisk,
2663 libopenssl],
2664 install_rpath : rootlibexecdir,
2665 install : true,
2666 install_dir : rootbindir)
2667
2668 if want_tests != 'false'
2669 test('test-repart',
2670 test_repart_sh,
2671 args : exe.full_path())
2672 endif
2673 endif
2674
2675 if conf.get('ENABLE_VCONSOLE') == 1
2676 executable(
2677 'systemd-vconsole-setup',
2678 'src/vconsole/vconsole-setup.c',
2679 include_directories : includes,
2680 link_with : [libshared],
2681 install_rpath : rootlibexecdir,
2682 install : true,
2683 install_dir : rootlibexecdir)
2684 endif
2685
2686 if conf.get('ENABLE_RANDOMSEED') == 1
2687 executable(
2688 'systemd-random-seed',
2689 'src/random-seed/random-seed.c',
2690 include_directories : includes,
2691 link_with : [libshared],
2692 install_rpath : rootlibexecdir,
2693 install : true,
2694 install_dir : rootlibexecdir)
2695 endif
2696
2697 if conf.get('ENABLE_FIRSTBOOT') == 1
2698 executable(
2699 'systemd-firstboot',
2700 'src/firstboot/firstboot.c',
2701 include_directories : includes,
2702 link_with : [libshared],
2703 dependencies : [libcrypt],
2704 install_rpath : rootlibexecdir,
2705 install : true,
2706 install_dir : rootbindir)
2707 endif
2708
2709 executable(
2710 'systemd-remount-fs',
2711 'src/remount-fs/remount-fs.c',
2712 include_directories : includes,
2713 link_with : [libcore_shared,
2714 libshared],
2715 install_rpath : rootlibexecdir,
2716 install : true,
2717 install_dir : rootlibexecdir)
2718
2719 executable(
2720 'systemd-machine-id-setup',
2721 'src/machine-id-setup/machine-id-setup-main.c',
2722 include_directories : includes,
2723 link_with : [libcore_shared,
2724 libshared],
2725 install_rpath : rootlibexecdir,
2726 install : true,
2727 install_dir : rootbindir)
2728
2729 executable(
2730 'systemd-fsck',
2731 'src/fsck/fsck.c',
2732 include_directories : includes,
2733 link_with : [libshared],
2734 install_rpath : rootlibexecdir,
2735 install : true,
2736 install_dir : rootlibexecdir)
2737
2738 executable('systemd-growfs',
2739 'src/partition/growfs.c',
2740 include_directories : includes,
2741 link_with : [libshared],
2742 dependencies : [libcryptsetup],
2743 install_rpath : rootlibexecdir,
2744 install : true,
2745 install_dir : rootlibexecdir)
2746
2747 executable(
2748 'systemd-makefs',
2749 'src/partition/makefs.c',
2750 include_directories : includes,
2751 link_with : [libshared],
2752 install_rpath : rootlibexecdir,
2753 install : true,
2754 install_dir : rootlibexecdir)
2755
2756 executable(
2757 'systemd-sleep',
2758 'src/sleep/sleep.c',
2759 include_directories : includes,
2760 link_with : [libshared],
2761 install_rpath : rootlibexecdir,
2762 install : true,
2763 install_dir : rootlibexecdir)
2764
2765 install_data('src/sleep/sleep.conf',
2766 install_dir : pkgsysconfdir)
2767
2768 public_programs += executable(
2769 'systemd-sysctl',
2770 'src/sysctl/sysctl.c',
2771 include_directories : includes,
2772 link_with : [libshared],
2773 install_rpath : rootlibexecdir,
2774 install : true,
2775 install_dir : rootlibexecdir)
2776
2777 executable(
2778 'systemd-ac-power',
2779 'src/ac-power/ac-power.c',
2780 include_directories : includes,
2781 link_with : [libshared],
2782 install_rpath : rootlibexecdir,
2783 install : true,
2784 install_dir : rootlibexecdir)
2785
2786 public_programs += executable(
2787 'systemd-detect-virt',
2788 'src/detect-virt/detect-virt.c',
2789 include_directories : includes,
2790 link_with : [libshared],
2791 install_rpath : rootlibexecdir,
2792 install : true)
2793
2794 public_programs += executable(
2795 'systemd-delta',
2796 'src/delta/delta.c',
2797 include_directories : includes,
2798 link_with : [libshared],
2799 install_rpath : rootlibexecdir,
2800 install : true)
2801
2802 public_programs += executable(
2803 'systemd-escape',
2804 'src/escape/escape.c',
2805 include_directories : includes,
2806 link_with : [libshared],
2807 install_rpath : rootlibexecdir,
2808 install : true,
2809 install_dir : rootbindir)
2810
2811 public_programs += executable(
2812 'systemd-notify',
2813 'src/notify/notify.c',
2814 include_directories : includes,
2815 link_with : [libshared],
2816 install_rpath : rootlibexecdir,
2817 install : true,
2818 install_dir : rootbindir)
2819
2820 executable(
2821 'systemd-volatile-root',
2822 'src/volatile-root/volatile-root.c',
2823 include_directories : includes,
2824 link_with : [libshared],
2825 install_rpath : rootlibexecdir,
2826 install : conf.get('ENABLE_INITRD') == 1,
2827 install_dir : rootlibexecdir)
2828
2829 executable(
2830 'systemd-cgroups-agent',
2831 'src/cgroups-agent/cgroups-agent.c',
2832 include_directories : includes,
2833 link_with : [libshared],
2834 install_rpath : rootlibexecdir,
2835 install : true,
2836 install_dir : rootlibexecdir)
2837
2838 public_programs += executable(
2839 'systemd-id128',
2840 'src/id128/id128.c',
2841 include_directories : includes,
2842 link_with : [libshared],
2843 install_rpath : rootlibexecdir,
2844 install : true)
2845
2846 public_programs += executable(
2847 'systemd-path',
2848 'src/path/path.c',
2849 include_directories : includes,
2850 link_with : [libshared],
2851 install_rpath : rootlibexecdir,
2852 install : true)
2853
2854 public_programs += executable(
2855 'systemd-ask-password',
2856 'src/ask-password/ask-password.c',
2857 include_directories : includes,
2858 link_with : [libshared],
2859 install_rpath : rootlibexecdir,
2860 install : true,
2861 install_dir : rootbindir)
2862
2863 executable(
2864 'systemd-reply-password',
2865 'src/reply-password/reply-password.c',
2866 include_directories : includes,
2867 link_with : [libshared],
2868 install_rpath : rootlibexecdir,
2869 install : true,
2870 install_dir : rootlibexecdir)
2871
2872 public_programs += executable(
2873 'systemd-tty-ask-password-agent',
2874 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2875 include_directories : includes,
2876 link_with : [libshared],
2877 install_rpath : rootlibexecdir,
2878 install : true,
2879 install_dir : rootbindir)
2880
2881 public_programs += executable(
2882 'systemd-cgls',
2883 'src/cgls/cgls.c',
2884 include_directories : includes,
2885 link_with : [libshared],
2886 install_rpath : rootlibexecdir,
2887 install : true)
2888
2889 public_programs += executable(
2890 'systemd-cgtop',
2891 'src/cgtop/cgtop.c',
2892 include_directories : includes,
2893 link_with : [libshared],
2894 install_rpath : rootlibexecdir,
2895 install : true)
2896
2897 executable(
2898 'systemd-initctl',
2899 'src/initctl/initctl.c',
2900 include_directories : includes,
2901 link_with : [libshared],
2902 install_rpath : rootlibexecdir,
2903 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2904 install_dir : rootlibexecdir)
2905
2906 public_programs += executable(
2907 'systemd-mount',
2908 'src/mount/mount-tool.c',
2909 include_directories : includes,
2910 link_with : [libshared],
2911 dependencies: [libmount],
2912 install_rpath : rootlibexecdir,
2913 install : true)
2914
2915 meson.add_install_script(meson_make_symlink,
2916 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2917
2918 public_programs += executable(
2919 'systemd-run',
2920 'src/run/run.c',
2921 include_directories : includes,
2922 link_with : [libshared],
2923 install_rpath : rootlibexecdir,
2924 install : true)
2925
2926 public_programs += executable(
2927 'systemd-stdio-bridge',
2928 'src/stdio-bridge/stdio-bridge.c',
2929 include_directories : includes,
2930 link_with : [libshared],
2931 dependencies : [versiondep],
2932 install_rpath : rootlibexecdir,
2933 install : true)
2934
2935 public_programs += executable(
2936 'busctl',
2937 'src/busctl/busctl.c',
2938 'src/busctl/busctl-introspect.c',
2939 'src/busctl/busctl-introspect.h',
2940 include_directories : includes,
2941 link_with : [libshared],
2942 install_rpath : rootlibexecdir,
2943 install : true)
2944
2945 if conf.get('ENABLE_SYSUSERS') == 1
2946 public_programs += executable(
2947 'systemd-sysusers',
2948 'src/sysusers/sysusers.c',
2949 include_directories : includes,
2950 link_with : [libshared],
2951 install_rpath : rootlibexecdir,
2952 install : true,
2953 install_dir : rootbindir)
2954
2955 if have_standalone_binaries
2956 public_programs += executable(
2957 'systemd-sysusers.standalone',
2958 'src/sysusers/sysusers.c',
2959 include_directories : includes,
2960 link_with : [libshared_static,
2961 libbasic,
2962 libbasic_gcrypt,
2963 libsystemd_static,
2964 libjournal_client],
2965 install : true,
2966 install_dir : rootbindir)
2967 endif
2968 endif
2969
2970 if conf.get('ENABLE_TMPFILES') == 1
2971 exe = executable(
2972 'systemd-tmpfiles',
2973 systemd_tmpfiles_sources,
2974 include_directories : includes,
2975 link_with : [libshared],
2976 dependencies : [libacl],
2977 install_rpath : rootlibexecdir,
2978 install : true,
2979 install_dir : rootbindir)
2980 public_programs += exe
2981
2982 if want_tests != 'false'
2983 test('test-systemd-tmpfiles',
2984 test_systemd_tmpfiles_py,
2985 # https://github.com/mesonbuild/meson/issues/2681
2986 args : exe.full_path())
2987 endif
2988
2989 if have_standalone_binaries
2990 public_programs += executable(
2991 'systemd-tmpfiles.standalone',
2992 systemd_tmpfiles_sources,
2993 include_directories : includes,
2994 link_with : [libshared_static,
2995 libbasic,
2996 libbasic_gcrypt,
2997 libsystemd_static,
2998 libjournal_client],
2999 dependencies : [libacl],
3000 install : true,
3001 install_dir : rootbindir)
3002 endif
3003 endif
3004
3005 if conf.get('ENABLE_HWDB') == 1
3006 public_programs += executable(
3007 'systemd-hwdb',
3008 'src/hwdb/hwdb.c',
3009 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3010 include_directories : includes,
3011 link_with : [libudev_static],
3012 install_rpath : udev_rpath,
3013 install : true,
3014 install_dir : rootbindir)
3015 endif
3016
3017 if conf.get('ENABLE_QUOTACHECK') == 1
3018 executable(
3019 'systemd-quotacheck',
3020 'src/quotacheck/quotacheck.c',
3021 include_directories : includes,
3022 link_with : [libshared],
3023 install_rpath : rootlibexecdir,
3024 install : true,
3025 install_dir : rootlibexecdir)
3026 endif
3027
3028 public_programs += executable(
3029 'systemd-socket-proxyd',
3030 'src/socket-proxy/socket-proxyd.c',
3031 include_directories : includes,
3032 link_with : [libshared],
3033 dependencies : [threads],
3034 install_rpath : rootlibexecdir,
3035 install : true,
3036 install_dir : rootlibexecdir)
3037
3038 public_programs += executable(
3039 'udevadm',
3040 udevadm_sources,
3041 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3042 include_directories : includes,
3043 link_with : [libudev_core,
3044 libsystemd_network,
3045 libudev_static],
3046 dependencies : [versiondep,
3047 threads,
3048 libkmod,
3049 libidn,
3050 libacl,
3051 libblkid],
3052 install_rpath : udev_rpath,
3053 install : true,
3054 install_dir : rootbindir)
3055
3056 executable(
3057 'systemd-shutdown',
3058 systemd_shutdown_sources,
3059 include_directories : includes,
3060 link_with : [libcore_shared,
3061 libshared],
3062 dependencies : [libmount],
3063 install_rpath : rootlibexecdir,
3064 install : true,
3065 install_dir : rootlibexecdir)
3066
3067 executable(
3068 'systemd-update-done',
3069 'src/update-done/update-done.c',
3070 include_directories : includes,
3071 link_with : [libshared],
3072 install_rpath : rootlibexecdir,
3073 install : true,
3074 install_dir : rootlibexecdir)
3075
3076 executable(
3077 'systemd-update-utmp',
3078 'src/update-utmp/update-utmp.c',
3079 include_directories : includes,
3080 link_with : [libshared],
3081 dependencies : [libaudit],
3082 install_rpath : rootlibexecdir,
3083 install : (conf.get('ENABLE_UTMP') == 1),
3084 install_dir : rootlibexecdir)
3085
3086 if conf.get('HAVE_KMOD') == 1
3087 executable(
3088 'systemd-modules-load',
3089 'src/modules-load/modules-load.c',
3090 include_directories : includes,
3091 link_with : [libshared],
3092 dependencies : [libkmod],
3093 install_rpath : rootlibexecdir,
3094 install : true,
3095 install_dir : rootlibexecdir)
3096
3097 meson.add_install_script('sh', '-c',
3098 mkdir_p.format(modulesloaddir))
3099 meson.add_install_script('sh', '-c',
3100 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3101 endif
3102
3103 public_programs += executable(
3104 'systemd-nspawn',
3105 systemd_nspawn_sources,
3106 include_directories : includes,
3107 link_with : [libcore_shared,
3108 libnspawn_core,
3109 libshared],
3110 dependencies : [libblkid,
3111 libseccomp],
3112 install_rpath : rootlibexecdir,
3113 install : true)
3114
3115 if conf.get('ENABLE_NETWORKD') == 1
3116 executable(
3117 'systemd-networkd',
3118 systemd_networkd_sources,
3119 include_directories : network_include_dir,
3120 link_with : [libnetworkd_core,
3121 libsystemd_network,
3122 libudev_static,
3123 networkd_link_with],
3124 dependencies : [threads],
3125 install_rpath : rootlibexecdir,
3126 install : true,
3127 install_dir : rootlibexecdir)
3128
3129 executable(
3130 'systemd-networkd-wait-online',
3131 systemd_networkd_wait_online_sources,
3132 include_directories : includes,
3133 link_with : [libnetworkd_core,
3134 networkd_link_with],
3135 install_rpath : rootlibexecdir,
3136 install : true,
3137 install_dir : rootlibexecdir)
3138
3139 public_programs += executable(
3140 'networkctl',
3141 networkctl_sources,
3142 include_directories : includes,
3143 link_with : [libsystemd_network,
3144 networkd_link_with],
3145 install_rpath : rootlibexecdir,
3146 install : true,
3147 install_dir : rootbindir)
3148
3149 exe = executable(
3150 'systemd-network-generator',
3151 network_generator_sources,
3152 include_directories : includes,
3153 link_with : [networkd_link_with],
3154 install_rpath : rootlibexecdir,
3155 install : true,
3156 install_dir : rootlibexecdir)
3157
3158 if want_tests != 'false'
3159 test('test-network-generator-conversion',
3160 test_network_generator_conversion_sh,
3161 # https://github.com/mesonbuild/meson/issues/2681
3162 args : exe.full_path())
3163 endif
3164 endif
3165
3166 executable(
3167 'systemd-sulogin-shell',
3168 ['src/sulogin-shell/sulogin-shell.c'],
3169 include_directories : includes,
3170 link_with : [libshared],
3171 install_rpath : rootlibexecdir,
3172 install : true,
3173 install_dir : rootlibexecdir)
3174
3175 ############################################################
3176
3177 custom_target(
3178 'systemd-runtest.env',
3179 output : 'systemd-runtest.env',
3180 command : ['sh', '-c', '{ ' +
3181 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3182 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3183 '} >@OUTPUT@'],
3184 build_by_default : true)
3185
3186 foreach tuple : tests
3187 sources = tuple[0]
3188 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3189 dependencies = tuple[2]
3190 condition = tuple.length() >= 4 ? tuple[3] : ''
3191 type = tuple.length() >= 5 ? tuple[4] : ''
3192 defs = tuple.length() >= 6 ? tuple[5] : []
3193 incs = tuple.length() >= 7 ? tuple[6] : includes
3194 timeout = 30
3195
3196 name = sources[0].split('/')[-1].split('.')[0]
3197 if type.startswith('timeout=')
3198 timeout = type.split('=')[1].to_int()
3199 type = ''
3200 endif
3201
3202 if condition == '' or conf.get(condition) == 1
3203 exe = executable(
3204 name,
3205 sources,
3206 include_directories : incs,
3207 link_with : link_with,
3208 dependencies : [versiondep,
3209 dependencies],
3210 c_args : defs,
3211 build_by_default : want_tests != 'false',
3212 install_rpath : rootlibexecdir,
3213 install : install_tests,
3214 install_dir : join_paths(testsdir, type))
3215
3216 if type == 'manual'
3217 message('@0@ is a manual test'.format(name))
3218 elif type == 'unsafe' and want_tests != 'unsafe'
3219 message('@0@ is an unsafe test'.format(name))
3220 elif want_tests != 'false'
3221 test(name, exe,
3222 env : test_env,
3223 timeout : timeout)
3224 endif
3225 else
3226 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3227 endif
3228 endforeach
3229
3230 exe = executable(
3231 'test-libsystemd-sym',
3232 test_libsystemd_sym_c,
3233 include_directories : includes,
3234 link_with : [libsystemd],
3235 build_by_default : want_tests != 'false',
3236 install : install_tests,
3237 install_dir : testsdir)
3238 if want_tests != 'false'
3239 test('test-libsystemd-sym', exe)
3240 endif
3241
3242 exe = executable(
3243 'test-libsystemd-static-sym',
3244 test_libsystemd_sym_c,
3245 include_directories : includes,
3246 link_with : [install_libsystemd_static],
3247 dependencies : [threads], # threads is already included in dependencies on the library,
3248 # but does not seem to get propagated. Add here as a work-around.
3249 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3250 install : install_tests and static_libsystemd_pic,
3251 install_dir : testsdir)
3252 if want_tests != 'false' and static_libsystemd_pic
3253 test('test-libsystemd-static-sym', exe)
3254 endif
3255
3256 exe = executable(
3257 'test-libudev-sym',
3258 test_libudev_sym_c,
3259 include_directories : includes,
3260 c_args : '-Wno-deprecated-declarations',
3261 link_with : [libudev],
3262 build_by_default : want_tests != 'false',
3263 install : install_tests,
3264 install_dir : testsdir)
3265 if want_tests != 'false'
3266 test('test-libudev-sym', exe)
3267 endif
3268
3269 exe = executable(
3270 'test-libudev-static-sym',
3271 test_libudev_sym_c,
3272 include_directories : includes,
3273 c_args : '-Wno-deprecated-declarations',
3274 link_with : [install_libudev_static],
3275 build_by_default : want_tests != 'false' and static_libudev_pic,
3276 install : install_tests and static_libudev_pic,
3277 install_dir : testsdir)
3278 if want_tests != 'false' and static_libudev_pic
3279 test('test-libudev-static-sym', exe)
3280 endif
3281
3282 ############################################################
3283
3284 fuzzer_exes = []
3285
3286 if get_option('tests') != 'false'
3287 foreach tuple : fuzzers
3288 sources = tuple[0]
3289 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3290 dependencies = tuple[2]
3291 defs = tuple.length() >= 4 ? tuple[3] : []
3292 incs = tuple.length() >= 5 ? tuple[4] : includes
3293 link_args = []
3294
3295 if want_ossfuzz
3296 dependencies += fuzzing_engine
3297 elif want_libfuzzer
3298 if fuzzing_engine.found()
3299 dependencies += fuzzing_engine
3300 else
3301 link_args += ['-fsanitize=fuzzer']
3302 endif
3303 else
3304 sources += 'src/fuzz/fuzz-main.c'
3305 endif
3306
3307 name = sources[0].split('/')[-1].split('.')[0]
3308
3309 fuzzer_exes += executable(
3310 name,
3311 sources,
3312 include_directories : [incs, include_directories('src/fuzz')],
3313 link_with : link_with,
3314 dependencies : dependencies,
3315 c_args : defs,
3316 link_args: link_args,
3317 install : false)
3318 endforeach
3319 endif
3320
3321 run_target(
3322 'fuzzers',
3323 depends : fuzzer_exes,
3324 command : ['true'])
3325
3326 ############################################################
3327
3328 make_directive_index_py = find_program('tools/make-directive-index.py')
3329 make_man_index_py = find_program('tools/make-man-index.py')
3330 xml_helper_py = find_program('tools/xml_helper.py')
3331 hwdb_update_sh = find_program('tools/hwdb-update.sh')
3332 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
3333
3334 subdir('sysctl.d')
3335 subdir('sysusers.d')
3336 subdir('tmpfiles.d')
3337 subdir('hwdb.d')
3338 subdir('units')
3339 subdir('presets')
3340 subdir('network')
3341 subdir('man')
3342 subdir('shell-completion/bash')
3343 subdir('shell-completion/zsh')
3344 subdir('docs/sysvinit')
3345 subdir('docs/var-log')
3346
3347 install_subdir('factory/etc',
3348 install_dir : factorydir)
3349
3350 install_data('xorg/50-systemd-user.sh',
3351 install_dir : xinitrcdir)
3352 install_data('modprobe.d/systemd.conf',
3353 install_dir : modprobedir)
3354 install_data('LICENSE.GPL2',
3355 'LICENSE.LGPL2.1',
3356 'NEWS',
3357 'README',
3358 'docs/CODING_STYLE.md',
3359 'docs/DISTRO_PORTING.md',
3360 'docs/ENVIRONMENT.md',
3361 'docs/HACKING.md',
3362 'docs/TRANSIENT-SETTINGS.md',
3363 'docs/TRANSLATORS.md',
3364 'docs/UIDS-GIDS.md',
3365 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3366 install_dir : docdir)
3367
3368 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3369 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3370
3371 ############################################################
3372
3373 check_help = find_program('tools/check-help.sh')
3374
3375 foreach exec : public_programs
3376 name = exec.full_path().split('/')[-1]
3377 if want_tests != 'false'
3378 test('check-help-' + name,
3379 check_help,
3380 args : exec.full_path())
3381 endif
3382 endforeach
3383
3384 ############################################################
3385
3386 check_directives_sh = find_program('tools/check-directives.sh')
3387
3388 if want_tests != 'false'
3389 test('check-directives',
3390 check_directives_sh,
3391 args : project_source_root)
3392 endif
3393
3394 ############################################################
3395
3396 # Enable tests for all supported sanitizers
3397 foreach tuple : sanitizers
3398 sanitizer = tuple[0]
3399 build = tuple[1]
3400
3401 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3402 prev = ''
3403 foreach p : fuzz_regression_tests
3404 b = p.split('/')[-2]
3405 c = p.split('/')[-1]
3406
3407 name = '@0@:@1@'.format(b, sanitizer)
3408
3409 if name != prev
3410 if want_tests == 'false'
3411 message('Not compiling @0@ because tests is set to false'.format(name))
3412 elif slow_tests or fuzz_tests
3413 exe = custom_target(
3414 name,
3415 output : name,
3416 depends : build,
3417 command : [env, 'ln', '-fs',
3418 join_paths(build.full_path(), b),
3419 '@OUTPUT@'],
3420 build_by_default : true)
3421 else
3422 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3423 endif
3424 endif
3425 prev = name
3426
3427 if want_tests != 'false' and (slow_tests or fuzz_tests)
3428 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3429 env,
3430 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3431 timeout : 60,
3432 args : [exe.full_path(),
3433 join_paths(project_source_root, p)])
3434 endif
3435 endforeach
3436 endif
3437 endforeach
3438
3439
3440 ############################################################
3441
3442 if git.found()
3443 all_files = run_command(
3444 git,
3445 ['--git-dir=@0@/.git'.format(project_source_root),
3446 'ls-files',
3447 ':/*.[ch]'])
3448 all_files = files(all_files.stdout().split())
3449
3450 custom_target(
3451 'tags',
3452 output : 'tags',
3453 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3454 run_target(
3455 'ctags',
3456 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3457 endif
3458
3459 if git.found()
3460 git_contrib_sh = find_program('tools/git-contrib.sh')
3461 run_target(
3462 'git-contrib',
3463 command : [git_contrib_sh])
3464 endif
3465
3466 if git.found()
3467 git_head = run_command(
3468 git,
3469 ['--git-dir=@0@/.git'.format(project_source_root),
3470 'rev-parse', 'HEAD']).stdout().strip()
3471 git_head_short = run_command(
3472 git,
3473 ['--git-dir=@0@/.git'.format(project_source_root),
3474 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3475
3476 run_target(
3477 'git-snapshot',
3478 command : ['git', 'archive',
3479 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3480 git_head_short),
3481 '--prefix', 'systemd-@0@/'.format(git_head),
3482 'HEAD'])
3483 endif
3484
3485 ############################################################
3486
3487 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3488 run_target(
3489 'check-api-docs',
3490 depends : [man, libsystemd, libudev],
3491 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3492
3493 ############################################################
3494 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3495
3496 status = [
3497 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3498
3499 'split /usr: @0@'.format(split_usr),
3500 'split bin-sbin: @0@'.format(split_bin),
3501 'prefix directory: @0@'.format(prefixdir),
3502 'rootprefix directory: @0@'.format(rootprefixdir),
3503 'sysconf directory: @0@'.format(sysconfdir),
3504 'include directory: @0@'.format(includedir),
3505 'lib directory: @0@'.format(libdir),
3506 'rootlib directory: @0@'.format(rootlibdir),
3507 'SysV init scripts: @0@'.format(sysvinit_path),
3508 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3509 'PAM modules directory: @0@'.format(pamlibdir),
3510 'PAM configuration directory: @0@'.format(pamconfdir),
3511 'RPM macros directory: @0@'.format(rpmmacrosdir),
3512 'modprobe.d directory: @0@'.format(modprobedir),
3513 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3514 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3515 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3516 'bash completions directory: @0@'.format(bashcompletiondir),
3517 'zsh completions directory: @0@'.format(zshcompletiondir),
3518 'extra start script: @0@'.format(get_option('rc-local')),
3519 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3520 get_option('debug-tty')),
3521 'TTY GID: @0@'.format(tty_gid),
3522 'users GID: @0@'.format(substs.get('USERS_GID')),
3523 'maximum system UID: @0@'.format(system_uid_max),
3524 'maximum system GID: @0@'.format(system_gid_max),
3525 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3526 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3527 'minimum container UID base: @0@'.format(container_uid_base_min),
3528 'maximum container UID base: @0@'.format(container_uid_base_max),
3529 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3530 'render group access mode: @0@'.format(get_option('group-render-mode')),
3531 'certificate root directory: @0@'.format(get_option('certificate-root')),
3532 'support URL: @0@'.format(support_url),
3533 'nobody user name: @0@'.format(nobody_user),
3534 'nobody group name: @0@'.format(nobody_group),
3535 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3536 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3537
3538 'default DNSSEC mode: @0@'.format(default_dnssec),
3539 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3540 'default mDNS mode: @0@'.format(default_mdns),
3541 'default LLMNR mode: @0@'.format(default_llmnr),
3542 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3543 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3544 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3545 'default locale: @0@'.format(default_locale),
3546 'default user $PATH: @0@'.format(default_user_path_display),
3547 'systemd service watchdog: @0@'.format(watchdog_opt)]
3548
3549 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3550 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3551 status += [
3552 'default DNS servers: @0@'.format(alt_dns_servers),
3553 'default NTP servers: @0@'.format(alt_ntp_servers)]
3554
3555 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3556 '@@0@'.format(time_epoch)).stdout().strip()
3557 status += [
3558 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3559
3560 status += [
3561 'static libsystemd: @0@'.format(static_libsystemd),
3562 'static libudev: @0@'.format(static_libudev)]
3563
3564 # TODO:
3565 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3566 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3567 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3568
3569 if conf.get('ENABLE_EFI') == 1
3570 status += 'efi arch: @0@'.format(efi_arch)
3571
3572 if have_gnu_efi
3573 status += [
3574 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3575 'EFI CC @0@'.format(' '.join(efi_cc)),
3576 'EFI lds: @0@'.format(efi_lds),
3577 'EFI crt0: @0@'.format(efi_crt0),
3578 'EFI include directory: @0@'.format(efi_incdir)]
3579 endif
3580 endif
3581
3582 found = []
3583 missing = []
3584
3585 foreach tuple : [
3586 ['libcryptsetup'],
3587 ['PAM'],
3588 ['pwquality'],
3589 ['libfdisk'],
3590 ['p11kit'],
3591 ['libfido2'],
3592 ['AUDIT'],
3593 ['IMA'],
3594 ['AppArmor'],
3595 ['SELinux'],
3596 ['SECCOMP'],
3597 ['SMACK'],
3598 ['zlib'],
3599 ['xz'],
3600 ['zstd'],
3601 ['lz4'],
3602 ['bzip2'],
3603 ['ACL'],
3604 ['gcrypt'],
3605 ['qrencode'],
3606 ['microhttpd'],
3607 ['gnutls'],
3608 ['openssl'],
3609 ['libcurl'],
3610 ['idn'],
3611 ['initrd'],
3612 ['libidn2'],
3613 ['libidn'],
3614 ['libiptc'],
3615 ['elfutils'],
3616 ['binfmt'],
3617 ['repart'],
3618 ['vconsole'],
3619 ['quotacheck'],
3620 ['tmpfiles'],
3621 ['environment.d'],
3622 ['sysusers'],
3623 ['firstboot'],
3624 ['randomseed'],
3625 ['backlight'],
3626 ['rfkill'],
3627 ['xdg-autostart'],
3628 ['logind'],
3629 ['machined'],
3630 ['portabled'],
3631 ['userdb'],
3632 ['homed'],
3633 ['importd'],
3634 ['hostnamed'],
3635 ['timedated'],
3636 ['timesyncd'],
3637 ['localed'],
3638 ['networkd'],
3639 ['resolve'],
3640 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3641 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3642 ['coredump'],
3643 ['pstore'],
3644 ['polkit'],
3645 ['legacy pkla', install_polkit_pkla],
3646 ['efi'],
3647 ['gnu-efi', have_gnu_efi],
3648 ['kmod'],
3649 ['xkbcommon'],
3650 ['pcre2'],
3651 ['blkid'],
3652 ['dbus'],
3653 ['glib'],
3654 ['nss-myhostname'],
3655 ['nss-mymachines'],
3656 ['nss-resolve'],
3657 ['nss-systemd'],
3658 ['hwdb'],
3659 ['tpm'],
3660 ['man pages', want_man],
3661 ['html pages', want_html],
3662 ['man page indices', want_man and have_lxml],
3663 ['SysV compat'],
3664 ['utmp'],
3665 ['ldconfig'],
3666 ['hibernate'],
3667 ['adm group', get_option('adm-group')],
3668 ['wheel group', get_option('wheel-group')],
3669 ['gshadow'],
3670 ['debug hashmap'],
3671 ['debug mmap cache'],
3672 ['debug siphash'],
3673 ['valgrind', conf.get('VALGRIND') == 1],
3674 ['trace logging', conf.get('LOG_TRACE') == 1],
3675 ['install tests', install_tests],
3676 ['link-udev-shared', get_option('link-udev-shared')],
3677 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3678 ['link-networkd-shared', get_option('link-networkd-shared')],
3679 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3680 ['kernel-install', get_option('kernel-install')],
3681 ['systemd-analyze', get_option('analyze')],
3682 ]
3683
3684 if tuple.length() >= 2
3685 cond = tuple[1]
3686 else
3687 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3688 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3689 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3690 endif
3691 if cond
3692 found += tuple[0]
3693 else
3694 missing += tuple[0]
3695 endif
3696 endforeach
3697
3698 status += [
3699 '',
3700 'enabled features: @0@'.format(', '.join(found)),
3701 '',
3702 'disabled features: @0@'.format(', '.join(missing)),
3703 '']
3704 message('\n '.join(status))
3705
3706 if rootprefixdir != rootprefix_default
3707 warning('\n' +
3708 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3709 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3710 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3711 endif