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