]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
meson: add syscall-names-update target
[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 ############################################################
1627
1628 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1629 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1630 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1631 make_directive_index_py = find_program('tools/make-directive-index.py')
1632 make_man_index_py = find_program('tools/make-man-index.py')
1633 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1634 xml_helper_py = find_program('tools/xml_helper.py')
1635
1636 ############################################################
1637
1638 # binaries that have --help and are intended for use by humans,
1639 # usually, but not always, installed in /bin.
1640 public_programs = []
1641
1642 subdir('src/libudev')
1643 subdir('src/shared')
1644 subdir('src/core')
1645 subdir('src/shutdown')
1646 subdir('src/udev')
1647 subdir('src/network')
1648
1649 subdir('src/analyze')
1650 subdir('src/journal-remote')
1651 subdir('src/coredump')
1652 subdir('src/pstore')
1653 subdir('src/hostname')
1654 subdir('src/import')
1655 subdir('src/partition')
1656 subdir('src/kernel-install')
1657 subdir('src/locale')
1658 subdir('src/machine')
1659 subdir('src/portable')
1660 subdir('src/userdb')
1661 subdir('src/home')
1662 subdir('src/nspawn')
1663 subdir('src/resolve')
1664 subdir('src/timedate')
1665 subdir('src/timesync')
1666 subdir('src/tmpfiles')
1667 subdir('src/vconsole')
1668 subdir('src/boot/efi')
1669
1670 subdir('src/test')
1671 subdir('src/fuzz')
1672 subdir('rules.d')
1673 subdir('test')
1674
1675 ############################################################
1676
1677 # only static linking apart from libdl, to make sure that the
1678 # module is linked to all libraries that it uses.
1679 test_dlopen = executable(
1680 'test-dlopen',
1681 test_dlopen_c,
1682 disable_mempool_c,
1683 include_directories : includes,
1684 link_with : [libbasic],
1685 dependencies : [libdl],
1686 build_by_default : want_tests != 'false')
1687
1688 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1689 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1690 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1691 ['resolve', 'ENABLE_NSS_RESOLVE']]
1692
1693 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1694 if condition
1695 module = tuple[0]
1696
1697 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1698 version_script_arg = join_paths(project_source_root, sym)
1699
1700 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1701 if tuple.length() > 2
1702 sources += tuple[2].split()
1703 endif
1704
1705 nss = shared_library(
1706 'nss_' + module,
1707 sources,
1708 disable_mempool_c,
1709 version : '2',
1710 include_directories : includes,
1711 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1712 link_args : ['-Wl,-z,nodelete',
1713 '-shared',
1714 '-Wl,--version-script=' + version_script_arg],
1715 link_with : [libsystemd_static,
1716 libshared_static,
1717 libbasic],
1718 dependencies : [threads,
1719 librt],
1720 link_depends : sym,
1721 install : true,
1722 install_dir : rootlibdir)
1723
1724 # We cannot use shared_module because it does not support version suffix.
1725 # Unfortunately shared_library insists on creating the symlink…
1726 meson.add_install_script('sh', '-c',
1727 'rm $DESTDIR@0@/libnss_@1@.so'
1728 .format(rootlibdir, module))
1729
1730 if want_tests != 'false'
1731 test('dlopen-nss_' + module,
1732 test_dlopen,
1733 # path to dlopen must include a slash
1734 args : nss.full_path())
1735 endif
1736 endif
1737 endforeach
1738
1739 ############################################################
1740
1741 executable(
1742 'systemd',
1743 systemd_sources,
1744 include_directories : includes,
1745 link_with : [libcore,
1746 libshared],
1747 dependencies : [versiondep,
1748 threads,
1749 librt,
1750 libseccomp,
1751 libselinux,
1752 libmount,
1753 libblkid],
1754 install_rpath : rootlibexecdir,
1755 install : true,
1756 install_dir : rootlibexecdir)
1757
1758 meson.add_install_script(meson_make_symlink,
1759 join_paths(rootlibexecdir, 'systemd'),
1760 join_paths(rootsbindir, 'init'))
1761
1762 public_programs += executable(
1763 'systemd-analyze',
1764 systemd_analyze_sources,
1765 include_directories : includes,
1766 link_with : [libcore,
1767 libshared],
1768 dependencies : [versiondep,
1769 threads,
1770 librt,
1771 libseccomp,
1772 libselinux,
1773 libmount,
1774 libblkid],
1775 install_rpath : rootlibexecdir,
1776 install : get_option('analyze'))
1777
1778 executable(
1779 'systemd-journald',
1780 systemd_journald_sources,
1781 include_directories : includes,
1782 link_with : [libjournal_core,
1783 libshared],
1784 dependencies : [threads,
1785 libxz,
1786 liblz4,
1787 libselinux,
1788 libzstd],
1789 install_rpath : rootlibexecdir,
1790 install : true,
1791 install_dir : rootlibexecdir)
1792
1793 public_programs += executable(
1794 'systemd-cat',
1795 systemd_cat_sources,
1796 include_directories : includes,
1797 link_with : [libjournal_core,
1798 libshared],
1799 dependencies : [threads],
1800 install_rpath : rootlibexecdir,
1801 install : true)
1802
1803 public_programs += executable(
1804 'journalctl',
1805 journalctl_sources,
1806 include_directories : includes,
1807 link_with : [libshared],
1808 dependencies : [threads,
1809 libdl,
1810 libxz,
1811 liblz4,
1812 libzstd,
1813 libdl],
1814 install_rpath : rootlibexecdir,
1815 install : true,
1816 install_dir : rootbindir)
1817
1818 executable(
1819 'systemd-getty-generator',
1820 'src/getty-generator/getty-generator.c',
1821 include_directories : includes,
1822 link_with : [libshared],
1823 install_rpath : rootlibexecdir,
1824 install : true,
1825 install_dir : systemgeneratordir)
1826
1827 executable(
1828 'systemd-debug-generator',
1829 'src/debug-generator/debug-generator.c',
1830 include_directories : includes,
1831 link_with : [libshared],
1832 install_rpath : rootlibexecdir,
1833 install : true,
1834 install_dir : systemgeneratordir)
1835
1836 executable(
1837 'systemd-run-generator',
1838 'src/run-generator/run-generator.c',
1839 include_directories : includes,
1840 link_with : [libshared],
1841 install_rpath : rootlibexecdir,
1842 install : true,
1843 install_dir : systemgeneratordir)
1844
1845 executable(
1846 'systemd-fstab-generator',
1847 'src/fstab-generator/fstab-generator.c',
1848 include_directories : includes,
1849 link_with : [libcore_shared,
1850 libshared],
1851 install_rpath : rootlibexecdir,
1852 install : true,
1853 install_dir : systemgeneratordir)
1854
1855 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1856 executable(
1857 '30-systemd-environment-d-generator',
1858 'src/environment-d-generator/environment-d-generator.c',
1859 include_directories : includes,
1860 link_with : [libshared],
1861 install_rpath : rootlibexecdir,
1862 install : true,
1863 install_dir : userenvgeneratordir)
1864
1865 meson.add_install_script(meson_make_symlink,
1866 join_paths(sysconfdir, 'environment'),
1867 join_paths(environmentdir, '99-environment.conf'))
1868 endif
1869
1870 if conf.get('ENABLE_HIBERNATE') == 1
1871 executable(
1872 'systemd-hibernate-resume-generator',
1873 'src/hibernate-resume/hibernate-resume-generator.c',
1874 include_directories : includes,
1875 link_with : [libshared],
1876 install_rpath : rootlibexecdir,
1877 install : true,
1878 install_dir : systemgeneratordir)
1879
1880 executable(
1881 'systemd-hibernate-resume',
1882 'src/hibernate-resume/hibernate-resume.c',
1883 include_directories : includes,
1884 link_with : [libshared],
1885 install_rpath : rootlibexecdir,
1886 install : true,
1887 install_dir : rootlibexecdir)
1888 endif
1889
1890 if conf.get('HAVE_BLKID') == 1
1891 executable(
1892 'systemd-gpt-auto-generator',
1893 'src/gpt-auto-generator/gpt-auto-generator.c',
1894 'src/shared/blkid-util.h',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 dependencies : libblkid,
1898 install_rpath : rootlibexecdir,
1899 install : true,
1900 install_dir : systemgeneratordir)
1901
1902 public_programs += executable(
1903 'systemd-dissect',
1904 'src/dissect/dissect.c',
1905 include_directories : includes,
1906 link_with : [libshared],
1907 install_rpath : rootlibexecdir,
1908 install : true)
1909 endif
1910
1911 if conf.get('ENABLE_RESOLVE') == 1
1912 executable(
1913 'systemd-resolved',
1914 systemd_resolved_sources,
1915 include_directories : includes,
1916 link_with : [libshared,
1917 libbasic_gcrypt,
1918 libsystemd_resolve_core],
1919 dependencies : systemd_resolved_dependencies,
1920 install_rpath : rootlibexecdir,
1921 install : true,
1922 install_dir : rootlibexecdir)
1923
1924 public_programs += executable(
1925 'resolvectl',
1926 resolvectl_sources,
1927 include_directories : includes,
1928 link_with : [libshared,
1929 libbasic_gcrypt,
1930 libsystemd_resolve_core],
1931 dependencies : [threads,
1932 libgpg_error,
1933 libm,
1934 libidn],
1935 install_rpath : rootlibexecdir,
1936 install : true)
1937
1938 meson.add_install_script(meson_make_symlink,
1939 join_paths(bindir, 'resolvectl'),
1940 join_paths(rootsbindir, 'resolvconf'))
1941
1942 meson.add_install_script(meson_make_symlink,
1943 join_paths(bindir, 'resolvectl'),
1944 join_paths(bindir, 'systemd-resolve'))
1945 endif
1946
1947 if conf.get('ENABLE_LOGIND') == 1
1948 executable(
1949 'systemd-logind',
1950 systemd_logind_sources,
1951 include_directories : includes,
1952 link_with : [liblogind_core,
1953 libshared],
1954 dependencies : [threads,
1955 libacl],
1956 install_rpath : rootlibexecdir,
1957 install : true,
1958 install_dir : rootlibexecdir)
1959
1960 public_programs += executable(
1961 'loginctl',
1962 loginctl_sources,
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [threads,
1966 liblz4,
1967 libxz,
1968 libzstd],
1969 install_rpath : rootlibexecdir,
1970 install : true,
1971 install_dir : rootbindir)
1972
1973 public_programs += executable(
1974 'systemd-inhibit',
1975 'src/login/inhibit.c',
1976 include_directories : includes,
1977 link_with : [libshared],
1978 install_rpath : rootlibexecdir,
1979 install : true,
1980 install_dir : rootbindir)
1981
1982 if conf.get('HAVE_PAM') == 1
1983 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1984 pam_systemd = shared_library(
1985 'pam_systemd',
1986 pam_systemd_c,
1987 name_prefix : '',
1988 include_directories : includes,
1989 link_args : ['-shared',
1990 '-Wl,--version-script=' + version_script_arg],
1991 link_with : [libsystemd_static,
1992 libshared_static],
1993 dependencies : [threads,
1994 libpam,
1995 libpam_misc],
1996 link_depends : pam_systemd_sym,
1997 install : true,
1998 install_dir : pamlibdir)
1999
2000 if want_tests != 'false'
2001 test('dlopen-pam_systemd',
2002 test_dlopen,
2003 # path to dlopen must include a slash
2004 args : pam_systemd.full_path())
2005 endif
2006 endif
2007
2008 executable(
2009 'systemd-user-runtime-dir',
2010 user_runtime_dir_sources,
2011 include_directories : includes,
2012 link_with : [libshared],
2013 install_rpath : rootlibexecdir,
2014 install : true,
2015 install_dir : rootlibexecdir)
2016 endif
2017
2018 if conf.get('HAVE_PAM') == 1
2019 executable(
2020 'systemd-user-sessions',
2021 'src/user-sessions/user-sessions.c',
2022 include_directories : includes,
2023 link_with : [libshared],
2024 install_rpath : rootlibexecdir,
2025 install : true,
2026 install_dir : rootlibexecdir)
2027 endif
2028
2029 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2030 public_programs += executable(
2031 'bootctl',
2032 'src/boot/bootctl.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 dependencies : [libblkid],
2036 install_rpath : rootlibexecdir,
2037 install : true)
2038
2039 public_programs += executable(
2040 'systemd-bless-boot',
2041 'src/boot/bless-boot.c',
2042 include_directories : includes,
2043 link_with : [libshared],
2044 dependencies : [libblkid],
2045 install_rpath : rootlibexecdir,
2046 install : true,
2047 install_dir : rootlibexecdir)
2048
2049 executable(
2050 'systemd-bless-boot-generator',
2051 'src/boot/bless-boot-generator.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 install_rpath : rootlibexecdir,
2055 install : true,
2056 install_dir : systemgeneratordir)
2057 endif
2058
2059 executable(
2060 'systemd-boot-check-no-failures',
2061 'src/boot/boot-check-no-failures.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 dependencies : [libblkid],
2065 install_rpath : rootlibexecdir,
2066 install : true,
2067 install_dir : rootlibexecdir)
2068
2069 public_programs += executable(
2070 'systemd-socket-activate',
2071 'src/activate/activate.c',
2072 include_directories : includes,
2073 link_with : [libshared],
2074 dependencies : [threads],
2075 install_rpath : rootlibexecdir,
2076 install : true)
2077
2078 if get_option('link-systemctl-shared')
2079 systemctl_link_with = [libshared]
2080 else
2081 systemctl_link_with = [libsystemd_static,
2082 libshared_static,
2083 libjournal_client,
2084 libbasic_gcrypt]
2085 endif
2086
2087 public_programs += executable(
2088 'systemctl',
2089 'src/systemctl/systemctl.c',
2090 'src/systemctl/sysv-compat.h',
2091 'src/systemctl/sysv-compat.c',
2092 include_directories : includes,
2093 link_with : systemctl_link_with,
2094 dependencies : [threads,
2095 libcap,
2096 libselinux,
2097 libxz,
2098 liblz4,
2099 libzstd],
2100 install_rpath : rootlibexecdir,
2101 install : true,
2102 install_dir : rootbindir)
2103
2104 if conf.get('ENABLE_PORTABLED') == 1
2105 executable(
2106 'systemd-portabled',
2107 systemd_portabled_sources,
2108 include_directories : includes,
2109 link_with : [libshared],
2110 dependencies : [threads],
2111 install_rpath : rootlibexecdir,
2112 install : true,
2113 install_dir : rootlibexecdir)
2114
2115 public_programs += executable(
2116 'portablectl',
2117 'src/portable/portablectl.c',
2118 include_directories : includes,
2119 link_with : [libshared],
2120 dependencies : [threads],
2121 install_rpath : rootlibexecdir,
2122 install : true,
2123 install_dir : rootbindir)
2124 endif
2125
2126 if conf.get('ENABLE_USERDB') == 1
2127 executable(
2128 'systemd-userwork',
2129 systemd_userwork_sources,
2130 include_directories : includes,
2131 link_with : [libshared],
2132 dependencies : [threads],
2133 install_rpath : rootlibexecdir,
2134 install : true,
2135 install_dir : rootlibexecdir)
2136
2137 executable(
2138 'systemd-userdbd',
2139 systemd_userdbd_sources,
2140 include_directories : includes,
2141 link_with : [libshared],
2142 dependencies : [threads],
2143 install_rpath : rootlibexecdir,
2144 install : true,
2145 install_dir : rootlibexecdir)
2146
2147 public_programs += executable(
2148 'userdbctl',
2149 userdbctl_sources,
2150 include_directories : includes,
2151 link_with : [libshared],
2152 dependencies : [threads],
2153 install_rpath : rootlibexecdir,
2154 install : true,
2155 install_dir : rootbindir)
2156 endif
2157
2158 if conf.get('ENABLE_HOMED') == 1
2159 executable(
2160 'systemd-homework',
2161 systemd_homework_sources,
2162 include_directories : includes,
2163 link_with : [libshared],
2164 dependencies : [threads,
2165 libcryptsetup,
2166 libblkid,
2167 libcrypt,
2168 libopenssl,
2169 libfdisk,
2170 libp11kit,
2171 libfido2],
2172 install_rpath : rootlibexecdir,
2173 install : true,
2174 install_dir : rootlibexecdir)
2175
2176 executable(
2177 'systemd-homed',
2178 systemd_homed_sources,
2179 include_directories : includes,
2180 link_with : [libshared],
2181 dependencies : [threads,
2182 libcrypt,
2183 libopenssl,
2184 libpwquality],
2185 install_rpath : rootlibexecdir,
2186 install : true,
2187 install_dir : rootlibexecdir)
2188
2189 public_programs += executable(
2190 'homectl',
2191 homectl_sources,
2192 include_directories : includes,
2193 link_with : [libshared],
2194 dependencies : [threads,
2195 libcrypt,
2196 libopenssl,
2197 libp11kit,
2198 libfido2,
2199 libpwquality],
2200 install_rpath : rootlibexecdir,
2201 install : true,
2202 install_dir : rootbindir)
2203
2204 if conf.get('HAVE_PAM') == 1
2205 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2206 pam_systemd = shared_library(
2207 'pam_systemd_home',
2208 pam_systemd_home_c,
2209 name_prefix : '',
2210 include_directories : includes,
2211 link_args : ['-shared',
2212 '-Wl,--version-script=' + version_script_arg],
2213 link_with : [libsystemd_static,
2214 libshared_static],
2215 dependencies : [threads,
2216 libpam,
2217 libpam_misc,
2218 libcrypt],
2219 link_depends : pam_systemd_home_sym,
2220 install : true,
2221 install_dir : pamlibdir)
2222 endif
2223 endif
2224
2225 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2226 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2227 meson.add_install_script(meson_make_symlink,
2228 join_paths(rootbindir, 'systemctl'),
2229 join_paths(rootsbindir, alias))
2230 endforeach
2231
2232 meson.add_install_script(meson_make_symlink,
2233 join_paths(rootbindir, 'udevadm'),
2234 join_paths(rootlibexecdir, 'systemd-udevd'))
2235
2236 if conf.get('ENABLE_BACKLIGHT') == 1
2237 executable(
2238 'systemd-backlight',
2239 'src/backlight/backlight.c',
2240 include_directories : includes,
2241 link_with : [libshared],
2242 install_rpath : rootlibexecdir,
2243 install : true,
2244 install_dir : rootlibexecdir)
2245 endif
2246
2247 if conf.get('ENABLE_RFKILL') == 1
2248 executable(
2249 'systemd-rfkill',
2250 'src/rfkill/rfkill.c',
2251 include_directories : includes,
2252 link_with : [libshared],
2253 install_rpath : rootlibexecdir,
2254 install : true,
2255 install_dir : rootlibexecdir)
2256 endif
2257
2258 executable(
2259 'systemd-system-update-generator',
2260 'src/system-update-generator/system-update-generator.c',
2261 include_directories : includes,
2262 link_with : [libshared],
2263 install_rpath : rootlibexecdir,
2264 install : true,
2265 install_dir : systemgeneratordir)
2266
2267 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2268 systemd_cryptsetup_sources = files('''
2269 src/cryptsetup/cryptsetup-pkcs11.h
2270 src/cryptsetup/cryptsetup-util.c
2271 src/cryptsetup/cryptsetup-util.h
2272 src/cryptsetup/cryptsetup.c
2273 '''.split())
2274
2275 if conf.get('HAVE_P11KIT') == 1
2276 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2277 endif
2278
2279 executable(
2280 'systemd-cryptsetup',
2281 systemd_cryptsetup_sources,
2282 include_directories : includes,
2283 link_with : [libshared],
2284 dependencies : [libcryptsetup,
2285 libp11kit],
2286 install_rpath : rootlibexecdir,
2287 install : true,
2288 install_dir : rootlibexecdir)
2289
2290 executable(
2291 'systemd-cryptsetup-generator',
2292 'src/cryptsetup/cryptsetup-generator.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 dependencies : [libcryptsetup],
2296 install_rpath : rootlibexecdir,
2297 install : true,
2298 install_dir : systemgeneratordir)
2299
2300 executable(
2301 'systemd-veritysetup',
2302 'src/veritysetup/veritysetup.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 dependencies : [libcryptsetup],
2306 install_rpath : rootlibexecdir,
2307 install : true,
2308 install_dir : rootlibexecdir)
2309
2310 executable(
2311 'systemd-veritysetup-generator',
2312 'src/veritysetup/veritysetup-generator.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 dependencies : [libcryptsetup],
2316 install_rpath : rootlibexecdir,
2317 install : true,
2318 install_dir : systemgeneratordir)
2319 endif
2320
2321 if conf.get('HAVE_SYSV_COMPAT') == 1
2322 executable(
2323 'systemd-sysv-generator',
2324 'src/sysv-generator/sysv-generator.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 install_rpath : rootlibexecdir,
2328 install : true,
2329 install_dir : systemgeneratordir)
2330
2331 executable(
2332 'systemd-rc-local-generator',
2333 'src/rc-local-generator/rc-local-generator.c',
2334 include_directories : includes,
2335 link_with : [libshared],
2336 install_rpath : rootlibexecdir,
2337 install : true,
2338 install_dir : systemgeneratordir)
2339 endif
2340
2341 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2342 executable(
2343 'systemd-xdg-autostart-generator',
2344 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2345 'src/xdg-autostart-generator/xdg-autostart-service.c',
2346 include_directories : includes,
2347 link_with : [libshared],
2348 install_rpath : rootlibexecdir,
2349 install : true,
2350 install_dir : usergeneratordir)
2351
2352 executable(
2353 'systemd-xdg-autostart-condition',
2354 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2355 include_directories : includes,
2356 link_with : [libshared],
2357 install_rpath : rootlibexecdir,
2358 install : true,
2359 install_dir : rootlibexecdir)
2360 endif
2361
2362 if conf.get('ENABLE_HOSTNAMED') == 1
2363 executable(
2364 'systemd-hostnamed',
2365 'src/hostname/hostnamed.c',
2366 include_directories : includes,
2367 link_with : [libshared],
2368 install_rpath : rootlibexecdir,
2369 install : true,
2370 install_dir : rootlibexecdir)
2371
2372 public_programs += executable(
2373 'hostnamectl',
2374 'src/hostname/hostnamectl.c',
2375 include_directories : includes,
2376 link_with : [libshared],
2377 install_rpath : rootlibexecdir,
2378 install : true)
2379 endif
2380
2381 if conf.get('ENABLE_LOCALED') == 1
2382 if conf.get('HAVE_XKBCOMMON') == 1
2383 # logind will load libxkbcommon.so dynamically on its own
2384 deps = [libdl]
2385 else
2386 deps = []
2387 endif
2388
2389 executable(
2390 'systemd-localed',
2391 systemd_localed_sources,
2392 include_directories : includes,
2393 link_with : [libshared],
2394 dependencies : deps,
2395 install_rpath : rootlibexecdir,
2396 install : true,
2397 install_dir : rootlibexecdir)
2398
2399 public_programs += executable(
2400 'localectl',
2401 localectl_sources,
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2405 install : true)
2406 endif
2407
2408 if conf.get('ENABLE_TIMEDATED') == 1
2409 executable(
2410 'systemd-timedated',
2411 'src/timedate/timedated.c',
2412 include_directories : includes,
2413 link_with : [libshared],
2414 install_rpath : rootlibexecdir,
2415 install : true,
2416 install_dir : rootlibexecdir)
2417 endif
2418
2419 if conf.get('ENABLE_TIMEDATECTL') == 1
2420 public_programs += executable(
2421 'timedatectl',
2422 'src/timedate/timedatectl.c',
2423 include_directories : includes,
2424 install_rpath : rootlibexecdir,
2425 link_with : [libshared],
2426 dependencies : [libm],
2427 install : true)
2428 endif
2429
2430 if conf.get('ENABLE_TIMESYNCD') == 1
2431 if get_option('link-timesyncd-shared')
2432 timesyncd_link_with = [libshared]
2433 else
2434 timesyncd_link_with = [libsystemd_static,
2435 libshared_static,
2436 libjournal_client,
2437 libbasic_gcrypt]
2438 endif
2439
2440 executable(
2441 'systemd-timesyncd',
2442 systemd_timesyncd_sources,
2443 include_directories : includes,
2444 link_with : [timesyncd_link_with],
2445 dependencies : [threads,
2446 libm],
2447 install_rpath : rootlibexecdir,
2448 install : true,
2449 install_dir : rootlibexecdir)
2450
2451 executable(
2452 'systemd-time-wait-sync',
2453 'src/time-wait-sync/time-wait-sync.c',
2454 include_directories : includes,
2455 link_with : [timesyncd_link_with],
2456 install_rpath : rootlibexecdir,
2457 install : true,
2458 install_dir : rootlibexecdir)
2459 endif
2460
2461 if conf.get('ENABLE_MACHINED') == 1
2462 executable(
2463 'systemd-machined',
2464 systemd_machined_sources,
2465 include_directories : includes,
2466 link_with : [libmachine_core,
2467 libshared],
2468 install_rpath : rootlibexecdir,
2469 install : true,
2470 install_dir : rootlibexecdir)
2471
2472 public_programs += executable(
2473 'machinectl',
2474 'src/machine/machinectl.c',
2475 include_directories : includes,
2476 link_with : [libshared],
2477 dependencies : [threads,
2478 libxz,
2479 liblz4,
2480 libzstd],
2481 install_rpath : rootlibexecdir,
2482 install : true,
2483 install_dir : rootbindir)
2484 endif
2485
2486 if conf.get('ENABLE_IMPORTD') == 1
2487 executable(
2488 'systemd-importd',
2489 systemd_importd_sources,
2490 include_directories : includes,
2491 link_with : [libshared],
2492 dependencies : [threads],
2493 install_rpath : rootlibexecdir,
2494 install : true,
2495 install_dir : rootlibexecdir)
2496
2497 systemd_pull = executable(
2498 'systemd-pull',
2499 systemd_pull_sources,
2500 include_directories : includes,
2501 link_with : [libshared],
2502 dependencies : [versiondep,
2503 libcurl,
2504 libz,
2505 libbzip2,
2506 libxz,
2507 libgcrypt],
2508 install_rpath : rootlibexecdir,
2509 install : true,
2510 install_dir : rootlibexecdir)
2511
2512 systemd_import = executable(
2513 'systemd-import',
2514 systemd_import_sources,
2515 include_directories : includes,
2516 link_with : [libshared],
2517 dependencies : [libcurl,
2518 libz,
2519 libbzip2,
2520 libxz],
2521 install_rpath : rootlibexecdir,
2522 install : true,
2523 install_dir : rootlibexecdir)
2524
2525 systemd_import_fs = executable(
2526 'systemd-import-fs',
2527 systemd_import_fs_sources,
2528 include_directories : includes,
2529 link_with : [libshared],
2530 install_rpath : rootlibexecdir,
2531 install : true,
2532 install_dir : rootlibexecdir)
2533
2534 systemd_export = executable(
2535 'systemd-export',
2536 systemd_export_sources,
2537 include_directories : includes,
2538 link_with : [libshared],
2539 dependencies : [libcurl,
2540 libz,
2541 libbzip2,
2542 libxz],
2543 install_rpath : rootlibexecdir,
2544 install : true,
2545 install_dir : rootlibexecdir)
2546
2547 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2548 endif
2549
2550 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2551 public_programs += executable(
2552 'systemd-journal-upload',
2553 systemd_journal_upload_sources,
2554 include_directories : includes,
2555 link_with : [libshared],
2556 dependencies : [versiondep,
2557 threads,
2558 libcurl,
2559 libgnutls,
2560 libxz,
2561 liblz4,
2562 libzstd],
2563 install_rpath : rootlibexecdir,
2564 install : true,
2565 install_dir : rootlibexecdir)
2566 endif
2567
2568 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2569 public_programs += executable(
2570 'systemd-journal-remote',
2571 systemd_journal_remote_sources,
2572 include_directories : includes,
2573 link_with : [libshared,
2574 libsystemd_journal_remote],
2575 dependencies : [threads,
2576 libmicrohttpd,
2577 libgnutls,
2578 libxz,
2579 liblz4,
2580 libzstd],
2581 install_rpath : rootlibexecdir,
2582 install : true,
2583 install_dir : rootlibexecdir)
2584
2585 public_programs += executable(
2586 'systemd-journal-gatewayd',
2587 systemd_journal_gatewayd_sources,
2588 include_directories : includes,
2589 link_with : [libshared],
2590 dependencies : [threads,
2591 libmicrohttpd,
2592 libgnutls,
2593 libxz,
2594 liblz4,
2595 libzstd],
2596 install_rpath : rootlibexecdir,
2597 install : true,
2598 install_dir : rootlibexecdir)
2599 endif
2600
2601 if conf.get('ENABLE_COREDUMP') == 1
2602 executable(
2603 'systemd-coredump',
2604 systemd_coredump_sources,
2605 include_directories : includes,
2606 link_with : [libshared],
2607 dependencies : [threads,
2608 libacl,
2609 libdw,
2610 libxz,
2611 liblz4,
2612 libzstd],
2613 install_rpath : rootlibexecdir,
2614 install : true,
2615 install_dir : rootlibexecdir)
2616
2617 public_programs += executable(
2618 'coredumpctl',
2619 coredumpctl_sources,
2620 include_directories : includes,
2621 link_with : [libshared],
2622 dependencies : [threads,
2623 libxz,
2624 liblz4,
2625 libzstd],
2626 install_rpath : rootlibexecdir,
2627 install : true)
2628 endif
2629
2630 if conf.get('ENABLE_PSTORE') == 1
2631 executable(
2632 'systemd-pstore',
2633 systemd_pstore_sources,
2634 include_directories : includes,
2635 link_with : [libshared],
2636 dependencies : [threads,
2637 libacl,
2638 libdw,
2639 libxz,
2640 liblz4,
2641 libzstd],
2642 install_rpath : rootlibexecdir,
2643 install : true,
2644 install_dir : rootlibexecdir)
2645 endif
2646
2647 if conf.get('ENABLE_BINFMT') == 1
2648 public_programs += executable(
2649 'systemd-binfmt',
2650 'src/binfmt/binfmt.c',
2651 include_directories : includes,
2652 link_with : [libshared],
2653 install_rpath : rootlibexecdir,
2654 install : true,
2655 install_dir : rootlibexecdir)
2656
2657 meson.add_install_script('sh', '-c',
2658 mkdir_p.format(binfmtdir))
2659 meson.add_install_script('sh', '-c',
2660 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2661 endif
2662
2663 if conf.get('ENABLE_REPART') == 1
2664 exe = executable(
2665 'systemd-repart',
2666 systemd_repart_sources,
2667 include_directories : includes,
2668 link_with : [libshared],
2669 dependencies : [threads,
2670 libcryptsetup,
2671 libblkid,
2672 libfdisk,
2673 libopenssl],
2674 install_rpath : rootlibexecdir,
2675 install : true,
2676 install_dir : rootbindir)
2677 public_programs += exe
2678
2679 if want_tests != 'false'
2680 test('test-repart',
2681 test_repart_sh,
2682 args : exe.full_path())
2683 endif
2684 endif
2685
2686 if conf.get('ENABLE_VCONSOLE') == 1
2687 executable(
2688 'systemd-vconsole-setup',
2689 'src/vconsole/vconsole-setup.c',
2690 include_directories : includes,
2691 link_with : [libshared],
2692 install_rpath : rootlibexecdir,
2693 install : true,
2694 install_dir : rootlibexecdir)
2695 endif
2696
2697 if conf.get('ENABLE_RANDOMSEED') == 1
2698 executable(
2699 'systemd-random-seed',
2700 'src/random-seed/random-seed.c',
2701 include_directories : includes,
2702 link_with : [libshared],
2703 install_rpath : rootlibexecdir,
2704 install : true,
2705 install_dir : rootlibexecdir)
2706 endif
2707
2708 if conf.get('ENABLE_FIRSTBOOT') == 1
2709 executable(
2710 'systemd-firstboot',
2711 'src/firstboot/firstboot.c',
2712 include_directories : includes,
2713 link_with : [libshared],
2714 dependencies : [libcrypt],
2715 install_rpath : rootlibexecdir,
2716 install : true,
2717 install_dir : rootbindir)
2718 endif
2719
2720 executable(
2721 'systemd-remount-fs',
2722 'src/remount-fs/remount-fs.c',
2723 include_directories : includes,
2724 link_with : [libcore_shared,
2725 libshared],
2726 install_rpath : rootlibexecdir,
2727 install : true,
2728 install_dir : rootlibexecdir)
2729
2730 executable(
2731 'systemd-machine-id-setup',
2732 'src/machine-id-setup/machine-id-setup-main.c',
2733 include_directories : includes,
2734 link_with : [libcore_shared,
2735 libshared],
2736 install_rpath : rootlibexecdir,
2737 install : true,
2738 install_dir : rootbindir)
2739
2740 executable(
2741 'systemd-fsck',
2742 'src/fsck/fsck.c',
2743 include_directories : includes,
2744 link_with : [libshared],
2745 install_rpath : rootlibexecdir,
2746 install : true,
2747 install_dir : rootlibexecdir)
2748
2749 executable('systemd-growfs',
2750 'src/partition/growfs.c',
2751 include_directories : includes,
2752 link_with : [libshared],
2753 dependencies : [libcryptsetup],
2754 install_rpath : rootlibexecdir,
2755 install : true,
2756 install_dir : rootlibexecdir)
2757
2758 executable(
2759 'systemd-makefs',
2760 'src/partition/makefs.c',
2761 include_directories : includes,
2762 link_with : [libshared],
2763 install_rpath : rootlibexecdir,
2764 install : true,
2765 install_dir : rootlibexecdir)
2766
2767 executable(
2768 'systemd-sleep',
2769 'src/sleep/sleep.c',
2770 include_directories : includes,
2771 link_with : [libshared],
2772 install_rpath : rootlibexecdir,
2773 install : true,
2774 install_dir : rootlibexecdir)
2775
2776 install_data('src/sleep/sleep.conf',
2777 install_dir : pkgsysconfdir)
2778
2779 public_programs += executable(
2780 'systemd-sysctl',
2781 'src/sysctl/sysctl.c',
2782 include_directories : includes,
2783 link_with : [libshared],
2784 install_rpath : rootlibexecdir,
2785 install : true,
2786 install_dir : rootlibexecdir)
2787
2788 executable(
2789 'systemd-ac-power',
2790 'src/ac-power/ac-power.c',
2791 include_directories : includes,
2792 link_with : [libshared],
2793 install_rpath : rootlibexecdir,
2794 install : true,
2795 install_dir : rootlibexecdir)
2796
2797 public_programs += executable(
2798 'systemd-detect-virt',
2799 'src/detect-virt/detect-virt.c',
2800 include_directories : includes,
2801 link_with : [libshared],
2802 install_rpath : rootlibexecdir,
2803 install : true)
2804
2805 public_programs += executable(
2806 'systemd-delta',
2807 'src/delta/delta.c',
2808 include_directories : includes,
2809 link_with : [libshared],
2810 install_rpath : rootlibexecdir,
2811 install : true)
2812
2813 public_programs += executable(
2814 'systemd-escape',
2815 'src/escape/escape.c',
2816 include_directories : includes,
2817 link_with : [libshared],
2818 install_rpath : rootlibexecdir,
2819 install : true,
2820 install_dir : rootbindir)
2821
2822 public_programs += executable(
2823 'systemd-notify',
2824 'src/notify/notify.c',
2825 include_directories : includes,
2826 link_with : [libshared],
2827 install_rpath : rootlibexecdir,
2828 install : true,
2829 install_dir : rootbindir)
2830
2831 executable(
2832 'systemd-volatile-root',
2833 'src/volatile-root/volatile-root.c',
2834 include_directories : includes,
2835 link_with : [libshared],
2836 install_rpath : rootlibexecdir,
2837 install : conf.get('ENABLE_INITRD') == 1,
2838 install_dir : rootlibexecdir)
2839
2840 executable(
2841 'systemd-cgroups-agent',
2842 'src/cgroups-agent/cgroups-agent.c',
2843 include_directories : includes,
2844 link_with : [libshared],
2845 install_rpath : rootlibexecdir,
2846 install : true,
2847 install_dir : rootlibexecdir)
2848
2849 public_programs += executable(
2850 'systemd-id128',
2851 'src/id128/id128.c',
2852 include_directories : includes,
2853 link_with : [libshared],
2854 install_rpath : rootlibexecdir,
2855 install : true)
2856
2857 public_programs += executable(
2858 'systemd-path',
2859 'src/path/path.c',
2860 include_directories : includes,
2861 link_with : [libshared],
2862 install_rpath : rootlibexecdir,
2863 install : true)
2864
2865 public_programs += executable(
2866 'systemd-ask-password',
2867 'src/ask-password/ask-password.c',
2868 include_directories : includes,
2869 link_with : [libshared],
2870 install_rpath : rootlibexecdir,
2871 install : true,
2872 install_dir : rootbindir)
2873
2874 executable(
2875 'systemd-reply-password',
2876 'src/reply-password/reply-password.c',
2877 include_directories : includes,
2878 link_with : [libshared],
2879 install_rpath : rootlibexecdir,
2880 install : true,
2881 install_dir : rootlibexecdir)
2882
2883 public_programs += executable(
2884 'systemd-tty-ask-password-agent',
2885 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2886 include_directories : includes,
2887 link_with : [libshared],
2888 install_rpath : rootlibexecdir,
2889 install : true,
2890 install_dir : rootbindir)
2891
2892 public_programs += executable(
2893 'systemd-cgls',
2894 'src/cgls/cgls.c',
2895 include_directories : includes,
2896 link_with : [libshared],
2897 install_rpath : rootlibexecdir,
2898 install : true)
2899
2900 public_programs += executable(
2901 'systemd-cgtop',
2902 'src/cgtop/cgtop.c',
2903 include_directories : includes,
2904 link_with : [libshared],
2905 install_rpath : rootlibexecdir,
2906 install : true)
2907
2908 executable(
2909 'systemd-initctl',
2910 'src/initctl/initctl.c',
2911 include_directories : includes,
2912 link_with : [libshared],
2913 install_rpath : rootlibexecdir,
2914 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2915 install_dir : rootlibexecdir)
2916
2917 public_programs += executable(
2918 'systemd-mount',
2919 'src/mount/mount-tool.c',
2920 include_directories : includes,
2921 link_with : [libshared],
2922 dependencies: [libmount],
2923 install_rpath : rootlibexecdir,
2924 install : true)
2925
2926 meson.add_install_script(meson_make_symlink,
2927 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2928
2929 public_programs += executable(
2930 'systemd-run',
2931 'src/run/run.c',
2932 include_directories : includes,
2933 link_with : [libshared],
2934 install_rpath : rootlibexecdir,
2935 install : true)
2936
2937 public_programs += executable(
2938 'systemd-stdio-bridge',
2939 'src/stdio-bridge/stdio-bridge.c',
2940 include_directories : includes,
2941 link_with : [libshared],
2942 dependencies : [versiondep],
2943 install_rpath : rootlibexecdir,
2944 install : true)
2945
2946 public_programs += executable(
2947 'busctl',
2948 'src/busctl/busctl.c',
2949 'src/busctl/busctl-introspect.c',
2950 'src/busctl/busctl-introspect.h',
2951 include_directories : includes,
2952 link_with : [libshared],
2953 install_rpath : rootlibexecdir,
2954 install : true)
2955
2956 if conf.get('ENABLE_SYSUSERS') == 1
2957 public_programs += executable(
2958 'systemd-sysusers',
2959 'src/sysusers/sysusers.c',
2960 include_directories : includes,
2961 link_with : [libshared],
2962 install_rpath : rootlibexecdir,
2963 install : true,
2964 install_dir : rootbindir)
2965
2966 if have_standalone_binaries
2967 public_programs += executable(
2968 'systemd-sysusers.standalone',
2969 'src/sysusers/sysusers.c',
2970 include_directories : includes,
2971 link_with : [libshared_static,
2972 libbasic,
2973 libbasic_gcrypt,
2974 libsystemd_static,
2975 libjournal_client],
2976 install : true,
2977 install_dir : rootbindir)
2978 endif
2979 endif
2980
2981 if conf.get('ENABLE_TMPFILES') == 1
2982 exe = executable(
2983 'systemd-tmpfiles',
2984 systemd_tmpfiles_sources,
2985 include_directories : includes,
2986 link_with : [libshared],
2987 dependencies : [libacl],
2988 install_rpath : rootlibexecdir,
2989 install : true,
2990 install_dir : rootbindir)
2991 public_programs += exe
2992
2993 if want_tests != 'false'
2994 test('test-systemd-tmpfiles',
2995 test_systemd_tmpfiles_py,
2996 # https://github.com/mesonbuild/meson/issues/2681
2997 args : exe.full_path())
2998 endif
2999
3000 if have_standalone_binaries
3001 public_programs += executable(
3002 'systemd-tmpfiles.standalone',
3003 systemd_tmpfiles_sources,
3004 include_directories : includes,
3005 link_with : [libshared_static,
3006 libbasic,
3007 libbasic_gcrypt,
3008 libsystemd_static,
3009 libjournal_client],
3010 dependencies : [libacl],
3011 install : true,
3012 install_dir : rootbindir)
3013 endif
3014 endif
3015
3016 if conf.get('ENABLE_HWDB') == 1
3017 public_programs += executable(
3018 'systemd-hwdb',
3019 'src/hwdb/hwdb.c',
3020 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3021 include_directories : includes,
3022 link_with : [libudev_static],
3023 install_rpath : udev_rpath,
3024 install : true,
3025 install_dir : rootbindir)
3026 endif
3027
3028 if conf.get('ENABLE_QUOTACHECK') == 1
3029 executable(
3030 'systemd-quotacheck',
3031 'src/quotacheck/quotacheck.c',
3032 include_directories : includes,
3033 link_with : [libshared],
3034 install_rpath : rootlibexecdir,
3035 install : true,
3036 install_dir : rootlibexecdir)
3037 endif
3038
3039 public_programs += executable(
3040 'systemd-socket-proxyd',
3041 'src/socket-proxy/socket-proxyd.c',
3042 include_directories : includes,
3043 link_with : [libshared],
3044 dependencies : [threads],
3045 install_rpath : rootlibexecdir,
3046 install : true,
3047 install_dir : rootlibexecdir)
3048
3049 public_programs += executable(
3050 'udevadm',
3051 udevadm_sources,
3052 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3053 include_directories : includes,
3054 link_with : [libudev_core,
3055 libsystemd_network,
3056 libudev_static],
3057 dependencies : [versiondep,
3058 threads,
3059 libkmod,
3060 libidn,
3061 libacl,
3062 libblkid],
3063 install_rpath : udev_rpath,
3064 install : true,
3065 install_dir : rootbindir)
3066
3067 executable(
3068 'systemd-shutdown',
3069 systemd_shutdown_sources,
3070 include_directories : includes,
3071 link_with : [libcore_shared,
3072 libshared],
3073 dependencies : [libmount],
3074 install_rpath : rootlibexecdir,
3075 install : true,
3076 install_dir : rootlibexecdir)
3077
3078 executable(
3079 'systemd-update-done',
3080 'src/update-done/update-done.c',
3081 include_directories : includes,
3082 link_with : [libshared],
3083 install_rpath : rootlibexecdir,
3084 install : true,
3085 install_dir : rootlibexecdir)
3086
3087 executable(
3088 'systemd-update-utmp',
3089 'src/update-utmp/update-utmp.c',
3090 include_directories : includes,
3091 link_with : [libshared],
3092 dependencies : [libaudit],
3093 install_rpath : rootlibexecdir,
3094 install : (conf.get('ENABLE_UTMP') == 1),
3095 install_dir : rootlibexecdir)
3096
3097 if conf.get('HAVE_KMOD') == 1
3098 executable(
3099 'systemd-modules-load',
3100 'src/modules-load/modules-load.c',
3101 include_directories : includes,
3102 link_with : [libshared],
3103 dependencies : [libkmod],
3104 install_rpath : rootlibexecdir,
3105 install : true,
3106 install_dir : rootlibexecdir)
3107
3108 meson.add_install_script('sh', '-c',
3109 mkdir_p.format(modulesloaddir))
3110 meson.add_install_script('sh', '-c',
3111 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3112 endif
3113
3114 public_programs += executable(
3115 'systemd-nspawn',
3116 systemd_nspawn_sources,
3117 include_directories : includes,
3118 link_with : [libcore_shared,
3119 libnspawn_core,
3120 libshared],
3121 dependencies : [libblkid,
3122 libseccomp],
3123 install_rpath : rootlibexecdir,
3124 install : true)
3125
3126 if conf.get('ENABLE_NETWORKD') == 1
3127 executable(
3128 'systemd-networkd',
3129 systemd_networkd_sources,
3130 include_directories : network_include_dir,
3131 link_with : [libnetworkd_core,
3132 libsystemd_network,
3133 libudev_static,
3134 networkd_link_with],
3135 dependencies : [threads],
3136 install_rpath : rootlibexecdir,
3137 install : true,
3138 install_dir : rootlibexecdir)
3139
3140 executable(
3141 'systemd-networkd-wait-online',
3142 systemd_networkd_wait_online_sources,
3143 include_directories : includes,
3144 link_with : [libnetworkd_core,
3145 networkd_link_with],
3146 install_rpath : rootlibexecdir,
3147 install : true,
3148 install_dir : rootlibexecdir)
3149
3150 public_programs += executable(
3151 'networkctl',
3152 networkctl_sources,
3153 include_directories : includes,
3154 link_with : [libsystemd_network,
3155 networkd_link_with],
3156 install_rpath : rootlibexecdir,
3157 install : true,
3158 install_dir : rootbindir)
3159
3160 exe = executable(
3161 'systemd-network-generator',
3162 network_generator_sources,
3163 include_directories : includes,
3164 link_with : [networkd_link_with],
3165 install_rpath : rootlibexecdir,
3166 install : true,
3167 install_dir : rootlibexecdir)
3168
3169 if want_tests != 'false'
3170 test('test-network-generator-conversion',
3171 test_network_generator_conversion_sh,
3172 # https://github.com/mesonbuild/meson/issues/2681
3173 args : exe.full_path())
3174 endif
3175 endif
3176
3177 executable(
3178 'systemd-sulogin-shell',
3179 ['src/sulogin-shell/sulogin-shell.c'],
3180 include_directories : includes,
3181 link_with : [libshared],
3182 install_rpath : rootlibexecdir,
3183 install : true,
3184 install_dir : rootlibexecdir)
3185
3186 ############################################################
3187
3188 custom_target(
3189 'systemd-runtest.env',
3190 output : 'systemd-runtest.env',
3191 command : ['sh', '-c', '{ ' +
3192 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3193 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3194 '} >@OUTPUT@'],
3195 build_by_default : true)
3196
3197 foreach tuple : tests
3198 sources = tuple[0]
3199 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3200 dependencies = tuple[2]
3201 condition = tuple.length() >= 4 ? tuple[3] : ''
3202 type = tuple.length() >= 5 ? tuple[4] : ''
3203 defs = tuple.length() >= 6 ? tuple[5] : []
3204 incs = tuple.length() >= 7 ? tuple[6] : includes
3205 timeout = 30
3206
3207 name = sources[0].split('/')[-1].split('.')[0]
3208 if type.startswith('timeout=')
3209 timeout = type.split('=')[1].to_int()
3210 type = ''
3211 endif
3212
3213 if condition == '' or conf.get(condition) == 1
3214 exe = executable(
3215 name,
3216 sources,
3217 include_directories : incs,
3218 link_with : link_with,
3219 dependencies : [versiondep,
3220 dependencies],
3221 c_args : defs,
3222 build_by_default : want_tests != 'false',
3223 install_rpath : rootlibexecdir,
3224 install : install_tests,
3225 install_dir : join_paths(testsdir, type))
3226
3227 if type == 'manual'
3228 message('@0@ is a manual test'.format(name))
3229 elif type == 'unsafe' and want_tests != 'unsafe'
3230 message('@0@ is an unsafe test'.format(name))
3231 elif want_tests != 'false'
3232 test(name, exe,
3233 env : test_env,
3234 timeout : timeout)
3235 endif
3236 else
3237 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3238 endif
3239 endforeach
3240
3241 exe = executable(
3242 'test-libsystemd-sym',
3243 test_libsystemd_sym_c,
3244 include_directories : includes,
3245 link_with : [libsystemd],
3246 build_by_default : want_tests != 'false',
3247 install : install_tests,
3248 install_dir : testsdir)
3249 if want_tests != 'false'
3250 test('test-libsystemd-sym', exe)
3251 endif
3252
3253 exe = executable(
3254 'test-libsystemd-static-sym',
3255 test_libsystemd_sym_c,
3256 include_directories : includes,
3257 link_with : [install_libsystemd_static],
3258 dependencies : [threads], # threads is already included in dependencies on the library,
3259 # but does not seem to get propagated. Add here as a work-around.
3260 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3261 install : install_tests and static_libsystemd_pic,
3262 install_dir : testsdir)
3263 if want_tests != 'false' and static_libsystemd_pic
3264 test('test-libsystemd-static-sym', exe)
3265 endif
3266
3267 exe = executable(
3268 'test-libudev-sym',
3269 test_libudev_sym_c,
3270 include_directories : includes,
3271 c_args : '-Wno-deprecated-declarations',
3272 link_with : [libudev],
3273 build_by_default : want_tests != 'false',
3274 install : install_tests,
3275 install_dir : testsdir)
3276 if want_tests != 'false'
3277 test('test-libudev-sym', exe)
3278 endif
3279
3280 exe = executable(
3281 'test-libudev-static-sym',
3282 test_libudev_sym_c,
3283 include_directories : includes,
3284 c_args : '-Wno-deprecated-declarations',
3285 link_with : [install_libudev_static],
3286 build_by_default : want_tests != 'false' and static_libudev_pic,
3287 install : install_tests and static_libudev_pic,
3288 install_dir : testsdir)
3289 if want_tests != 'false' and static_libudev_pic
3290 test('test-libudev-static-sym', exe)
3291 endif
3292
3293 ############################################################
3294
3295 fuzzer_exes = []
3296
3297 if get_option('tests') != 'false'
3298 foreach tuple : fuzzers
3299 sources = tuple[0]
3300 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3301 dependencies = tuple[2]
3302 defs = tuple.length() >= 4 ? tuple[3] : []
3303 incs = tuple.length() >= 5 ? tuple[4] : includes
3304 link_args = []
3305
3306 if want_ossfuzz
3307 dependencies += fuzzing_engine
3308 elif want_libfuzzer
3309 if fuzzing_engine.found()
3310 dependencies += fuzzing_engine
3311 else
3312 link_args += ['-fsanitize=fuzzer']
3313 endif
3314 else
3315 sources += 'src/fuzz/fuzz-main.c'
3316 endif
3317
3318 name = sources[0].split('/')[-1].split('.')[0]
3319
3320 fuzzer_exes += executable(
3321 name,
3322 sources,
3323 include_directories : [incs, include_directories('src/fuzz')],
3324 link_with : link_with,
3325 dependencies : dependencies,
3326 c_args : defs,
3327 link_args: link_args,
3328 install : false)
3329 endforeach
3330 endif
3331
3332 run_target(
3333 'fuzzers',
3334 depends : fuzzer_exes,
3335 command : ['true'])
3336
3337 ############################################################
3338
3339 subdir('sysctl.d')
3340 subdir('sysusers.d')
3341 subdir('tmpfiles.d')
3342 subdir('hwdb.d')
3343 subdir('units')
3344 subdir('presets')
3345 subdir('network')
3346 subdir('man')
3347 subdir('shell-completion/bash')
3348 subdir('shell-completion/zsh')
3349 subdir('docs/sysvinit')
3350 subdir('docs/var-log')
3351
3352 install_subdir('factory/etc',
3353 install_dir : factorydir)
3354
3355 install_data('xorg/50-systemd-user.sh',
3356 install_dir : xinitrcdir)
3357 install_data('modprobe.d/systemd.conf',
3358 install_dir : modprobedir)
3359 install_data('LICENSE.GPL2',
3360 'LICENSE.LGPL2.1',
3361 'NEWS',
3362 'README',
3363 'docs/CODING_STYLE.md',
3364 'docs/DISTRO_PORTING.md',
3365 'docs/ENVIRONMENT.md',
3366 'docs/HACKING.md',
3367 'docs/TRANSIENT-SETTINGS.md',
3368 'docs/TRANSLATORS.md',
3369 'docs/UIDS-GIDS.md',
3370 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3371 install_dir : docdir)
3372
3373 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3374 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3375
3376 ############################################################
3377
3378 check_help = find_program('tools/check-help.sh')
3379
3380 foreach exec : public_programs
3381 name = exec.full_path().split('/')[-1]
3382 if want_tests != 'false'
3383 test('check-help-' + name,
3384 check_help,
3385 args : exec.full_path())
3386 endif
3387 endforeach
3388
3389 ############################################################
3390
3391 check_directives_sh = find_program('tools/check-directives.sh')
3392
3393 if want_tests != 'false'
3394 test('check-directives',
3395 check_directives_sh,
3396 args : project_source_root)
3397 endif
3398
3399 ############################################################
3400
3401 # Enable tests for all supported sanitizers
3402 foreach tuple : sanitizers
3403 sanitizer = tuple[0]
3404 build = tuple[1]
3405
3406 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3407 prev = ''
3408 foreach p : fuzz_regression_tests
3409 b = p.split('/')[-2]
3410 c = p.split('/')[-1]
3411
3412 name = '@0@:@1@'.format(b, sanitizer)
3413
3414 if name != prev
3415 if want_tests == 'false'
3416 message('Not compiling @0@ because tests is set to false'.format(name))
3417 elif slow_tests or fuzz_tests
3418 exe = custom_target(
3419 name,
3420 output : name,
3421 depends : build,
3422 command : [env, 'ln', '-fs',
3423 join_paths(build.full_path(), b),
3424 '@OUTPUT@'],
3425 build_by_default : true)
3426 else
3427 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3428 endif
3429 endif
3430 prev = name
3431
3432 if want_tests != 'false' and (slow_tests or fuzz_tests)
3433 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3434 env,
3435 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3436 timeout : 60,
3437 args : [exe.full_path(),
3438 join_paths(project_source_root, p)])
3439 endif
3440 endforeach
3441 endif
3442 endforeach
3443
3444
3445 ############################################################
3446
3447 if git.found()
3448 all_files = run_command(
3449 git,
3450 ['--git-dir=@0@/.git'.format(project_source_root),
3451 'ls-files',
3452 ':/*.[ch]'])
3453 all_files = files(all_files.stdout().split())
3454
3455 custom_target(
3456 'tags',
3457 output : 'tags',
3458 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3459 run_target(
3460 'ctags',
3461 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3462 endif
3463
3464 if git.found()
3465 git_contrib_sh = find_program('tools/git-contrib.sh')
3466 run_target(
3467 'git-contrib',
3468 command : [git_contrib_sh])
3469 endif
3470
3471 if git.found()
3472 git_head = run_command(
3473 git,
3474 ['--git-dir=@0@/.git'.format(project_source_root),
3475 'rev-parse', 'HEAD']).stdout().strip()
3476 git_head_short = run_command(
3477 git,
3478 ['--git-dir=@0@/.git'.format(project_source_root),
3479 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3480
3481 run_target(
3482 'git-snapshot',
3483 command : ['git', 'archive',
3484 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3485 git_head_short),
3486 '--prefix', 'systemd-@0@/'.format(git_head),
3487 'HEAD'])
3488 endif
3489
3490 ############################################################
3491
3492 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3493 run_target(
3494 'check-api-docs',
3495 depends : [man, libsystemd, libudev],
3496 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3497
3498 ############################################################
3499 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3500
3501 status = [
3502 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3503
3504 'split /usr: @0@'.format(split_usr),
3505 'split bin-sbin: @0@'.format(split_bin),
3506 'prefix directory: @0@'.format(prefixdir),
3507 'rootprefix directory: @0@'.format(rootprefixdir),
3508 'sysconf directory: @0@'.format(sysconfdir),
3509 'include directory: @0@'.format(includedir),
3510 'lib directory: @0@'.format(libdir),
3511 'rootlib directory: @0@'.format(rootlibdir),
3512 'SysV init scripts: @0@'.format(sysvinit_path),
3513 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3514 'PAM modules directory: @0@'.format(pamlibdir),
3515 'PAM configuration directory: @0@'.format(pamconfdir),
3516 'RPM macros directory: @0@'.format(rpmmacrosdir),
3517 'modprobe.d directory: @0@'.format(modprobedir),
3518 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3519 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3520 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3521 'bash completions directory: @0@'.format(bashcompletiondir),
3522 'zsh completions directory: @0@'.format(zshcompletiondir),
3523 'extra start script: @0@'.format(get_option('rc-local')),
3524 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3525 get_option('debug-tty')),
3526 'TTY GID: @0@'.format(tty_gid),
3527 'users GID: @0@'.format(substs.get('USERS_GID')),
3528 'maximum system UID: @0@'.format(system_uid_max),
3529 'maximum system GID: @0@'.format(system_gid_max),
3530 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3531 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3532 'minimum container UID base: @0@'.format(container_uid_base_min),
3533 'maximum container UID base: @0@'.format(container_uid_base_max),
3534 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3535 'render group access mode: @0@'.format(get_option('group-render-mode')),
3536 'certificate root directory: @0@'.format(get_option('certificate-root')),
3537 'support URL: @0@'.format(support_url),
3538 'nobody user name: @0@'.format(nobody_user),
3539 'nobody group name: @0@'.format(nobody_group),
3540 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3541 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3542
3543 'default DNSSEC mode: @0@'.format(default_dnssec),
3544 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3545 'default mDNS mode: @0@'.format(default_mdns),
3546 'default LLMNR mode: @0@'.format(default_llmnr),
3547 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3548 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3549 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3550 'default locale: @0@'.format(default_locale),
3551 'default user $PATH: @0@'.format(default_user_path_display),
3552 'systemd service watchdog: @0@'.format(watchdog_opt)]
3553
3554 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3555 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3556 status += [
3557 'default DNS servers: @0@'.format(alt_dns_servers),
3558 'default NTP servers: @0@'.format(alt_ntp_servers)]
3559
3560 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3561 '@@0@'.format(time_epoch)).stdout().strip()
3562 status += [
3563 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3564
3565 status += [
3566 'static libsystemd: @0@'.format(static_libsystemd),
3567 'static libudev: @0@'.format(static_libudev)]
3568
3569 # TODO:
3570 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3571 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3572 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3573
3574 if conf.get('ENABLE_EFI') == 1
3575 status += 'efi arch: @0@'.format(efi_arch)
3576
3577 if have_gnu_efi
3578 status += [
3579 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3580 'EFI CC @0@'.format(' '.join(efi_cc)),
3581 'EFI lds: @0@'.format(efi_lds),
3582 'EFI crt0: @0@'.format(efi_crt0),
3583 'EFI include directory: @0@'.format(efi_incdir)]
3584 endif
3585 endif
3586
3587 found = []
3588 missing = []
3589
3590 foreach tuple : [
3591 ['libcryptsetup'],
3592 ['PAM'],
3593 ['pwquality'],
3594 ['libfdisk'],
3595 ['p11kit'],
3596 ['libfido2'],
3597 ['AUDIT'],
3598 ['IMA'],
3599 ['AppArmor'],
3600 ['SELinux'],
3601 ['SECCOMP'],
3602 ['SMACK'],
3603 ['zlib'],
3604 ['xz'],
3605 ['zstd'],
3606 ['lz4'],
3607 ['bzip2'],
3608 ['ACL'],
3609 ['gcrypt'],
3610 ['qrencode'],
3611 ['microhttpd'],
3612 ['gnutls'],
3613 ['openssl'],
3614 ['libcurl'],
3615 ['idn'],
3616 ['initrd'],
3617 ['libidn2'],
3618 ['libidn'],
3619 ['libiptc'],
3620 ['elfutils'],
3621 ['binfmt'],
3622 ['repart'],
3623 ['vconsole'],
3624 ['quotacheck'],
3625 ['tmpfiles'],
3626 ['environment.d'],
3627 ['sysusers'],
3628 ['firstboot'],
3629 ['randomseed'],
3630 ['backlight'],
3631 ['rfkill'],
3632 ['xdg-autostart'],
3633 ['logind'],
3634 ['machined'],
3635 ['portabled'],
3636 ['userdb'],
3637 ['homed'],
3638 ['importd'],
3639 ['hostnamed'],
3640 ['timedated'],
3641 ['timesyncd'],
3642 ['localed'],
3643 ['networkd'],
3644 ['resolve'],
3645 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3646 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3647 ['coredump'],
3648 ['pstore'],
3649 ['polkit'],
3650 ['legacy pkla', install_polkit_pkla],
3651 ['efi'],
3652 ['gnu-efi', have_gnu_efi],
3653 ['kmod'],
3654 ['xkbcommon'],
3655 ['pcre2'],
3656 ['blkid'],
3657 ['dbus'],
3658 ['glib'],
3659 ['nss-myhostname'],
3660 ['nss-mymachines'],
3661 ['nss-resolve'],
3662 ['nss-systemd'],
3663 ['hwdb'],
3664 ['tpm'],
3665 ['man pages', want_man],
3666 ['html pages', want_html],
3667 ['man page indices', want_man and have_lxml],
3668 ['SysV compat'],
3669 ['utmp'],
3670 ['ldconfig'],
3671 ['hibernate'],
3672 ['adm group', get_option('adm-group')],
3673 ['wheel group', get_option('wheel-group')],
3674 ['gshadow'],
3675 ['debug hashmap'],
3676 ['debug mmap cache'],
3677 ['debug siphash'],
3678 ['valgrind', conf.get('VALGRIND') == 1],
3679 ['trace logging', conf.get('LOG_TRACE') == 1],
3680 ['install tests', install_tests],
3681 ['link-udev-shared', get_option('link-udev-shared')],
3682 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3683 ['link-networkd-shared', get_option('link-networkd-shared')],
3684 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3685 ['kernel-install', get_option('kernel-install')],
3686 ['systemd-analyze', get_option('analyze')],
3687 ]
3688
3689 if tuple.length() >= 2
3690 cond = tuple[1]
3691 else
3692 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3693 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3694 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3695 endif
3696 if cond
3697 found += tuple[0]
3698 else
3699 missing += tuple[0]
3700 endif
3701 endforeach
3702
3703 status += [
3704 '',
3705 'enabled features: @0@'.format(', '.join(found)),
3706 '',
3707 'disabled features: @0@'.format(', '.join(missing)),
3708 '']
3709 message('\n '.join(status))
3710
3711 if rootprefixdir != rootprefix_default
3712 warning('\n' +
3713 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3714 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3715 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3716 endif