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