]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
Merge pull request #16782 from keszybz/seccomp-use-cleanup
[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 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
680 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
681 # If we're in a git repository, use the creation time of the latest git tag.
682 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
683 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
684 endif
685 if time_epoch == ''
686 NEWS = files('NEWS')
687 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
688 endif
689 time_epoch = time_epoch.to_int()
690 endif
691 conf.set('TIME_EPOCH', time_epoch)
692
693 system_uid_max = get_option('system-uid-max')
694 if system_uid_max == -1
695 system_uid_max = run_command(
696 awk,
697 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
698 '/etc/login.defs').stdout().strip()
699 if system_uid_max == ''
700 system_uid_max = 999
701 else
702 system_uid_max = system_uid_max.to_int()
703 endif
704 endif
705 conf.set('SYSTEM_UID_MAX', system_uid_max)
706 substs.set('systemuidmax', system_uid_max)
707
708 system_gid_max = get_option('system-gid-max')
709 if system_gid_max == -1
710 system_gid_max = run_command(
711 awk,
712 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
713 '/etc/login.defs').stdout().strip()
714 if system_gid_max == ''
715 system_gid_max = 999
716 else
717 system_gid_max = system_gid_max.to_int()
718 endif
719 endif
720 conf.set('SYSTEM_GID_MAX', system_gid_max)
721 substs.set('systemgidmax', system_gid_max)
722
723 dynamic_uid_min = get_option('dynamic-uid-min')
724 dynamic_uid_max = get_option('dynamic-uid-max')
725 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
726 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
727 substs.set('dynamicuidmin', dynamic_uid_min)
728 substs.set('dynamicuidmax', dynamic_uid_max)
729
730 container_uid_base_min = get_option('container-uid-base-min')
731 container_uid_base_max = get_option('container-uid-base-max')
732 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
733 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
734 substs.set('containeruidbasemin', container_uid_base_min)
735 substs.set('containeruidbasemax', container_uid_base_max)
736
737 nobody_user = get_option('nobody-user')
738 nobody_group = get_option('nobody-group')
739
740 if not meson.is_cross_build()
741 getent_result = run_command('getent', 'passwd', '65534')
742 if getent_result.returncode() == 0
743 name = getent_result.stdout().split(':')[0]
744 if name != nobody_user
745 warning('\n' +
746 '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) +
747 'Your build will result in an user table setup that is incompatible with the local system.')
748 endif
749 endif
750 id_result = run_command('id', '-u', nobody_user)
751 if id_result.returncode() == 0
752 id = id_result.stdout().to_int()
753 if id != 65534
754 warning('\n' +
755 '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) +
756 'Your build will result in an user table setup that is incompatible with the local system.')
757 endif
758 endif
759
760 getent_result = run_command('getent', 'group', '65534')
761 if getent_result.returncode() == 0
762 name = getent_result.stdout().split(':')[0]
763 if name != nobody_group
764 warning('\n' +
765 '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) +
766 'Your build will result in an group table setup that is incompatible with the local system.')
767 endif
768 endif
769 id_result = run_command('id', '-g', nobody_group)
770 if id_result.returncode() == 0
771 id = id_result.stdout().to_int()
772 if id != 65534
773 warning('\n' +
774 '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) +
775 'Your build will result in an group table setup that is incompatible with the local system.')
776 endif
777 endif
778 endif
779 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
780 warning('\n' +
781 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
782 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
783 endif
784
785 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
786 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
787 substs.set('NOBODY_USER_NAME', nobody_user)
788 substs.set('NOBODY_GROUP_NAME', nobody_group)
789
790 tty_gid = get_option('tty-gid')
791 conf.set('TTY_GID', tty_gid)
792 substs.set('TTY_GID', tty_gid)
793
794 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
795 users_gid = get_option('users-gid')
796 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
797
798 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
799 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
800
801 dev_kvm_mode = get_option('dev-kvm-mode')
802 substs.set('DEV_KVM_MODE', dev_kvm_mode)
803 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
804 group_render_mode = get_option('group-render-mode')
805 substs.set('GROUP_RENDER_MODE', group_render_mode)
806 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
807
808 kill_user_processes = get_option('default-kill-user-processes')
809 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
810 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
811 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
812
813 dns_servers = get_option('dns-servers')
814 conf.set_quoted('DNS_SERVERS', dns_servers)
815 substs.set('DNS_SERVERS', dns_servers)
816
817 ntp_servers = get_option('ntp-servers')
818 conf.set_quoted('NTP_SERVERS', ntp_servers)
819 substs.set('NTP_SERVERS', ntp_servers)
820
821 default_locale = get_option('default-locale')
822 if default_locale == ''
823 if not meson.is_cross_build()
824 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
825 default_locale = run_command(choose_default_locale_sh).stdout().strip()
826 else
827 default_locale = 'C.UTF-8'
828 endif
829 endif
830 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
831
832 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
833
834 service_watchdog = get_option('service-watchdog')
835 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
836 substs.set('SERVICE_WATCHDOG', watchdog_value)
837
838 substs.set('SUSHELL', get_option('debug-shell'))
839 substs.set('DEBUGTTY', get_option('debug-tty'))
840 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
841
842 enable_debug_hashmap = false
843 enable_debug_mmap_cache = false
844 enable_debug_siphash = false
845 foreach name : get_option('debug-extra')
846 if name == 'hashmap'
847 enable_debug_hashmap = true
848 elif name == 'mmap-cache'
849 enable_debug_mmap_cache = true
850 elif name == 'siphash'
851 enable_debug_siphash = true
852 else
853 message('unknown debug option "@0@", ignoring'.format(name))
854 endif
855 endforeach
856 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
857 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
858 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
859
860 conf.set10('VALGRIND', get_option('valgrind'))
861 conf.set10('LOG_TRACE', get_option('log-trace'))
862
863 default_user_path = get_option('user-path')
864 if default_user_path != ''
865 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
866 default_user_path_display = default_user_path
867 else
868 # meson 0.49 fails when ?: is used in .format()
869 default_user_path_display = '(same as system services)'
870 endif
871
872
873 #####################################################################
874
875 threads = dependency('threads')
876 librt = cc.find_library('rt')
877 libm = cc.find_library('m')
878 libdl = cc.find_library('dl')
879 libcrypt = cc.find_library('crypt')
880
881 libcap = dependency('libcap', required : false)
882 if not libcap.found()
883 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
884 libcap = cc.find_library('cap')
885 endif
886
887 libmount = dependency('mount',
888 version : fuzzer_build ? '>= 0' : '>= 2.30')
889
890 want_libfdisk = get_option('fdisk')
891 if want_libfdisk != 'false' and not skip_deps
892 libfdisk = dependency('fdisk',
893 version : '>= 2.33',
894 required : want_libfdisk == 'true')
895 have = libfdisk.found()
896 else
897 have = false
898 libfdisk = []
899 endif
900 conf.set10('HAVE_LIBFDISK', have)
901
902 want_pwquality = get_option('pwquality')
903 if want_pwquality != 'false' and not skip_deps
904 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
905 have = libpwquality.found()
906 else
907 have = false
908 libpwquality = []
909 endif
910 conf.set10('HAVE_PWQUALITY', have)
911
912 want_seccomp = get_option('seccomp')
913 if want_seccomp != 'false' and not skip_deps
914 libseccomp = dependency('libseccomp',
915 version : '>= 2.3.1',
916 required : want_seccomp == 'true')
917 have = libseccomp.found()
918 else
919 have = false
920 libseccomp = []
921 endif
922 conf.set10('HAVE_SECCOMP', have)
923
924 want_selinux = get_option('selinux')
925 if want_selinux != 'false' and not skip_deps
926 libselinux = dependency('libselinux',
927 version : '>= 2.1.9',
928 required : want_selinux == 'true')
929 have = libselinux.found()
930 else
931 have = false
932 libselinux = []
933 endif
934 conf.set10('HAVE_SELINUX', have)
935
936 want_apparmor = get_option('apparmor')
937 if want_apparmor != 'false' and not skip_deps
938 libapparmor = dependency('libapparmor',
939 version : '>= 2.13',
940 required : want_apparmor == 'true')
941 have = libapparmor.found()
942 else
943 have = false
944 libapparmor = []
945 endif
946 conf.set10('HAVE_APPARMOR', have)
947
948 smack_run_label = get_option('smack-run-label')
949 if smack_run_label != ''
950 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
951 endif
952
953 want_polkit = get_option('polkit')
954 install_polkit = false
955 install_polkit_pkla = false
956 if want_polkit != 'false' and not skip_deps
957 install_polkit = true
958
959 libpolkit = dependency('polkit-gobject-1',
960 required : false)
961 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
962 message('Old polkit detected, will install pkla files')
963 install_polkit_pkla = true
964 endif
965 endif
966 conf.set10('ENABLE_POLKIT', install_polkit)
967
968 want_acl = get_option('acl')
969 if want_acl != 'false' and not skip_deps
970 libacl = cc.find_library('acl', required : want_acl == 'true')
971 have = libacl.found()
972 else
973 have = false
974 libacl = []
975 endif
976 conf.set10('HAVE_ACL', have)
977
978 want_audit = get_option('audit')
979 if want_audit != 'false' and not skip_deps
980 libaudit = dependency('audit', required : want_audit == 'true')
981 have = libaudit.found()
982 else
983 have = false
984 libaudit = []
985 endif
986 conf.set10('HAVE_AUDIT', have)
987
988 want_blkid = get_option('blkid')
989 if want_blkid != 'false' and not skip_deps
990 libblkid = dependency('blkid', required : want_blkid == 'true')
991 have = libblkid.found()
992 else
993 have = false
994 libblkid = []
995 endif
996 conf.set10('HAVE_BLKID', have)
997
998 want_kmod = get_option('kmod')
999 if want_kmod != 'false' and not skip_deps
1000 libkmod = dependency('libkmod',
1001 version : '>= 15',
1002 required : want_kmod == 'true')
1003 have = libkmod.found()
1004 else
1005 have = false
1006 libkmod = []
1007 endif
1008 conf.set10('HAVE_KMOD', have)
1009
1010 want_pam = get_option('pam')
1011 if want_pam != 'false' and not skip_deps
1012 libpam = cc.find_library('pam', required : want_pam == 'true')
1013 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1014 have = libpam.found() and libpam_misc.found()
1015 else
1016 have = false
1017 libpam = []
1018 libpam_misc = []
1019 endif
1020 conf.set10('HAVE_PAM', have)
1021
1022 want_microhttpd = get_option('microhttpd')
1023 if want_microhttpd != 'false' and not skip_deps
1024 libmicrohttpd = dependency('libmicrohttpd',
1025 version : '>= 0.9.33',
1026 required : want_microhttpd == 'true')
1027 have = libmicrohttpd.found()
1028 else
1029 have = false
1030 libmicrohttpd = []
1031 endif
1032 conf.set10('HAVE_MICROHTTPD', have)
1033
1034 want_libcryptsetup = get_option('libcryptsetup')
1035 if want_libcryptsetup != 'false' and not skip_deps
1036 libcryptsetup = dependency('libcryptsetup',
1037 version : '>= 2.0.1',
1038 required : want_libcryptsetup == 'true')
1039 have = libcryptsetup.found()
1040
1041 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1042 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1043 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1044 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1045 else
1046 have = false
1047 libcryptsetup = []
1048 endif
1049 conf.set10('HAVE_LIBCRYPTSETUP', have)
1050
1051 want_libcurl = get_option('libcurl')
1052 if want_libcurl != 'false' and not skip_deps
1053 libcurl = dependency('libcurl',
1054 version : '>= 7.32.0',
1055 required : want_libcurl == 'true')
1056 have = libcurl.found()
1057 else
1058 have = false
1059 libcurl = []
1060 endif
1061 conf.set10('HAVE_LIBCURL', have)
1062
1063 want_libidn = get_option('libidn')
1064 want_libidn2 = get_option('libidn2')
1065 if want_libidn == 'true' and want_libidn2 == 'true'
1066 error('libidn and libidn2 cannot be requested simultaneously')
1067 endif
1068
1069 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1070 libidn = dependency('libidn2',
1071 required : want_libidn2 == 'true')
1072 have = libidn.found()
1073 else
1074 have = false
1075 libidn = []
1076 endif
1077 conf.set10('HAVE_LIBIDN2', have)
1078 if not have and want_libidn != 'false' and not skip_deps
1079 # libidn is used for both libidn and libidn2 objects
1080 libidn = dependency('libidn',
1081 required : want_libidn == 'true')
1082 have = libidn.found()
1083 else
1084 have = false
1085 endif
1086 conf.set10('HAVE_LIBIDN', have)
1087
1088 want_libiptc = get_option('libiptc')
1089 if want_libiptc != 'false' and not skip_deps
1090 libiptc = dependency('libiptc',
1091 required : want_libiptc == 'true')
1092 have = libiptc.found()
1093 else
1094 have = false
1095 libiptc = []
1096 endif
1097 conf.set10('HAVE_LIBIPTC', have)
1098
1099 want_qrencode = get_option('qrencode')
1100 if want_qrencode != 'false' and not skip_deps
1101 libqrencode = dependency('libqrencode',
1102 required : want_qrencode == 'true')
1103 have = libqrencode.found()
1104 else
1105 have = false
1106 libqrencode = []
1107 endif
1108 conf.set10('HAVE_QRENCODE', have)
1109
1110 want_gcrypt = get_option('gcrypt')
1111 if want_gcrypt != 'false' and not skip_deps
1112 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1113 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1114 have = libgcrypt.found() and libgpg_error.found()
1115 else
1116 have = false
1117 endif
1118 if not have
1119 # link to neither of the libs if one is not found
1120 libgcrypt = []
1121 libgpg_error = []
1122 endif
1123 conf.set10('HAVE_GCRYPT', have)
1124
1125 want_gnutls = get_option('gnutls')
1126 if want_gnutls != 'false' and not skip_deps
1127 libgnutls = dependency('gnutls',
1128 version : '>= 3.1.4',
1129 required : want_gnutls == 'true')
1130 have = libgnutls.found()
1131 else
1132 have = false
1133 libgnutls = []
1134 endif
1135 conf.set10('HAVE_GNUTLS', have)
1136
1137 want_openssl = get_option('openssl')
1138 if want_openssl != 'false' and not skip_deps
1139 libopenssl = dependency('openssl',
1140 version : '>= 1.1.0',
1141 required : want_openssl == 'true')
1142 have = libopenssl.found()
1143 else
1144 have = false
1145 libopenssl = []
1146 endif
1147 conf.set10('HAVE_OPENSSL', have)
1148
1149 want_p11kit = get_option('p11kit')
1150 if want_p11kit != 'false' and not skip_deps
1151 libp11kit = dependency('p11-kit-1',
1152 version : '>= 0.23.3',
1153 required : want_p11kit == 'true')
1154 have = libp11kit.found()
1155 else
1156 have = false
1157 libp11kit = []
1158 endif
1159 conf.set10('HAVE_P11KIT', have)
1160
1161 want_libfido2 = get_option('libfido2')
1162 if want_libfido2 != 'false' and not skip_deps
1163 libfido2 = dependency('libfido2',
1164 required : want_libfido2 == 'true')
1165 have = libfido2.found()
1166 else
1167 have = false
1168 libfido2 = []
1169 endif
1170 conf.set10('HAVE_LIBFIDO2', have)
1171
1172 want_elfutils = get_option('elfutils')
1173 if want_elfutils != 'false' and not skip_deps
1174 libdw = dependency('libdw',
1175 required : want_elfutils == 'true')
1176 have = libdw.found()
1177 else
1178 have = false
1179 libdw = []
1180 endif
1181 conf.set10('HAVE_ELFUTILS', have)
1182
1183 want_zlib = get_option('zlib')
1184 if want_zlib != 'false' and not skip_deps
1185 libz = dependency('zlib',
1186 required : want_zlib == 'true')
1187 have = libz.found()
1188 else
1189 have = false
1190 libz = []
1191 endif
1192 conf.set10('HAVE_ZLIB', have)
1193
1194 want_bzip2 = get_option('bzip2')
1195 if want_bzip2 != 'false' and not skip_deps
1196 libbzip2 = cc.find_library('bz2',
1197 required : want_bzip2 == 'true')
1198 have = libbzip2.found()
1199 else
1200 have = false
1201 libbzip2 = []
1202 endif
1203 conf.set10('HAVE_BZIP2', have)
1204
1205 want_xz = get_option('xz')
1206 if want_xz != 'false' and not skip_deps
1207 libxz = dependency('liblzma',
1208 required : want_xz == 'true')
1209 have_xz = libxz.found()
1210 else
1211 have_xz = false
1212 libxz = []
1213 endif
1214 conf.set10('HAVE_XZ', have_xz)
1215
1216 want_lz4 = get_option('lz4')
1217 if want_lz4 != 'false' and not skip_deps
1218 liblz4 = dependency('liblz4',
1219 version : '>= 1.3.0',
1220 required : want_lz4 == 'true')
1221 have_lz4 = liblz4.found()
1222 else
1223 have_lz4 = false
1224 liblz4 = []
1225 endif
1226 conf.set10('HAVE_LZ4', have_lz4)
1227
1228 want_zstd = get_option('zstd')
1229 if want_zstd != 'false' and not skip_deps
1230 libzstd = dependency('libzstd',
1231 required : want_zstd == 'true',
1232 version : '>= 1.4.0')
1233 have_zstd = libzstd.found()
1234 else
1235 have_zstd = false
1236 libzstd = []
1237 endif
1238 conf.set10('HAVE_ZSTD', have_zstd)
1239
1240 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1241
1242 want_xkbcommon = get_option('xkbcommon')
1243 if want_xkbcommon != 'false' and not skip_deps
1244 libxkbcommon = dependency('xkbcommon',
1245 version : '>= 0.3.0',
1246 required : want_xkbcommon == 'true')
1247 have = libxkbcommon.found()
1248 else
1249 have = false
1250 libxkbcommon = []
1251 endif
1252 conf.set10('HAVE_XKBCOMMON', have)
1253
1254 want_pcre2 = get_option('pcre2')
1255 if want_pcre2 != 'false'
1256 libpcre2 = dependency('libpcre2-8',
1257 required : want_pcre2 == 'true')
1258 have = libpcre2.found()
1259 else
1260 have = false
1261 libpcre2 = []
1262 endif
1263 conf.set10('HAVE_PCRE2', have)
1264
1265 want_glib = get_option('glib')
1266 if want_glib != 'false' and not skip_deps
1267 libglib = dependency('glib-2.0',
1268 version : '>= 2.22.0',
1269 required : want_glib == 'true')
1270 libgobject = dependency('gobject-2.0',
1271 version : '>= 2.22.0',
1272 required : want_glib == 'true')
1273 libgio = dependency('gio-2.0',
1274 required : want_glib == 'true')
1275 have = libglib.found() and libgobject.found() and libgio.found()
1276 else
1277 have = false
1278 libglib = []
1279 libgobject = []
1280 libgio = []
1281 endif
1282 conf.set10('HAVE_GLIB', have)
1283
1284 want_dbus = get_option('dbus')
1285 if want_dbus != 'false' and not skip_deps
1286 libdbus = dependency('dbus-1',
1287 version : '>= 1.3.2',
1288 required : want_dbus == 'true')
1289 have = libdbus.found()
1290 else
1291 have = false
1292 libdbus = []
1293 endif
1294 conf.set10('HAVE_DBUS', have)
1295
1296 default_dnssec = get_option('default-dnssec')
1297 if skip_deps
1298 default_dnssec = 'no'
1299 endif
1300 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1301 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1302 default_dnssec = 'no'
1303 endif
1304 conf.set('DEFAULT_DNSSEC_MODE',
1305 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1306 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1307
1308 dns_over_tls = get_option('dns-over-tls')
1309 if dns_over_tls != 'false'
1310 if dns_over_tls == 'openssl'
1311 have_gnutls = false
1312 else
1313 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1314 if dns_over_tls == 'gnutls' and not have_gnutls
1315 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1316 endif
1317 endif
1318 if dns_over_tls == 'gnutls' or have_gnutls
1319 have_openssl = false
1320 else
1321 have_openssl = conf.get('HAVE_OPENSSL') == 1
1322 if dns_over_tls != 'auto' and not have_openssl
1323 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1324 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1325 endif
1326 endif
1327 have = have_gnutls or have_openssl
1328 else
1329 have = false
1330 have_gnutls = false
1331 have_openssl = false
1332 endif
1333 conf.set10('ENABLE_DNS_OVER_TLS', have)
1334 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1335 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1336
1337 default_dns_over_tls = get_option('default-dns-over-tls')
1338 if skip_deps
1339 default_dns_over_tls = 'no'
1340 endif
1341 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1342 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.')
1343 default_dns_over_tls = 'no'
1344 endif
1345 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1346 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1347 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1348
1349 default_mdns = get_option('default-mdns')
1350 conf.set('DEFAULT_MDNS_MODE',
1351 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1352 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1353
1354 default_llmnr = get_option('default-llmnr')
1355 conf.set('DEFAULT_LLMNR_MODE',
1356 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1357 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1358
1359 want_repart = get_option('repart')
1360 if want_repart != 'false'
1361 have = (conf.get('HAVE_OPENSSL') == 1 and
1362 conf.get('HAVE_LIBFDISK') == 1)
1363 if want_repart == 'true' and not have
1364 error('repart support was requested, but dependencies are not available')
1365 endif
1366 else
1367 have = false
1368 endif
1369 conf.set10('ENABLE_REPART', have)
1370
1371 want_importd = get_option('importd')
1372 if want_importd != 'false'
1373 have = (conf.get('HAVE_LIBCURL') == 1 and
1374 conf.get('HAVE_ZLIB') == 1 and
1375 conf.get('HAVE_XZ') == 1 and
1376 conf.get('HAVE_GCRYPT') == 1)
1377 if want_importd == 'true' and not have
1378 error('importd support was requested, but dependencies are not available')
1379 endif
1380 else
1381 have = false
1382 endif
1383 conf.set10('ENABLE_IMPORTD', have)
1384
1385 want_homed = get_option('homed')
1386 if want_homed != 'false'
1387 have = (conf.get('HAVE_OPENSSL') == 1 and
1388 conf.get('HAVE_LIBFDISK') == 1 and
1389 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1390 if want_homed == 'true' and not have
1391 error('homed support was requested, but dependencies are not available')
1392 endif
1393 else
1394 have = false
1395 endif
1396 conf.set10('ENABLE_HOMED', have)
1397
1398 have = have and conf.get('HAVE_PAM') == 1
1399 conf.set10('ENABLE_PAM_HOME', have)
1400
1401 want_remote = get_option('remote')
1402 if want_remote != 'false'
1403 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1404 conf.get('HAVE_LIBCURL') == 1]
1405 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1406 # it's possible to build one without the other. Complain only if
1407 # support was explicitly requested. The auxiliary files like sysusers
1408 # config should be installed when any of the programs are built.
1409 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1410 error('remote support was requested, but dependencies are not available')
1411 endif
1412 have = have_deps[0] or have_deps[1]
1413 else
1414 have = false
1415 endif
1416 conf.set10('ENABLE_REMOTE', have)
1417
1418 foreach term : ['utmp',
1419 'hibernate',
1420 'environment-d',
1421 'binfmt',
1422 'coredump',
1423 'pstore',
1424 'resolve',
1425 'logind',
1426 'hostnamed',
1427 'localed',
1428 'machined',
1429 'portabled',
1430 'userdb',
1431 'networkd',
1432 'timedated',
1433 'timesyncd',
1434 'firstboot',
1435 'randomseed',
1436 'backlight',
1437 'vconsole',
1438 'quotacheck',
1439 'sysusers',
1440 'tmpfiles',
1441 'hwdb',
1442 'rfkill',
1443 'xdg-autostart',
1444 'ldconfig',
1445 'efi',
1446 'tpm',
1447 'ima',
1448 'smack',
1449 'gshadow',
1450 'idn',
1451 'initrd',
1452 'nss-myhostname',
1453 'nss-systemd']
1454 have = get_option(term)
1455 name = 'ENABLE_' + term.underscorify().to_upper()
1456 conf.set10(name, have)
1457 endforeach
1458
1459 foreach tuple : [['nss-mymachines', 'machined'],
1460 ['nss-resolve', 'resolve']]
1461 want = get_option(tuple[0])
1462 if want != 'false'
1463 have = get_option(tuple[1])
1464 if want == 'true' and not have
1465 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1466 endif
1467 else
1468 have = false
1469 endif
1470 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1471 conf.set10(name, have)
1472 endforeach
1473
1474 enable_nss = false
1475 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1476 'ENABLE_NSS_MYMACHINES',
1477 'ENABLE_NSS_RESOLVE',
1478 'ENABLE_NSS_SYSTEMD']
1479 if conf.get(term) == 1
1480 enable_nss = true
1481 endif
1482 endforeach
1483 conf.set10('ENABLE_NSS', enable_nss)
1484
1485 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1486
1487 tests = []
1488 fuzzers = []
1489
1490 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1491
1492 #####################################################################
1493
1494 if get_option('efi')
1495 efi_arch = host_machine.cpu_family()
1496
1497 if efi_arch == 'x86'
1498 EFI_MACHINE_TYPE_NAME = 'ia32'
1499 gnu_efi_arch = 'ia32'
1500 elif efi_arch == 'x86_64'
1501 EFI_MACHINE_TYPE_NAME = 'x64'
1502 gnu_efi_arch = 'x86_64'
1503 elif efi_arch == 'arm'
1504 EFI_MACHINE_TYPE_NAME = 'arm'
1505 gnu_efi_arch = 'arm'
1506 elif efi_arch == 'aarch64'
1507 EFI_MACHINE_TYPE_NAME = 'aa64'
1508 gnu_efi_arch = 'aarch64'
1509 else
1510 EFI_MACHINE_TYPE_NAME = ''
1511 gnu_efi_arch = ''
1512 endif
1513
1514 have = true
1515 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1516
1517 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1518 else
1519 have = false
1520 endif
1521 conf.set10('ENABLE_EFI', have)
1522
1523 #####################################################################
1524
1525 config_h = configure_file(
1526 output : 'config.h',
1527 configuration : conf)
1528
1529 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1530
1531 includes = include_directories('src/basic',
1532 'src/boot',
1533 'src/home',
1534 'src/shared',
1535 'src/systemd',
1536 'src/journal',
1537 'src/journal-remote',
1538 'src/nspawn',
1539 'src/resolve',
1540 'src/timesync',
1541 'src/time-wait-sync',
1542 'src/login',
1543 'src/udev',
1544 'src/libudev',
1545 'src/core',
1546 'src/shutdown',
1547 'src/xdg-autostart-generator',
1548 'src/libsystemd/sd-bus',
1549 'src/libsystemd/sd-device',
1550 'src/libsystemd/sd-event',
1551 'src/libsystemd/sd-hwdb',
1552 'src/libsystemd/sd-id128',
1553 'src/libsystemd/sd-netlink',
1554 'src/libsystemd/sd-network',
1555 'src/libsystemd/sd-resolve',
1556 'src/libsystemd-network',
1557 '.')
1558
1559 add_project_arguments('-include', 'config.h', language : 'c')
1560
1561 generate_gperfs = find_program('tools/generate-gperfs.py')
1562
1563 subdir('po')
1564 subdir('catalog')
1565 subdir('src/systemd')
1566 subdir('src/basic')
1567 subdir('src/libsystemd')
1568 subdir('src/libsystemd-network')
1569 subdir('src/journal')
1570 subdir('src/login')
1571
1572 libjournal_core = static_library(
1573 'journal-core',
1574 libjournal_core_sources,
1575 journald_gperf_c,
1576 include_directories : includes,
1577 install : false)
1578
1579 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1580 libsystemd = shared_library(
1581 'systemd',
1582 disable_mempool_c,
1583 version : libsystemd_version,
1584 include_directories : includes,
1585 link_args : ['-shared',
1586 '-Wl,--version-script=' + libsystemd_sym_path],
1587 link_with : [libbasic,
1588 libbasic_gcrypt],
1589 link_whole : [libsystemd_static,
1590 libjournal_client],
1591 dependencies : [threads,
1592 librt,
1593 libxz,
1594 libzstd,
1595 liblz4],
1596 link_depends : libsystemd_sym,
1597 install : true,
1598 install_dir : rootlibdir)
1599
1600 static_libsystemd = get_option('static-libsystemd')
1601 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1602
1603 install_libsystemd_static = static_library(
1604 'systemd',
1605 libsystemd_sources,
1606 journal_client_sources,
1607 basic_sources,
1608 basic_gcrypt_sources,
1609 disable_mempool_c,
1610 include_directories : includes,
1611 build_by_default : static_libsystemd != 'false',
1612 install : static_libsystemd != 'false',
1613 install_dir : rootlibdir,
1614 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1615 dependencies : [threads,
1616 librt,
1617 libxz,
1618 libzstd,
1619 liblz4,
1620 libcap,
1621 libblkid,
1622 libmount,
1623 libselinux,
1624 libgcrypt],
1625 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1626
1627 # Generate autosuspend rules
1628 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1629
1630 ############################################################
1631
1632 # binaries that have --help and are intended for use by humans,
1633 # usually, but not always, installed in /bin.
1634 public_programs = []
1635
1636 subdir('src/libudev')
1637 subdir('src/shared')
1638 subdir('src/core')
1639 subdir('src/shutdown')
1640 subdir('src/udev')
1641 subdir('src/network')
1642
1643 subdir('src/analyze')
1644 subdir('src/journal-remote')
1645 subdir('src/coredump')
1646 subdir('src/pstore')
1647 subdir('src/hostname')
1648 subdir('src/import')
1649 subdir('src/partition')
1650 subdir('src/kernel-install')
1651 subdir('src/locale')
1652 subdir('src/machine')
1653 subdir('src/portable')
1654 subdir('src/userdb')
1655 subdir('src/home')
1656 subdir('src/nspawn')
1657 subdir('src/resolve')
1658 subdir('src/timedate')
1659 subdir('src/timesync')
1660 subdir('src/tmpfiles')
1661 subdir('src/vconsole')
1662 subdir('src/boot/efi')
1663
1664 subdir('src/test')
1665 subdir('src/fuzz')
1666 subdir('rules.d')
1667 subdir('test')
1668
1669 ############################################################
1670
1671 # only static linking apart from libdl, to make sure that the
1672 # module is linked to all libraries that it uses.
1673 test_dlopen = executable(
1674 'test-dlopen',
1675 test_dlopen_c,
1676 disable_mempool_c,
1677 include_directories : includes,
1678 link_with : [libbasic],
1679 dependencies : [libdl],
1680 build_by_default : want_tests != 'false')
1681
1682 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1683 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1684 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1685 ['resolve', 'ENABLE_NSS_RESOLVE']]
1686
1687 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1688 if condition
1689 module = tuple[0]
1690
1691 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1692 version_script_arg = join_paths(project_source_root, sym)
1693
1694 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1695 if tuple.length() > 2
1696 sources += tuple[2].split()
1697 endif
1698
1699 nss = shared_library(
1700 'nss_' + module,
1701 sources,
1702 disable_mempool_c,
1703 version : '2',
1704 include_directories : includes,
1705 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1706 link_args : ['-Wl,-z,nodelete',
1707 '-shared',
1708 '-Wl,--version-script=' + version_script_arg],
1709 link_with : [libsystemd_static,
1710 libshared_static,
1711 libbasic],
1712 dependencies : [threads,
1713 librt],
1714 link_depends : sym,
1715 install : true,
1716 install_dir : rootlibdir)
1717
1718 # We cannot use shared_module because it does not support version suffix.
1719 # Unfortunately shared_library insists on creating the symlink…
1720 meson.add_install_script('sh', '-c',
1721 'rm $DESTDIR@0@/libnss_@1@.so'
1722 .format(rootlibdir, module))
1723
1724 if want_tests != 'false'
1725 test('dlopen-nss_' + module,
1726 test_dlopen,
1727 # path to dlopen must include a slash
1728 args : nss.full_path())
1729 endif
1730 endif
1731 endforeach
1732
1733 ############################################################
1734
1735 executable(
1736 'systemd',
1737 systemd_sources,
1738 include_directories : includes,
1739 link_with : [libcore,
1740 libshared],
1741 dependencies : [versiondep,
1742 threads,
1743 librt,
1744 libseccomp,
1745 libselinux,
1746 libmount,
1747 libblkid],
1748 install_rpath : rootlibexecdir,
1749 install : true,
1750 install_dir : rootlibexecdir)
1751
1752 meson.add_install_script(meson_make_symlink,
1753 join_paths(rootlibexecdir, 'systemd'),
1754 join_paths(rootsbindir, 'init'))
1755
1756 public_programs += executable(
1757 'systemd-analyze',
1758 systemd_analyze_sources,
1759 include_directories : includes,
1760 link_with : [libcore,
1761 libshared],
1762 dependencies : [versiondep,
1763 threads,
1764 librt,
1765 libseccomp,
1766 libselinux,
1767 libmount,
1768 libblkid],
1769 install_rpath : rootlibexecdir,
1770 install : get_option('analyze'))
1771
1772 executable(
1773 'systemd-journald',
1774 systemd_journald_sources,
1775 include_directories : includes,
1776 link_with : [libjournal_core,
1777 libshared],
1778 dependencies : [threads,
1779 libxz,
1780 liblz4,
1781 libselinux,
1782 libzstd],
1783 install_rpath : rootlibexecdir,
1784 install : true,
1785 install_dir : rootlibexecdir)
1786
1787 public_programs += executable(
1788 'systemd-cat',
1789 systemd_cat_sources,
1790 include_directories : includes,
1791 link_with : [libjournal_core,
1792 libshared],
1793 dependencies : [threads],
1794 install_rpath : rootlibexecdir,
1795 install : true)
1796
1797 public_programs += executable(
1798 'journalctl',
1799 journalctl_sources,
1800 include_directories : includes,
1801 link_with : [libshared],
1802 dependencies : [threads,
1803 libdl,
1804 libxz,
1805 liblz4,
1806 libzstd,
1807 libdl],
1808 install_rpath : rootlibexecdir,
1809 install : true,
1810 install_dir : rootbindir)
1811
1812 executable(
1813 'systemd-getty-generator',
1814 'src/getty-generator/getty-generator.c',
1815 include_directories : includes,
1816 link_with : [libshared],
1817 install_rpath : rootlibexecdir,
1818 install : true,
1819 install_dir : systemgeneratordir)
1820
1821 executable(
1822 'systemd-debug-generator',
1823 'src/debug-generator/debug-generator.c',
1824 include_directories : includes,
1825 link_with : [libshared],
1826 install_rpath : rootlibexecdir,
1827 install : true,
1828 install_dir : systemgeneratordir)
1829
1830 executable(
1831 'systemd-run-generator',
1832 'src/run-generator/run-generator.c',
1833 include_directories : includes,
1834 link_with : [libshared],
1835 install_rpath : rootlibexecdir,
1836 install : true,
1837 install_dir : systemgeneratordir)
1838
1839 executable(
1840 'systemd-fstab-generator',
1841 'src/fstab-generator/fstab-generator.c',
1842 include_directories : includes,
1843 link_with : [libcore_shared,
1844 libshared],
1845 install_rpath : rootlibexecdir,
1846 install : true,
1847 install_dir : systemgeneratordir)
1848
1849 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1850 executable(
1851 '30-systemd-environment-d-generator',
1852 'src/environment-d-generator/environment-d-generator.c',
1853 include_directories : includes,
1854 link_with : [libshared],
1855 install_rpath : rootlibexecdir,
1856 install : true,
1857 install_dir : userenvgeneratordir)
1858
1859 meson.add_install_script(meson_make_symlink,
1860 join_paths(sysconfdir, 'environment'),
1861 join_paths(environmentdir, '99-environment.conf'))
1862 endif
1863
1864 if conf.get('ENABLE_HIBERNATE') == 1
1865 executable(
1866 'systemd-hibernate-resume-generator',
1867 'src/hibernate-resume/hibernate-resume-generator.c',
1868 include_directories : includes,
1869 link_with : [libshared],
1870 install_rpath : rootlibexecdir,
1871 install : true,
1872 install_dir : systemgeneratordir)
1873
1874 executable(
1875 'systemd-hibernate-resume',
1876 'src/hibernate-resume/hibernate-resume.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 install_rpath : rootlibexecdir,
1880 install : true,
1881 install_dir : rootlibexecdir)
1882 endif
1883
1884 if conf.get('HAVE_BLKID') == 1
1885 executable(
1886 'systemd-gpt-auto-generator',
1887 'src/gpt-auto-generator/gpt-auto-generator.c',
1888 'src/shared/blkid-util.h',
1889 include_directories : includes,
1890 link_with : [libshared],
1891 dependencies : libblkid,
1892 install_rpath : rootlibexecdir,
1893 install : true,
1894 install_dir : systemgeneratordir)
1895
1896 public_programs += executable(
1897 'systemd-dissect',
1898 'src/dissect/dissect.c',
1899 include_directories : includes,
1900 link_with : [libshared],
1901 install_rpath : rootlibexecdir,
1902 install : true)
1903 endif
1904
1905 if conf.get('ENABLE_RESOLVE') == 1
1906 executable(
1907 'systemd-resolved',
1908 systemd_resolved_sources,
1909 include_directories : includes,
1910 link_with : [libshared,
1911 libbasic_gcrypt,
1912 libsystemd_resolve_core],
1913 dependencies : systemd_resolved_dependencies,
1914 install_rpath : rootlibexecdir,
1915 install : true,
1916 install_dir : rootlibexecdir)
1917
1918 public_programs += executable(
1919 'resolvectl',
1920 resolvectl_sources,
1921 include_directories : includes,
1922 link_with : [libshared,
1923 libbasic_gcrypt,
1924 libsystemd_resolve_core],
1925 dependencies : [threads,
1926 libgpg_error,
1927 libm,
1928 libidn],
1929 install_rpath : rootlibexecdir,
1930 install : true)
1931
1932 meson.add_install_script(meson_make_symlink,
1933 join_paths(bindir, 'resolvectl'),
1934 join_paths(rootsbindir, 'resolvconf'))
1935
1936 meson.add_install_script(meson_make_symlink,
1937 join_paths(bindir, 'resolvectl'),
1938 join_paths(bindir, 'systemd-resolve'))
1939 endif
1940
1941 if conf.get('ENABLE_LOGIND') == 1
1942 executable(
1943 'systemd-logind',
1944 systemd_logind_sources,
1945 include_directories : includes,
1946 link_with : [liblogind_core,
1947 libshared],
1948 dependencies : [threads,
1949 libacl],
1950 install_rpath : rootlibexecdir,
1951 install : true,
1952 install_dir : rootlibexecdir)
1953
1954 public_programs += executable(
1955 'loginctl',
1956 loginctl_sources,
1957 include_directories : includes,
1958 link_with : [libshared],
1959 dependencies : [threads,
1960 liblz4,
1961 libxz,
1962 libzstd],
1963 install_rpath : rootlibexecdir,
1964 install : true,
1965 install_dir : rootbindir)
1966
1967 public_programs += executable(
1968 'systemd-inhibit',
1969 'src/login/inhibit.c',
1970 include_directories : includes,
1971 link_with : [libshared],
1972 install_rpath : rootlibexecdir,
1973 install : true,
1974 install_dir : rootbindir)
1975
1976 if conf.get('HAVE_PAM') == 1
1977 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1978 pam_systemd = shared_library(
1979 'pam_systemd',
1980 pam_systemd_c,
1981 name_prefix : '',
1982 include_directories : includes,
1983 link_args : ['-shared',
1984 '-Wl,--version-script=' + version_script_arg],
1985 link_with : [libsystemd_static,
1986 libshared_static],
1987 dependencies : [threads,
1988 libpam,
1989 libpam_misc],
1990 link_depends : pam_systemd_sym,
1991 install : true,
1992 install_dir : pamlibdir)
1993
1994 if want_tests != 'false'
1995 test('dlopen-pam_systemd',
1996 test_dlopen,
1997 # path to dlopen must include a slash
1998 args : pam_systemd.full_path())
1999 endif
2000 endif
2001
2002 executable(
2003 'systemd-user-runtime-dir',
2004 user_runtime_dir_sources,
2005 include_directories : includes,
2006 link_with : [libshared],
2007 install_rpath : rootlibexecdir,
2008 install : true,
2009 install_dir : rootlibexecdir)
2010 endif
2011
2012 if conf.get('HAVE_PAM') == 1
2013 executable(
2014 'systemd-user-sessions',
2015 'src/user-sessions/user-sessions.c',
2016 include_directories : includes,
2017 link_with : [libshared],
2018 install_rpath : rootlibexecdir,
2019 install : true,
2020 install_dir : rootlibexecdir)
2021 endif
2022
2023 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2024 public_programs += executable(
2025 'bootctl',
2026 'src/boot/bootctl.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 dependencies : [libblkid],
2030 install_rpath : rootlibexecdir,
2031 install : true)
2032
2033 public_programs += executable(
2034 'systemd-bless-boot',
2035 'src/boot/bless-boot.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 dependencies : [libblkid],
2039 install_rpath : rootlibexecdir,
2040 install : true,
2041 install_dir : rootlibexecdir)
2042
2043 executable(
2044 'systemd-bless-boot-generator',
2045 'src/boot/bless-boot-generator.c',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2049 install : true,
2050 install_dir : systemgeneratordir)
2051 endif
2052
2053 executable(
2054 'systemd-boot-check-no-failures',
2055 'src/boot/boot-check-no-failures.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 dependencies : [libblkid],
2059 install_rpath : rootlibexecdir,
2060 install : true,
2061 install_dir : rootlibexecdir)
2062
2063 public_programs += executable(
2064 'systemd-socket-activate',
2065 'src/activate/activate.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 dependencies : [threads],
2069 install_rpath : rootlibexecdir,
2070 install : true)
2071
2072 if get_option('link-systemctl-shared')
2073 systemctl_link_with = [libshared]
2074 else
2075 systemctl_link_with = [libsystemd_static,
2076 libshared_static,
2077 libjournal_client,
2078 libbasic_gcrypt]
2079 endif
2080
2081 public_programs += executable(
2082 'systemctl',
2083 'src/systemctl/systemctl.c',
2084 'src/systemctl/sysv-compat.h',
2085 'src/systemctl/sysv-compat.c',
2086 include_directories : includes,
2087 link_with : systemctl_link_with,
2088 dependencies : [threads,
2089 libcap,
2090 libselinux,
2091 libxz,
2092 liblz4,
2093 libzstd],
2094 install_rpath : rootlibexecdir,
2095 install : true,
2096 install_dir : rootbindir)
2097
2098 if conf.get('ENABLE_PORTABLED') == 1
2099 executable(
2100 'systemd-portabled',
2101 systemd_portabled_sources,
2102 include_directories : includes,
2103 link_with : [libshared],
2104 dependencies : [threads],
2105 install_rpath : rootlibexecdir,
2106 install : true,
2107 install_dir : rootlibexecdir)
2108
2109 public_programs += executable(
2110 'portablectl',
2111 'src/portable/portablectl.c',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 dependencies : [threads],
2115 install_rpath : rootlibexecdir,
2116 install : true,
2117 install_dir : rootbindir)
2118 endif
2119
2120 if conf.get('ENABLE_USERDB') == 1
2121 executable(
2122 'systemd-userwork',
2123 systemd_userwork_sources,
2124 include_directories : includes,
2125 link_with : [libshared],
2126 dependencies : [threads],
2127 install_rpath : rootlibexecdir,
2128 install : true,
2129 install_dir : rootlibexecdir)
2130
2131 executable(
2132 'systemd-userdbd',
2133 systemd_userdbd_sources,
2134 include_directories : includes,
2135 link_with : [libshared],
2136 dependencies : [threads],
2137 install_rpath : rootlibexecdir,
2138 install : true,
2139 install_dir : rootlibexecdir)
2140
2141 public_programs += executable(
2142 'userdbctl',
2143 userdbctl_sources,
2144 include_directories : includes,
2145 link_with : [libshared],
2146 dependencies : [threads],
2147 install_rpath : rootlibexecdir,
2148 install : true,
2149 install_dir : rootbindir)
2150 endif
2151
2152 if conf.get('ENABLE_HOMED') == 1
2153 executable(
2154 'systemd-homework',
2155 systemd_homework_sources,
2156 include_directories : includes,
2157 link_with : [libshared],
2158 dependencies : [threads,
2159 libcryptsetup,
2160 libblkid,
2161 libcrypt,
2162 libopenssl,
2163 libfdisk,
2164 libp11kit,
2165 libfido2],
2166 install_rpath : rootlibexecdir,
2167 install : true,
2168 install_dir : rootlibexecdir)
2169
2170 executable(
2171 'systemd-homed',
2172 systemd_homed_sources,
2173 include_directories : includes,
2174 link_with : [libshared],
2175 dependencies : [threads,
2176 libcrypt,
2177 libopenssl],
2178 install_rpath : rootlibexecdir,
2179 install : true,
2180 install_dir : rootlibexecdir)
2181
2182 public_programs += executable(
2183 'homectl',
2184 homectl_sources,
2185 include_directories : includes,
2186 link_with : [libshared],
2187 dependencies : [threads,
2188 libcrypt,
2189 libopenssl,
2190 libp11kit,
2191 libfido2],
2192 install_rpath : rootlibexecdir,
2193 install : true,
2194 install_dir : rootbindir)
2195
2196 if conf.get('HAVE_PAM') == 1
2197 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2198 pam_systemd = shared_library(
2199 'pam_systemd_home',
2200 pam_systemd_home_c,
2201 name_prefix : '',
2202 include_directories : includes,
2203 link_args : ['-shared',
2204 '-Wl,--version-script=' + version_script_arg],
2205 link_with : [libsystemd_static,
2206 libshared_static],
2207 dependencies : [threads,
2208 libpam,
2209 libpam_misc,
2210 libcrypt],
2211 link_depends : pam_systemd_home_sym,
2212 install : true,
2213 install_dir : pamlibdir)
2214 endif
2215 endif
2216
2217 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2218 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2219 meson.add_install_script(meson_make_symlink,
2220 join_paths(rootbindir, 'systemctl'),
2221 join_paths(rootsbindir, alias))
2222 endforeach
2223
2224 meson.add_install_script(meson_make_symlink,
2225 join_paths(rootbindir, 'udevadm'),
2226 join_paths(rootlibexecdir, 'systemd-udevd'))
2227
2228 if conf.get('ENABLE_BACKLIGHT') == 1
2229 executable(
2230 'systemd-backlight',
2231 'src/backlight/backlight.c',
2232 include_directories : includes,
2233 link_with : [libshared],
2234 install_rpath : rootlibexecdir,
2235 install : true,
2236 install_dir : rootlibexecdir)
2237 endif
2238
2239 if conf.get('ENABLE_RFKILL') == 1
2240 executable(
2241 'systemd-rfkill',
2242 'src/rfkill/rfkill.c',
2243 include_directories : includes,
2244 link_with : [libshared],
2245 install_rpath : rootlibexecdir,
2246 install : true,
2247 install_dir : rootlibexecdir)
2248 endif
2249
2250 executable(
2251 'systemd-system-update-generator',
2252 'src/system-update-generator/system-update-generator.c',
2253 include_directories : includes,
2254 link_with : [libshared],
2255 install_rpath : rootlibexecdir,
2256 install : true,
2257 install_dir : systemgeneratordir)
2258
2259 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2260 systemd_cryptsetup_sources = files('''
2261 src/cryptsetup/cryptsetup-pkcs11.h
2262 src/cryptsetup/cryptsetup-util.c
2263 src/cryptsetup/cryptsetup-util.h
2264 src/cryptsetup/cryptsetup.c
2265 '''.split())
2266
2267 if conf.get('HAVE_P11KIT') == 1
2268 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2269 endif
2270
2271 executable(
2272 'systemd-cryptsetup',
2273 systemd_cryptsetup_sources,
2274 include_directories : includes,
2275 link_with : [libshared],
2276 dependencies : [libcryptsetup,
2277 libp11kit],
2278 install_rpath : rootlibexecdir,
2279 install : true,
2280 install_dir : rootlibexecdir)
2281
2282 executable(
2283 'systemd-cryptsetup-generator',
2284 'src/cryptsetup/cryptsetup-generator.c',
2285 include_directories : includes,
2286 link_with : [libshared],
2287 dependencies : [libcryptsetup],
2288 install_rpath : rootlibexecdir,
2289 install : true,
2290 install_dir : systemgeneratordir)
2291
2292 executable(
2293 'systemd-veritysetup',
2294 'src/veritysetup/veritysetup.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 dependencies : [libcryptsetup],
2298 install_rpath : rootlibexecdir,
2299 install : true,
2300 install_dir : rootlibexecdir)
2301
2302 executable(
2303 'systemd-veritysetup-generator',
2304 'src/veritysetup/veritysetup-generator.c',
2305 include_directories : includes,
2306 link_with : [libshared],
2307 dependencies : [libcryptsetup],
2308 install_rpath : rootlibexecdir,
2309 install : true,
2310 install_dir : systemgeneratordir)
2311 endif
2312
2313 if conf.get('HAVE_SYSV_COMPAT') == 1
2314 executable(
2315 'systemd-sysv-generator',
2316 'src/sysv-generator/sysv-generator.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2320 install : true,
2321 install_dir : systemgeneratordir)
2322
2323 executable(
2324 'systemd-rc-local-generator',
2325 'src/rc-local-generator/rc-local-generator.c',
2326 include_directories : includes,
2327 link_with : [libshared],
2328 install_rpath : rootlibexecdir,
2329 install : true,
2330 install_dir : systemgeneratordir)
2331 endif
2332
2333 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2334 executable(
2335 'systemd-xdg-autostart-generator',
2336 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2337 'src/xdg-autostart-generator/xdg-autostart-service.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2341 install : true,
2342 install_dir : usergeneratordir)
2343
2344 executable(
2345 'systemd-xdg-autostart-condition',
2346 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 install_rpath : rootlibexecdir,
2350 install : true,
2351 install_dir : rootlibexecdir)
2352 endif
2353
2354 if conf.get('ENABLE_HOSTNAMED') == 1
2355 executable(
2356 'systemd-hostnamed',
2357 'src/hostname/hostnamed.c',
2358 include_directories : includes,
2359 link_with : [libshared],
2360 install_rpath : rootlibexecdir,
2361 install : true,
2362 install_dir : rootlibexecdir)
2363
2364 public_programs += executable(
2365 'hostnamectl',
2366 'src/hostname/hostnamectl.c',
2367 include_directories : includes,
2368 link_with : [libshared],
2369 install_rpath : rootlibexecdir,
2370 install : true)
2371 endif
2372
2373 if conf.get('ENABLE_LOCALED') == 1
2374 if conf.get('HAVE_XKBCOMMON') == 1
2375 # logind will load libxkbcommon.so dynamically on its own
2376 deps = [libdl]
2377 else
2378 deps = []
2379 endif
2380
2381 executable(
2382 'systemd-localed',
2383 systemd_localed_sources,
2384 include_directories : includes,
2385 link_with : [libshared],
2386 dependencies : deps,
2387 install_rpath : rootlibexecdir,
2388 install : true,
2389 install_dir : rootlibexecdir)
2390
2391 public_programs += executable(
2392 'localectl',
2393 localectl_sources,
2394 include_directories : includes,
2395 link_with : [libshared],
2396 install_rpath : rootlibexecdir,
2397 install : true)
2398 endif
2399
2400 if conf.get('ENABLE_TIMEDATED') == 1
2401 executable(
2402 'systemd-timedated',
2403 'src/timedate/timedated.c',
2404 include_directories : includes,
2405 link_with : [libshared],
2406 install_rpath : rootlibexecdir,
2407 install : true,
2408 install_dir : rootlibexecdir)
2409 endif
2410
2411 if conf.get('ENABLE_TIMEDATECTL') == 1
2412 public_programs += executable(
2413 'timedatectl',
2414 'src/timedate/timedatectl.c',
2415 include_directories : includes,
2416 install_rpath : rootlibexecdir,
2417 link_with : [libshared],
2418 dependencies : [libm],
2419 install : true)
2420 endif
2421
2422 if conf.get('ENABLE_TIMESYNCD') == 1
2423 if get_option('link-timesyncd-shared')
2424 timesyncd_link_with = [libshared]
2425 else
2426 timesyncd_link_with = [libsystemd_static,
2427 libshared_static,
2428 libjournal_client,
2429 libbasic_gcrypt]
2430 endif
2431
2432 executable(
2433 'systemd-timesyncd',
2434 systemd_timesyncd_sources,
2435 include_directories : includes,
2436 link_with : [timesyncd_link_with],
2437 dependencies : [threads,
2438 libm],
2439 install_rpath : rootlibexecdir,
2440 install : true,
2441 install_dir : rootlibexecdir)
2442
2443 executable(
2444 'systemd-time-wait-sync',
2445 'src/time-wait-sync/time-wait-sync.c',
2446 include_directories : includes,
2447 link_with : [timesyncd_link_with],
2448 install_rpath : rootlibexecdir,
2449 install : true,
2450 install_dir : rootlibexecdir)
2451 endif
2452
2453 if conf.get('ENABLE_MACHINED') == 1
2454 executable(
2455 'systemd-machined',
2456 systemd_machined_sources,
2457 include_directories : includes,
2458 link_with : [libmachine_core,
2459 libshared],
2460 install_rpath : rootlibexecdir,
2461 install : true,
2462 install_dir : rootlibexecdir)
2463
2464 public_programs += executable(
2465 'machinectl',
2466 'src/machine/machinectl.c',
2467 include_directories : includes,
2468 link_with : [libshared],
2469 dependencies : [threads,
2470 libxz,
2471 liblz4,
2472 libzstd],
2473 install_rpath : rootlibexecdir,
2474 install : true,
2475 install_dir : rootbindir)
2476 endif
2477
2478 if conf.get('ENABLE_IMPORTD') == 1
2479 executable(
2480 'systemd-importd',
2481 systemd_importd_sources,
2482 include_directories : includes,
2483 link_with : [libshared],
2484 dependencies : [threads],
2485 install_rpath : rootlibexecdir,
2486 install : true,
2487 install_dir : rootlibexecdir)
2488
2489 systemd_pull = executable(
2490 'systemd-pull',
2491 systemd_pull_sources,
2492 include_directories : includes,
2493 link_with : [libshared],
2494 dependencies : [versiondep,
2495 libcurl,
2496 libz,
2497 libbzip2,
2498 libxz,
2499 libgcrypt],
2500 install_rpath : rootlibexecdir,
2501 install : true,
2502 install_dir : rootlibexecdir)
2503
2504 systemd_import = executable(
2505 'systemd-import',
2506 systemd_import_sources,
2507 include_directories : includes,
2508 link_with : [libshared],
2509 dependencies : [libcurl,
2510 libz,
2511 libbzip2,
2512 libxz],
2513 install_rpath : rootlibexecdir,
2514 install : true,
2515 install_dir : rootlibexecdir)
2516
2517 systemd_import_fs = executable(
2518 'systemd-import-fs',
2519 systemd_import_fs_sources,
2520 include_directories : includes,
2521 link_with : [libshared],
2522 install_rpath : rootlibexecdir,
2523 install : true,
2524 install_dir : rootlibexecdir)
2525
2526 systemd_export = executable(
2527 'systemd-export',
2528 systemd_export_sources,
2529 include_directories : includes,
2530 link_with : [libshared],
2531 dependencies : [libcurl,
2532 libz,
2533 libbzip2,
2534 libxz],
2535 install_rpath : rootlibexecdir,
2536 install : true,
2537 install_dir : rootlibexecdir)
2538
2539 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2540 endif
2541
2542 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2543 public_programs += executable(
2544 'systemd-journal-upload',
2545 systemd_journal_upload_sources,
2546 include_directories : includes,
2547 link_with : [libshared],
2548 dependencies : [versiondep,
2549 threads,
2550 libcurl,
2551 libgnutls,
2552 libxz,
2553 liblz4,
2554 libzstd],
2555 install_rpath : rootlibexecdir,
2556 install : true,
2557 install_dir : rootlibexecdir)
2558 endif
2559
2560 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2561 public_programs += executable(
2562 'systemd-journal-remote',
2563 systemd_journal_remote_sources,
2564 include_directories : includes,
2565 link_with : [libshared,
2566 libsystemd_journal_remote],
2567 dependencies : [threads,
2568 libmicrohttpd,
2569 libgnutls,
2570 libxz,
2571 liblz4,
2572 libzstd],
2573 install_rpath : rootlibexecdir,
2574 install : true,
2575 install_dir : rootlibexecdir)
2576
2577 public_programs += executable(
2578 'systemd-journal-gatewayd',
2579 systemd_journal_gatewayd_sources,
2580 include_directories : includes,
2581 link_with : [libshared],
2582 dependencies : [threads,
2583 libmicrohttpd,
2584 libgnutls,
2585 libxz,
2586 liblz4,
2587 libzstd],
2588 install_rpath : rootlibexecdir,
2589 install : true,
2590 install_dir : rootlibexecdir)
2591 endif
2592
2593 if conf.get('ENABLE_COREDUMP') == 1
2594 executable(
2595 'systemd-coredump',
2596 systemd_coredump_sources,
2597 include_directories : includes,
2598 link_with : [libshared],
2599 dependencies : [threads,
2600 libacl,
2601 libdw,
2602 libxz,
2603 liblz4,
2604 libzstd],
2605 install_rpath : rootlibexecdir,
2606 install : true,
2607 install_dir : rootlibexecdir)
2608
2609 public_programs += executable(
2610 'coredumpctl',
2611 coredumpctl_sources,
2612 include_directories : includes,
2613 link_with : [libshared],
2614 dependencies : [threads,
2615 libxz,
2616 liblz4,
2617 libzstd],
2618 install_rpath : rootlibexecdir,
2619 install : true)
2620 endif
2621
2622 if conf.get('ENABLE_PSTORE') == 1
2623 executable(
2624 'systemd-pstore',
2625 systemd_pstore_sources,
2626 include_directories : includes,
2627 link_with : [libshared],
2628 dependencies : [threads,
2629 libacl,
2630 libdw,
2631 libxz,
2632 liblz4,
2633 libzstd],
2634 install_rpath : rootlibexecdir,
2635 install : true,
2636 install_dir : rootlibexecdir)
2637 endif
2638
2639 if conf.get('ENABLE_BINFMT') == 1
2640 public_programs += executable(
2641 'systemd-binfmt',
2642 'src/binfmt/binfmt.c',
2643 include_directories : includes,
2644 link_with : [libshared],
2645 install_rpath : rootlibexecdir,
2646 install : true,
2647 install_dir : rootlibexecdir)
2648
2649 meson.add_install_script('sh', '-c',
2650 mkdir_p.format(binfmtdir))
2651 meson.add_install_script('sh', '-c',
2652 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2653 endif
2654
2655 if conf.get('ENABLE_REPART') == 1
2656 exe = executable(
2657 'systemd-repart',
2658 systemd_repart_sources,
2659 include_directories : includes,
2660 link_with : [libshared],
2661 dependencies : [threads,
2662 libcryptsetup,
2663 libblkid,
2664 libfdisk,
2665 libopenssl],
2666 install_rpath : rootlibexecdir,
2667 install : true,
2668 install_dir : rootbindir)
2669 public_programs += exe
2670
2671 if want_tests != 'false'
2672 test('test-repart',
2673 test_repart_sh,
2674 args : exe.full_path())
2675 endif
2676 endif
2677
2678 if conf.get('ENABLE_VCONSOLE') == 1
2679 executable(
2680 'systemd-vconsole-setup',
2681 'src/vconsole/vconsole-setup.c',
2682 include_directories : includes,
2683 link_with : [libshared],
2684 install_rpath : rootlibexecdir,
2685 install : true,
2686 install_dir : rootlibexecdir)
2687 endif
2688
2689 if conf.get('ENABLE_RANDOMSEED') == 1
2690 executable(
2691 'systemd-random-seed',
2692 'src/random-seed/random-seed.c',
2693 include_directories : includes,
2694 link_with : [libshared],
2695 install_rpath : rootlibexecdir,
2696 install : true,
2697 install_dir : rootlibexecdir)
2698 endif
2699
2700 if conf.get('ENABLE_FIRSTBOOT') == 1
2701 executable(
2702 'systemd-firstboot',
2703 'src/firstboot/firstboot.c',
2704 include_directories : includes,
2705 link_with : [libshared],
2706 dependencies : [libcrypt],
2707 install_rpath : rootlibexecdir,
2708 install : true,
2709 install_dir : rootbindir)
2710 endif
2711
2712 executable(
2713 'systemd-remount-fs',
2714 'src/remount-fs/remount-fs.c',
2715 include_directories : includes,
2716 link_with : [libcore_shared,
2717 libshared],
2718 install_rpath : rootlibexecdir,
2719 install : true,
2720 install_dir : rootlibexecdir)
2721
2722 executable(
2723 'systemd-machine-id-setup',
2724 'src/machine-id-setup/machine-id-setup-main.c',
2725 include_directories : includes,
2726 link_with : [libcore_shared,
2727 libshared],
2728 install_rpath : rootlibexecdir,
2729 install : true,
2730 install_dir : rootbindir)
2731
2732 executable(
2733 'systemd-fsck',
2734 'src/fsck/fsck.c',
2735 include_directories : includes,
2736 link_with : [libshared],
2737 install_rpath : rootlibexecdir,
2738 install : true,
2739 install_dir : rootlibexecdir)
2740
2741 executable('systemd-growfs',
2742 'src/partition/growfs.c',
2743 include_directories : includes,
2744 link_with : [libshared],
2745 dependencies : [libcryptsetup],
2746 install_rpath : rootlibexecdir,
2747 install : true,
2748 install_dir : rootlibexecdir)
2749
2750 executable(
2751 'systemd-makefs',
2752 'src/partition/makefs.c',
2753 include_directories : includes,
2754 link_with : [libshared],
2755 install_rpath : rootlibexecdir,
2756 install : true,
2757 install_dir : rootlibexecdir)
2758
2759 executable(
2760 'systemd-sleep',
2761 'src/sleep/sleep.c',
2762 include_directories : includes,
2763 link_with : [libshared],
2764 install_rpath : rootlibexecdir,
2765 install : true,
2766 install_dir : rootlibexecdir)
2767
2768 install_data('src/sleep/sleep.conf',
2769 install_dir : pkgsysconfdir)
2770
2771 public_programs += executable(
2772 'systemd-sysctl',
2773 'src/sysctl/sysctl.c',
2774 include_directories : includes,
2775 link_with : [libshared],
2776 install_rpath : rootlibexecdir,
2777 install : true,
2778 install_dir : rootlibexecdir)
2779
2780 executable(
2781 'systemd-ac-power',
2782 'src/ac-power/ac-power.c',
2783 include_directories : includes,
2784 link_with : [libshared],
2785 install_rpath : rootlibexecdir,
2786 install : true,
2787 install_dir : rootlibexecdir)
2788
2789 public_programs += executable(
2790 'systemd-detect-virt',
2791 'src/detect-virt/detect-virt.c',
2792 include_directories : includes,
2793 link_with : [libshared],
2794 install_rpath : rootlibexecdir,
2795 install : true)
2796
2797 public_programs += executable(
2798 'systemd-delta',
2799 'src/delta/delta.c',
2800 include_directories : includes,
2801 link_with : [libshared],
2802 install_rpath : rootlibexecdir,
2803 install : true)
2804
2805 public_programs += executable(
2806 'systemd-escape',
2807 'src/escape/escape.c',
2808 include_directories : includes,
2809 link_with : [libshared],
2810 install_rpath : rootlibexecdir,
2811 install : true,
2812 install_dir : rootbindir)
2813
2814 public_programs += executable(
2815 'systemd-notify',
2816 'src/notify/notify.c',
2817 include_directories : includes,
2818 link_with : [libshared],
2819 install_rpath : rootlibexecdir,
2820 install : true,
2821 install_dir : rootbindir)
2822
2823 executable(
2824 'systemd-volatile-root',
2825 'src/volatile-root/volatile-root.c',
2826 include_directories : includes,
2827 link_with : [libshared],
2828 install_rpath : rootlibexecdir,
2829 install : conf.get('ENABLE_INITRD') == 1,
2830 install_dir : rootlibexecdir)
2831
2832 executable(
2833 'systemd-cgroups-agent',
2834 'src/cgroups-agent/cgroups-agent.c',
2835 include_directories : includes,
2836 link_with : [libshared],
2837 install_rpath : rootlibexecdir,
2838 install : true,
2839 install_dir : rootlibexecdir)
2840
2841 public_programs += executable(
2842 'systemd-id128',
2843 'src/id128/id128.c',
2844 include_directories : includes,
2845 link_with : [libshared],
2846 install_rpath : rootlibexecdir,
2847 install : true)
2848
2849 public_programs += executable(
2850 'systemd-path',
2851 'src/path/path.c',
2852 include_directories : includes,
2853 link_with : [libshared],
2854 install_rpath : rootlibexecdir,
2855 install : true)
2856
2857 public_programs += executable(
2858 'systemd-ask-password',
2859 'src/ask-password/ask-password.c',
2860 include_directories : includes,
2861 link_with : [libshared],
2862 install_rpath : rootlibexecdir,
2863 install : true,
2864 install_dir : rootbindir)
2865
2866 executable(
2867 'systemd-reply-password',
2868 'src/reply-password/reply-password.c',
2869 include_directories : includes,
2870 link_with : [libshared],
2871 install_rpath : rootlibexecdir,
2872 install : true,
2873 install_dir : rootlibexecdir)
2874
2875 public_programs += executable(
2876 'systemd-tty-ask-password-agent',
2877 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2878 include_directories : includes,
2879 link_with : [libshared],
2880 install_rpath : rootlibexecdir,
2881 install : true,
2882 install_dir : rootbindir)
2883
2884 public_programs += executable(
2885 'systemd-cgls',
2886 'src/cgls/cgls.c',
2887 include_directories : includes,
2888 link_with : [libshared],
2889 install_rpath : rootlibexecdir,
2890 install : true)
2891
2892 public_programs += executable(
2893 'systemd-cgtop',
2894 'src/cgtop/cgtop.c',
2895 include_directories : includes,
2896 link_with : [libshared],
2897 install_rpath : rootlibexecdir,
2898 install : true)
2899
2900 executable(
2901 'systemd-initctl',
2902 'src/initctl/initctl.c',
2903 include_directories : includes,
2904 link_with : [libshared],
2905 install_rpath : rootlibexecdir,
2906 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2907 install_dir : rootlibexecdir)
2908
2909 public_programs += executable(
2910 'systemd-mount',
2911 'src/mount/mount-tool.c',
2912 include_directories : includes,
2913 link_with : [libshared],
2914 dependencies: [libmount],
2915 install_rpath : rootlibexecdir,
2916 install : true)
2917
2918 meson.add_install_script(meson_make_symlink,
2919 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2920
2921 public_programs += executable(
2922 'systemd-run',
2923 'src/run/run.c',
2924 include_directories : includes,
2925 link_with : [libshared],
2926 install_rpath : rootlibexecdir,
2927 install : true)
2928
2929 public_programs += executable(
2930 'systemd-stdio-bridge',
2931 'src/stdio-bridge/stdio-bridge.c',
2932 include_directories : includes,
2933 link_with : [libshared],
2934 dependencies : [versiondep],
2935 install_rpath : rootlibexecdir,
2936 install : true)
2937
2938 public_programs += executable(
2939 'busctl',
2940 'src/busctl/busctl.c',
2941 'src/busctl/busctl-introspect.c',
2942 'src/busctl/busctl-introspect.h',
2943 include_directories : includes,
2944 link_with : [libshared],
2945 install_rpath : rootlibexecdir,
2946 install : true)
2947
2948 if conf.get('ENABLE_SYSUSERS') == 1
2949 public_programs += executable(
2950 'systemd-sysusers',
2951 'src/sysusers/sysusers.c',
2952 include_directories : includes,
2953 link_with : [libshared],
2954 install_rpath : rootlibexecdir,
2955 install : true,
2956 install_dir : rootbindir)
2957
2958 if have_standalone_binaries
2959 public_programs += executable(
2960 'systemd-sysusers.standalone',
2961 'src/sysusers/sysusers.c',
2962 include_directories : includes,
2963 link_with : [libshared_static,
2964 libbasic,
2965 libbasic_gcrypt,
2966 libsystemd_static,
2967 libjournal_client],
2968 install : true,
2969 install_dir : rootbindir)
2970 endif
2971 endif
2972
2973 if conf.get('ENABLE_TMPFILES') == 1
2974 exe = executable(
2975 'systemd-tmpfiles',
2976 systemd_tmpfiles_sources,
2977 include_directories : includes,
2978 link_with : [libshared],
2979 dependencies : [libacl],
2980 install_rpath : rootlibexecdir,
2981 install : true,
2982 install_dir : rootbindir)
2983 public_programs += exe
2984
2985 if want_tests != 'false'
2986 test('test-systemd-tmpfiles',
2987 test_systemd_tmpfiles_py,
2988 # https://github.com/mesonbuild/meson/issues/2681
2989 args : exe.full_path())
2990 endif
2991
2992 if have_standalone_binaries
2993 public_programs += executable(
2994 'systemd-tmpfiles.standalone',
2995 systemd_tmpfiles_sources,
2996 include_directories : includes,
2997 link_with : [libshared_static,
2998 libbasic,
2999 libbasic_gcrypt,
3000 libsystemd_static,
3001 libjournal_client],
3002 dependencies : [libacl],
3003 install : true,
3004 install_dir : rootbindir)
3005 endif
3006 endif
3007
3008 if conf.get('ENABLE_HWDB') == 1
3009 public_programs += executable(
3010 'systemd-hwdb',
3011 'src/hwdb/hwdb.c',
3012 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3013 include_directories : includes,
3014 link_with : [libudev_static],
3015 install_rpath : udev_rpath,
3016 install : true,
3017 install_dir : rootbindir)
3018 endif
3019
3020 if conf.get('ENABLE_QUOTACHECK') == 1
3021 executable(
3022 'systemd-quotacheck',
3023 'src/quotacheck/quotacheck.c',
3024 include_directories : includes,
3025 link_with : [libshared],
3026 install_rpath : rootlibexecdir,
3027 install : true,
3028 install_dir : rootlibexecdir)
3029 endif
3030
3031 public_programs += executable(
3032 'systemd-socket-proxyd',
3033 'src/socket-proxy/socket-proxyd.c',
3034 include_directories : includes,
3035 link_with : [libshared],
3036 dependencies : [threads],
3037 install_rpath : rootlibexecdir,
3038 install : true,
3039 install_dir : rootlibexecdir)
3040
3041 public_programs += executable(
3042 'udevadm',
3043 udevadm_sources,
3044 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3045 include_directories : includes,
3046 link_with : [libudev_core,
3047 libsystemd_network,
3048 libudev_static],
3049 dependencies : [versiondep,
3050 threads,
3051 libkmod,
3052 libidn,
3053 libacl,
3054 libblkid],
3055 install_rpath : udev_rpath,
3056 install : true,
3057 install_dir : rootbindir)
3058
3059 executable(
3060 'systemd-shutdown',
3061 systemd_shutdown_sources,
3062 include_directories : includes,
3063 link_with : [libcore_shared,
3064 libshared],
3065 dependencies : [libmount],
3066 install_rpath : rootlibexecdir,
3067 install : true,
3068 install_dir : rootlibexecdir)
3069
3070 executable(
3071 'systemd-update-done',
3072 'src/update-done/update-done.c',
3073 include_directories : includes,
3074 link_with : [libshared],
3075 install_rpath : rootlibexecdir,
3076 install : true,
3077 install_dir : rootlibexecdir)
3078
3079 executable(
3080 'systemd-update-utmp',
3081 'src/update-utmp/update-utmp.c',
3082 include_directories : includes,
3083 link_with : [libshared],
3084 dependencies : [libaudit],
3085 install_rpath : rootlibexecdir,
3086 install : (conf.get('ENABLE_UTMP') == 1),
3087 install_dir : rootlibexecdir)
3088
3089 if conf.get('HAVE_KMOD') == 1
3090 executable(
3091 'systemd-modules-load',
3092 'src/modules-load/modules-load.c',
3093 include_directories : includes,
3094 link_with : [libshared],
3095 dependencies : [libkmod],
3096 install_rpath : rootlibexecdir,
3097 install : true,
3098 install_dir : rootlibexecdir)
3099
3100 meson.add_install_script('sh', '-c',
3101 mkdir_p.format(modulesloaddir))
3102 meson.add_install_script('sh', '-c',
3103 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3104 endif
3105
3106 public_programs += executable(
3107 'systemd-nspawn',
3108 systemd_nspawn_sources,
3109 include_directories : includes,
3110 link_with : [libcore_shared,
3111 libnspawn_core,
3112 libshared],
3113 dependencies : [libblkid,
3114 libseccomp],
3115 install_rpath : rootlibexecdir,
3116 install : true)
3117
3118 if conf.get('ENABLE_NETWORKD') == 1
3119 executable(
3120 'systemd-networkd',
3121 systemd_networkd_sources,
3122 include_directories : network_include_dir,
3123 link_with : [libnetworkd_core,
3124 libsystemd_network,
3125 libudev_static,
3126 networkd_link_with],
3127 dependencies : [threads],
3128 install_rpath : rootlibexecdir,
3129 install : true,
3130 install_dir : rootlibexecdir)
3131
3132 executable(
3133 'systemd-networkd-wait-online',
3134 systemd_networkd_wait_online_sources,
3135 include_directories : includes,
3136 link_with : [libnetworkd_core,
3137 networkd_link_with],
3138 install_rpath : rootlibexecdir,
3139 install : true,
3140 install_dir : rootlibexecdir)
3141
3142 public_programs += executable(
3143 'networkctl',
3144 networkctl_sources,
3145 include_directories : includes,
3146 link_with : [libsystemd_network,
3147 networkd_link_with],
3148 install_rpath : rootlibexecdir,
3149 install : true,
3150 install_dir : rootbindir)
3151
3152 exe = executable(
3153 'systemd-network-generator',
3154 network_generator_sources,
3155 include_directories : includes,
3156 link_with : [networkd_link_with],
3157 install_rpath : rootlibexecdir,
3158 install : true,
3159 install_dir : rootlibexecdir)
3160
3161 if want_tests != 'false'
3162 test('test-network-generator-conversion',
3163 test_network_generator_conversion_sh,
3164 # https://github.com/mesonbuild/meson/issues/2681
3165 args : exe.full_path())
3166 endif
3167 endif
3168
3169 executable(
3170 'systemd-sulogin-shell',
3171 ['src/sulogin-shell/sulogin-shell.c'],
3172 include_directories : includes,
3173 link_with : [libshared],
3174 install_rpath : rootlibexecdir,
3175 install : true,
3176 install_dir : rootlibexecdir)
3177
3178 ############################################################
3179
3180 custom_target(
3181 'systemd-runtest.env',
3182 output : 'systemd-runtest.env',
3183 command : ['sh', '-c', '{ ' +
3184 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3185 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3186 '} >@OUTPUT@'],
3187 build_by_default : true)
3188
3189 foreach tuple : tests
3190 sources = tuple[0]
3191 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3192 dependencies = tuple[2]
3193 condition = tuple.length() >= 4 ? tuple[3] : ''
3194 type = tuple.length() >= 5 ? tuple[4] : ''
3195 defs = tuple.length() >= 6 ? tuple[5] : []
3196 incs = tuple.length() >= 7 ? tuple[6] : includes
3197 timeout = 30
3198
3199 name = sources[0].split('/')[-1].split('.')[0]
3200 if type.startswith('timeout=')
3201 timeout = type.split('=')[1].to_int()
3202 type = ''
3203 endif
3204
3205 if condition == '' or conf.get(condition) == 1
3206 exe = executable(
3207 name,
3208 sources,
3209 include_directories : incs,
3210 link_with : link_with,
3211 dependencies : [versiondep,
3212 dependencies],
3213 c_args : defs,
3214 build_by_default : want_tests != 'false',
3215 install_rpath : rootlibexecdir,
3216 install : install_tests,
3217 install_dir : join_paths(testsdir, type))
3218
3219 if type == 'manual'
3220 message('@0@ is a manual test'.format(name))
3221 elif type == 'unsafe' and want_tests != 'unsafe'
3222 message('@0@ is an unsafe test'.format(name))
3223 elif want_tests != 'false'
3224 test(name, exe,
3225 env : test_env,
3226 timeout : timeout)
3227 endif
3228 else
3229 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3230 endif
3231 endforeach
3232
3233 exe = executable(
3234 'test-libsystemd-sym',
3235 test_libsystemd_sym_c,
3236 include_directories : includes,
3237 link_with : [libsystemd],
3238 build_by_default : want_tests != 'false',
3239 install : install_tests,
3240 install_dir : testsdir)
3241 if want_tests != 'false'
3242 test('test-libsystemd-sym', exe)
3243 endif
3244
3245 exe = executable(
3246 'test-libsystemd-static-sym',
3247 test_libsystemd_sym_c,
3248 include_directories : includes,
3249 link_with : [install_libsystemd_static],
3250 dependencies : [threads], # threads is already included in dependencies on the library,
3251 # but does not seem to get propagated. Add here as a work-around.
3252 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3253 install : install_tests and static_libsystemd_pic,
3254 install_dir : testsdir)
3255 if want_tests != 'false' and static_libsystemd_pic
3256 test('test-libsystemd-static-sym', exe)
3257 endif
3258
3259 exe = executable(
3260 'test-libudev-sym',
3261 test_libudev_sym_c,
3262 include_directories : includes,
3263 c_args : '-Wno-deprecated-declarations',
3264 link_with : [libudev],
3265 build_by_default : want_tests != 'false',
3266 install : install_tests,
3267 install_dir : testsdir)
3268 if want_tests != 'false'
3269 test('test-libudev-sym', exe)
3270 endif
3271
3272 exe = executable(
3273 'test-libudev-static-sym',
3274 test_libudev_sym_c,
3275 include_directories : includes,
3276 c_args : '-Wno-deprecated-declarations',
3277 link_with : [install_libudev_static],
3278 build_by_default : want_tests != 'false' and static_libudev_pic,
3279 install : install_tests and static_libudev_pic,
3280 install_dir : testsdir)
3281 if want_tests != 'false' and static_libudev_pic
3282 test('test-libudev-static-sym', exe)
3283 endif
3284
3285 ############################################################
3286
3287 fuzzer_exes = []
3288
3289 if get_option('tests') != 'false'
3290 foreach tuple : fuzzers
3291 sources = tuple[0]
3292 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3293 dependencies = tuple[2]
3294 defs = tuple.length() >= 4 ? tuple[3] : []
3295 incs = tuple.length() >= 5 ? tuple[4] : includes
3296 link_args = []
3297
3298 if want_ossfuzz
3299 dependencies += fuzzing_engine
3300 elif want_libfuzzer
3301 if fuzzing_engine.found()
3302 dependencies += fuzzing_engine
3303 else
3304 link_args += ['-fsanitize=fuzzer']
3305 endif
3306 else
3307 sources += 'src/fuzz/fuzz-main.c'
3308 endif
3309
3310 name = sources[0].split('/')[-1].split('.')[0]
3311
3312 fuzzer_exes += executable(
3313 name,
3314 sources,
3315 include_directories : [incs, include_directories('src/fuzz')],
3316 link_with : link_with,
3317 dependencies : dependencies,
3318 c_args : defs,
3319 link_args: link_args,
3320 install : false)
3321 endforeach
3322 endif
3323
3324 run_target(
3325 'fuzzers',
3326 depends : fuzzer_exes,
3327 command : ['true'])
3328
3329 ############################################################
3330
3331 make_directive_index_py = find_program('tools/make-directive-index.py')
3332 make_man_index_py = find_program('tools/make-man-index.py')
3333 xml_helper_py = find_program('tools/xml_helper.py')
3334 hwdb_update_sh = find_program('tools/hwdb-update.sh')
3335 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
3336
3337 subdir('sysctl.d')
3338 subdir('sysusers.d')
3339 subdir('tmpfiles.d')
3340 subdir('hwdb.d')
3341 subdir('units')
3342 subdir('presets')
3343 subdir('network')
3344 subdir('man')
3345 subdir('shell-completion/bash')
3346 subdir('shell-completion/zsh')
3347 subdir('docs/sysvinit')
3348 subdir('docs/var-log')
3349
3350 install_subdir('factory/etc',
3351 install_dir : factorydir)
3352
3353 install_data('xorg/50-systemd-user.sh',
3354 install_dir : xinitrcdir)
3355 install_data('modprobe.d/systemd.conf',
3356 install_dir : modprobedir)
3357 install_data('LICENSE.GPL2',
3358 'LICENSE.LGPL2.1',
3359 'NEWS',
3360 'README',
3361 'docs/CODING_STYLE.md',
3362 'docs/DISTRO_PORTING.md',
3363 'docs/ENVIRONMENT.md',
3364 'docs/HACKING.md',
3365 'docs/TRANSIENT-SETTINGS.md',
3366 'docs/TRANSLATORS.md',
3367 'docs/UIDS-GIDS.md',
3368 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3369 install_dir : docdir)
3370
3371 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3372 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3373
3374 ############################################################
3375
3376 check_help = find_program('tools/check-help.sh')
3377
3378 foreach exec : public_programs
3379 name = exec.full_path().split('/')[-1]
3380 if want_tests != 'false'
3381 test('check-help-' + name,
3382 check_help,
3383 args : exec.full_path())
3384 endif
3385 endforeach
3386
3387 ############################################################
3388
3389 check_directives_sh = find_program('tools/check-directives.sh')
3390
3391 if want_tests != 'false'
3392 test('check-directives',
3393 check_directives_sh,
3394 args : project_source_root)
3395 endif
3396
3397 ############################################################
3398
3399 # Enable tests for all supported sanitizers
3400 foreach tuple : sanitizers
3401 sanitizer = tuple[0]
3402 build = tuple[1]
3403
3404 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3405 prev = ''
3406 foreach p : fuzz_regression_tests
3407 b = p.split('/')[-2]
3408 c = p.split('/')[-1]
3409
3410 name = '@0@:@1@'.format(b, sanitizer)
3411
3412 if name != prev
3413 if want_tests == 'false'
3414 message('Not compiling @0@ because tests is set to false'.format(name))
3415 elif slow_tests or fuzz_tests
3416 exe = custom_target(
3417 name,
3418 output : name,
3419 depends : build,
3420 command : [env, 'ln', '-fs',
3421 join_paths(build.full_path(), b),
3422 '@OUTPUT@'],
3423 build_by_default : true)
3424 else
3425 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3426 endif
3427 endif
3428 prev = name
3429
3430 if want_tests != 'false' and (slow_tests or fuzz_tests)
3431 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3432 env,
3433 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3434 timeout : 60,
3435 args : [exe.full_path(),
3436 join_paths(project_source_root, p)])
3437 endif
3438 endforeach
3439 endif
3440 endforeach
3441
3442
3443 ############################################################
3444
3445 if git.found()
3446 all_files = run_command(
3447 git,
3448 ['--git-dir=@0@/.git'.format(project_source_root),
3449 'ls-files',
3450 ':/*.[ch]'])
3451 all_files = files(all_files.stdout().split())
3452
3453 custom_target(
3454 'tags',
3455 output : 'tags',
3456 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3457 run_target(
3458 'ctags',
3459 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3460 endif
3461
3462 if git.found()
3463 git_contrib_sh = find_program('tools/git-contrib.sh')
3464 run_target(
3465 'git-contrib',
3466 command : [git_contrib_sh])
3467 endif
3468
3469 if git.found()
3470 git_head = run_command(
3471 git,
3472 ['--git-dir=@0@/.git'.format(project_source_root),
3473 'rev-parse', 'HEAD']).stdout().strip()
3474 git_head_short = run_command(
3475 git,
3476 ['--git-dir=@0@/.git'.format(project_source_root),
3477 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3478
3479 run_target(
3480 'git-snapshot',
3481 command : ['git', 'archive',
3482 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3483 git_head_short),
3484 '--prefix', 'systemd-@0@/'.format(git_head),
3485 'HEAD'])
3486 endif
3487
3488 ############################################################
3489
3490 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3491 run_target(
3492 'check-api-docs',
3493 depends : [man, libsystemd, libudev],
3494 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3495
3496 ############################################################
3497 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3498
3499 status = [
3500 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3501
3502 'split /usr: @0@'.format(split_usr),
3503 'split bin-sbin: @0@'.format(split_bin),
3504 'prefix directory: @0@'.format(prefixdir),
3505 'rootprefix directory: @0@'.format(rootprefixdir),
3506 'sysconf directory: @0@'.format(sysconfdir),
3507 'include directory: @0@'.format(includedir),
3508 'lib directory: @0@'.format(libdir),
3509 'rootlib directory: @0@'.format(rootlibdir),
3510 'SysV init scripts: @0@'.format(sysvinit_path),
3511 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3512 'PAM modules directory: @0@'.format(pamlibdir),
3513 'PAM configuration directory: @0@'.format(pamconfdir),
3514 'RPM macros directory: @0@'.format(rpmmacrosdir),
3515 'modprobe.d directory: @0@'.format(modprobedir),
3516 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3517 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3518 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3519 'bash completions directory: @0@'.format(bashcompletiondir),
3520 'zsh completions directory: @0@'.format(zshcompletiondir),
3521 'extra start script: @0@'.format(get_option('rc-local')),
3522 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3523 get_option('debug-tty')),
3524 'TTY GID: @0@'.format(tty_gid),
3525 'users GID: @0@'.format(substs.get('USERS_GID')),
3526 'maximum system UID: @0@'.format(system_uid_max),
3527 'maximum system GID: @0@'.format(system_gid_max),
3528 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3529 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3530 'minimum container UID base: @0@'.format(container_uid_base_min),
3531 'maximum container UID base: @0@'.format(container_uid_base_max),
3532 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3533 'render group access mode: @0@'.format(get_option('group-render-mode')),
3534 'certificate root directory: @0@'.format(get_option('certificate-root')),
3535 'support URL: @0@'.format(support_url),
3536 'nobody user name: @0@'.format(nobody_user),
3537 'nobody group name: @0@'.format(nobody_group),
3538 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3539 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3540
3541 'default DNSSEC mode: @0@'.format(default_dnssec),
3542 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3543 'default mDNS mode: @0@'.format(default_mdns),
3544 'default LLMNR mode: @0@'.format(default_llmnr),
3545 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3546 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3547 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3548 'default locale: @0@'.format(default_locale),
3549 'default user $PATH: @0@'.format(default_user_path_display),
3550 'systemd service watchdog: @0@'.format(watchdog_opt)]
3551
3552 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3553 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3554 status += [
3555 'default DNS servers: @0@'.format(alt_dns_servers),
3556 'default NTP servers: @0@'.format(alt_ntp_servers)]
3557
3558 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3559 '@@0@'.format(time_epoch)).stdout().strip()
3560 status += [
3561 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3562
3563 status += [
3564 'static libsystemd: @0@'.format(static_libsystemd),
3565 'static libudev: @0@'.format(static_libudev)]
3566
3567 # TODO:
3568 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3569 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3570 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3571
3572 if conf.get('ENABLE_EFI') == 1
3573 status += 'efi arch: @0@'.format(efi_arch)
3574
3575 if have_gnu_efi
3576 status += [
3577 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3578 'EFI CC @0@'.format(' '.join(efi_cc)),
3579 'EFI lds: @0@'.format(efi_lds),
3580 'EFI crt0: @0@'.format(efi_crt0),
3581 'EFI include directory: @0@'.format(efi_incdir)]
3582 endif
3583 endif
3584
3585 found = []
3586 missing = []
3587
3588 foreach tuple : [
3589 ['libcryptsetup'],
3590 ['PAM'],
3591 ['pwquality'],
3592 ['libfdisk'],
3593 ['p11kit'],
3594 ['libfido2'],
3595 ['AUDIT'],
3596 ['IMA'],
3597 ['AppArmor'],
3598 ['SELinux'],
3599 ['SECCOMP'],
3600 ['SMACK'],
3601 ['zlib'],
3602 ['xz'],
3603 ['zstd'],
3604 ['lz4'],
3605 ['bzip2'],
3606 ['ACL'],
3607 ['gcrypt'],
3608 ['qrencode'],
3609 ['microhttpd'],
3610 ['gnutls'],
3611 ['openssl'],
3612 ['libcurl'],
3613 ['idn'],
3614 ['initrd'],
3615 ['libidn2'],
3616 ['libidn'],
3617 ['libiptc'],
3618 ['elfutils'],
3619 ['binfmt'],
3620 ['repart'],
3621 ['vconsole'],
3622 ['quotacheck'],
3623 ['tmpfiles'],
3624 ['environment.d'],
3625 ['sysusers'],
3626 ['firstboot'],
3627 ['randomseed'],
3628 ['backlight'],
3629 ['rfkill'],
3630 ['xdg-autostart'],
3631 ['logind'],
3632 ['machined'],
3633 ['portabled'],
3634 ['userdb'],
3635 ['homed'],
3636 ['importd'],
3637 ['hostnamed'],
3638 ['timedated'],
3639 ['timesyncd'],
3640 ['localed'],
3641 ['networkd'],
3642 ['resolve'],
3643 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3644 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3645 ['coredump'],
3646 ['pstore'],
3647 ['polkit'],
3648 ['legacy pkla', install_polkit_pkla],
3649 ['efi'],
3650 ['gnu-efi', have_gnu_efi],
3651 ['kmod'],
3652 ['xkbcommon'],
3653 ['pcre2'],
3654 ['blkid'],
3655 ['dbus'],
3656 ['glib'],
3657 ['nss-myhostname'],
3658 ['nss-mymachines'],
3659 ['nss-resolve'],
3660 ['nss-systemd'],
3661 ['hwdb'],
3662 ['tpm'],
3663 ['man pages', want_man],
3664 ['html pages', want_html],
3665 ['man page indices', want_man and have_lxml],
3666 ['SysV compat'],
3667 ['utmp'],
3668 ['ldconfig'],
3669 ['hibernate'],
3670 ['adm group', get_option('adm-group')],
3671 ['wheel group', get_option('wheel-group')],
3672 ['gshadow'],
3673 ['debug hashmap'],
3674 ['debug mmap cache'],
3675 ['debug siphash'],
3676 ['valgrind', conf.get('VALGRIND') == 1],
3677 ['trace logging', conf.get('LOG_TRACE') == 1],
3678 ['install tests', install_tests],
3679 ['link-udev-shared', get_option('link-udev-shared')],
3680 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3681 ['link-networkd-shared', get_option('link-networkd-shared')],
3682 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3683 ['kernel-install', get_option('kernel-install')],
3684 ['systemd-analyze', get_option('analyze')],
3685 ]
3686
3687 if tuple.length() >= 2
3688 cond = tuple[1]
3689 else
3690 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3691 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3692 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3693 endif
3694 if cond
3695 found += tuple[0]
3696 else
3697 missing += tuple[0]
3698 endif
3699 endforeach
3700
3701 status += [
3702 '',
3703 'enabled features: @0@'.format(', '.join(found)),
3704 '',
3705 'disabled features: @0@'.format(', '.join(missing)),
3706 '']
3707 message('\n '.join(status))
3708
3709 if rootprefixdir != rootprefix_default
3710 warning('\n' +
3711 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3712 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3713 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3714 endif