]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
sd-bus: Add sd_bus_set_fd documentation along with some cleanups.
[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 want_fuzzbuzz = get_option('fuzzbuzz')
43 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
44 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
45 endif
46
47 skip_deps = want_ossfuzz or want_libfuzzer
48 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
49
50 #####################################################################
51
52 # Try to install the git pre-commit hook
53 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
54 if git_hook.returncode() == 0
55 message(git_hook.stdout().strip())
56 endif
57
58 #####################################################################
59
60 if get_option('split-usr') == 'auto'
61 split_usr = run_command('test', '-L', '/bin').returncode() != 0
62 else
63 split_usr = get_option('split-usr') == 'true'
64 endif
65 conf.set10('HAVE_SPLIT_USR', split_usr,
66 description : '/usr/bin and /bin directories are separate')
67
68 if get_option('split-bin') == 'auto'
69 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
70 else
71 split_bin = get_option('split-bin') == 'true'
72 endif
73 conf.set10('HAVE_SPLIT_BIN', split_bin,
74 description : 'bin and sbin directories are separate')
75
76 rootprefixdir = get_option('rootprefix')
77 # Unusual rootprefixdir values are used by some distros
78 # (see https://github.com/systemd/systemd/pull/7461).
79 rootprefix_default = split_usr ? '/' : '/usr'
80 if rootprefixdir == ''
81 rootprefixdir = rootprefix_default
82 endif
83 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
84
85 sysvinit_path = get_option('sysvinit-path')
86 sysvrcnd_path = get_option('sysvrcnd-path')
87 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
88 description : 'SysV init scripts and rcN.d links are supported')
89
90 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
91 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
92 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
93
94 # join_paths ignores the preceding arguments if an absolute component is
95 # encountered, so this should canonicalize various paths when they are
96 # absolute or relative.
97 prefixdir = get_option('prefix')
98 if not prefixdir.startswith('/')
99 error('Prefix is not absolute: "@0@"'.format(prefixdir))
100 endif
101 bindir = join_paths(prefixdir, get_option('bindir'))
102 libdir = join_paths(prefixdir, get_option('libdir'))
103 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
104 includedir = join_paths(prefixdir, get_option('includedir'))
105 datadir = join_paths(prefixdir, get_option('datadir'))
106 localstatedir = join_paths('/', get_option('localstatedir'))
107
108 rootbindir = join_paths(rootprefixdir, 'bin')
109 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
110 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
111
112 rootlibdir = get_option('rootlibdir')
113 if rootlibdir == ''
114 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
115 endif
116
117 # Dirs of external packages
118 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
119 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
120 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
121 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
122 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
123 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
124 rpmmacrosdir = get_option('rpmmacrosdir')
125 if rpmmacrosdir != 'no'
126 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
127 endif
128 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
129
130 # Our own paths
131 pkgdatadir = join_paths(datadir, 'systemd')
132 environmentdir = join_paths(prefixdir, 'lib/environment.d')
133 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
134 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
135 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
136 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
137 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
138 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
139 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
140 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
141 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
142 pkgincludedir = join_paths(includedir, 'systemd')
143 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
144 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
145 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
146 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
147 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
148 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
149 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
150 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
151 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
152 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
153 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
154 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
155 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
156 factorydir = join_paths(datadir, 'factory')
157 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
158 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
159 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
160 catalogstatedir = join_paths(systemdstatedir, 'catalog')
161 randomseeddir = join_paths(localstatedir, 'lib/systemd')
162 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
163 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
164
165 docdir = get_option('docdir')
166 if docdir == ''
167 docdir = join_paths(datadir, 'doc/systemd')
168 endif
169
170 dbuspolicydir = get_option('dbuspolicydir')
171 if dbuspolicydir == ''
172 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
173 endif
174
175 dbussessionservicedir = get_option('dbussessionservicedir')
176 if dbussessionservicedir == ''
177 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
178 endif
179
180 dbussystemservicedir = get_option('dbussystemservicedir')
181 if dbussystemservicedir == ''
182 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
183 endif
184
185 pamlibdir = get_option('pamlibdir')
186 if pamlibdir == ''
187 pamlibdir = join_paths(rootlibdir, 'security')
188 endif
189
190 pamconfdir = get_option('pamconfdir')
191 if pamconfdir == ''
192 pamconfdir = join_paths(sysconfdir, 'pam.d')
193 endif
194
195 memory_accounting_default = get_option('memory-accounting-default')
196 status_unit_format_default = get_option('status-unit-format-default')
197
198 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
199 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
200 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
201 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
202 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
203 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
204
205 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
206
207 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
208 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
209 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
210 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
211 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
212 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
213 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
214 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
215 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
216 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
217 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
218 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
219 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
220 conf.set_quoted('ROOTPREFIX', rootprefixdir)
221 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
222 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
223 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
224 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
225 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
226 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
227 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
228 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
229 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
230 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
231 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
232 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
233 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
234 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
235 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
236 conf.set_quoted('LIBDIR', libdir)
237 conf.set_quoted('ROOTLIBDIR', rootlibdir)
238 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
239 conf.set_quoted('BOOTLIBDIR', bootlibdir)
240 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
241 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
242 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
243 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
244 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
245 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
246 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
247 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
248 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
249 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
250 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
251 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
252
253 substs.set('prefix', prefixdir)
254 substs.set('rootprefix', rootprefixdir)
255 substs.set('rootprefix_noslash', rootprefixdir_noslash)
256 substs.set('exec_prefix', prefixdir)
257 substs.set('libdir', libdir)
258 substs.set('rootlibdir', rootlibdir)
259 substs.set('includedir', includedir)
260 substs.set('sysconfdir', sysconfdir)
261 substs.set('bindir', bindir)
262 substs.set('rootbindir', rootbindir)
263 substs.set('rootlibexecdir', rootlibexecdir)
264 substs.set('systemunitdir', systemunitdir)
265 substs.set('userunitdir', userunitdir)
266 substs.set('systempresetdir', systempresetdir)
267 substs.set('userpresetdir', userpresetdir)
268 substs.set('udevhwdbdir', udevhwdbdir)
269 substs.set('udevrulesdir', udevrulesdir)
270 substs.set('udevlibexecdir', udevlibexecdir)
271 substs.set('environmentdir', environmentdir)
272 substs.set('catalogdir', catalogdir)
273 substs.set('tmpfilesdir', tmpfilesdir)
274 substs.set('sysusersdir', sysusersdir)
275 substs.set('sysctldir', sysctldir)
276 substs.set('binfmtdir', binfmtdir)
277 substs.set('modulesloaddir', modulesloaddir)
278 substs.set('modprobedir', modprobedir)
279 substs.set('systemgeneratordir', systemgeneratordir)
280 substs.set('usergeneratordir', usergeneratordir)
281 substs.set('systemenvgeneratordir', systemenvgeneratordir)
282 substs.set('userenvgeneratordir', userenvgeneratordir)
283 substs.set('systemshutdowndir', systemshutdowndir)
284 substs.set('systemsleepdir', systemsleepdir)
285 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
286 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
287 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
288 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
289 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
290 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
291 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
292 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
293 substs.set('BUILD_ROOT', meson.current_build_dir())
294
295 #####################################################################
296
297 cc = meson.get_compiler('c')
298 pkgconfig = import('pkgconfig')
299 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
300 meson_build_sh = find_program('tools/meson-build.sh')
301
302 want_tests = get_option('tests')
303 slow_tests = want_tests != 'false' and get_option('slow-tests')
304 install_tests = get_option('install-tests')
305
306 if add_languages('cpp', required : fuzzer_build)
307 # Used only for tests
308 cxx = meson.get_compiler('cpp')
309 cxx_cmd = ' '.join(cxx.cmd_array())
310 else
311 cxx_cmd = ''
312 endif
313
314 if want_libfuzzer
315 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
316 if fuzzing_engine.found()
317 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
318 elif cc.has_argument('-fsanitize=fuzzer-no-link')
319 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
320 else
321 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
322 endif
323 elif want_ossfuzz
324 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
325 elif want_fuzzbuzz
326 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
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 want_repart = get_option('repart')
1306 if want_repart != 'false'
1307 have = (conf.get('HAVE_OPENSSL') == 1 and
1308 conf.get('HAVE_LIBFDISK') == 1)
1309 if want_repart == 'true' and not have
1310 error('repart support was requested, but dependencies are not available')
1311 endif
1312 else
1313 have = false
1314 endif
1315 conf.set10('ENABLE_REPART', have)
1316
1317 want_importd = get_option('importd')
1318 if want_importd != 'false'
1319 have = (conf.get('HAVE_LIBCURL') == 1 and
1320 conf.get('HAVE_ZLIB') == 1 and
1321 conf.get('HAVE_XZ') == 1 and
1322 conf.get('HAVE_GCRYPT') == 1)
1323 if want_importd == 'true' and not have
1324 error('importd support was requested, but dependencies are not available')
1325 endif
1326 else
1327 have = false
1328 endif
1329 conf.set10('ENABLE_IMPORTD', have)
1330
1331 want_homed = get_option('homed')
1332 if want_homed != 'false'
1333 have = (conf.get('HAVE_OPENSSL') == 1 and
1334 conf.get('HAVE_LIBFDISK') == 1 and
1335 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1336 if want_homed == 'true' and not have
1337 error('homed support was requested, but dependencies are not available')
1338 endif
1339 else
1340 have = false
1341 endif
1342 conf.set10('ENABLE_HOMED', have)
1343
1344 have = have and conf.get('HAVE_PAM') == 1
1345 conf.set10('ENABLE_PAM_HOME', have)
1346
1347 want_remote = get_option('remote')
1348 if want_remote != 'false'
1349 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1350 conf.get('HAVE_LIBCURL') == 1]
1351 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1352 # it's possible to build one without the other. Complain only if
1353 # support was explicitly requested. The auxiliary files like sysusers
1354 # config should be installed when any of the programs are built.
1355 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1356 error('remote support was requested, but dependencies are not available')
1357 endif
1358 have = have_deps[0] or have_deps[1]
1359 else
1360 have = false
1361 endif
1362 conf.set10('ENABLE_REMOTE', have)
1363
1364 foreach term : ['utmp',
1365 'hibernate',
1366 'environment-d',
1367 'binfmt',
1368 'coredump',
1369 'pstore',
1370 'resolve',
1371 'logind',
1372 'hostnamed',
1373 'localed',
1374 'machined',
1375 'portabled',
1376 'userdb',
1377 'networkd',
1378 'timedated',
1379 'timesyncd',
1380 'firstboot',
1381 'randomseed',
1382 'backlight',
1383 'vconsole',
1384 'quotacheck',
1385 'sysusers',
1386 'tmpfiles',
1387 'hwdb',
1388 'rfkill',
1389 'ldconfig',
1390 'efi',
1391 'tpm',
1392 'ima',
1393 'smack',
1394 'gshadow',
1395 'idn',
1396 'nss-myhostname',
1397 'nss-systemd']
1398 have = get_option(term)
1399 name = 'ENABLE_' + term.underscorify().to_upper()
1400 conf.set10(name, have)
1401 endforeach
1402
1403 foreach tuple : [['nss-mymachines', 'machined'],
1404 ['nss-resolve', 'resolve']]
1405 want = get_option(tuple[0])
1406 if want != 'false'
1407 have = get_option(tuple[1])
1408 if want == 'true' and not have
1409 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1410 endif
1411 else
1412 have = false
1413 endif
1414 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1415 conf.set10(name, have)
1416 endforeach
1417
1418 enable_nss = false
1419 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1420 'ENABLE_NSS_MYMACHINES',
1421 'ENABLE_NSS_RESOLVE',
1422 'ENABLE_NSS_SYSTEMD']
1423 if conf.get(term) == 1
1424 enable_nss = true
1425 endif
1426 endforeach
1427 conf.set10('ENABLE_NSS', enable_nss)
1428
1429 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1430
1431 tests = []
1432 fuzzers = []
1433
1434 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1435
1436 #####################################################################
1437
1438 if get_option('efi')
1439 efi_arch = host_machine.cpu_family()
1440
1441 if efi_arch == 'x86'
1442 EFI_MACHINE_TYPE_NAME = 'ia32'
1443 gnu_efi_arch = 'ia32'
1444 elif efi_arch == 'x86_64'
1445 EFI_MACHINE_TYPE_NAME = 'x64'
1446 gnu_efi_arch = 'x86_64'
1447 elif efi_arch == 'arm'
1448 EFI_MACHINE_TYPE_NAME = 'arm'
1449 gnu_efi_arch = 'arm'
1450 elif efi_arch == 'aarch64'
1451 EFI_MACHINE_TYPE_NAME = 'aa64'
1452 gnu_efi_arch = 'aarch64'
1453 else
1454 EFI_MACHINE_TYPE_NAME = ''
1455 gnu_efi_arch = ''
1456 endif
1457
1458 have = true
1459 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1460
1461 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1462 else
1463 have = false
1464 endif
1465 conf.set10('ENABLE_EFI', have)
1466
1467 #####################################################################
1468
1469 config_h = configure_file(
1470 output : 'config.h',
1471 configuration : conf)
1472
1473 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1474
1475 includes = include_directories('src/basic',
1476 'src/boot',
1477 'src/shared',
1478 'src/systemd',
1479 'src/journal',
1480 'src/journal-remote',
1481 'src/nspawn',
1482 'src/resolve',
1483 'src/timesync',
1484 'src/time-wait-sync',
1485 'src/login',
1486 'src/udev',
1487 'src/libudev',
1488 'src/core',
1489 'src/shutdown',
1490 'src/libsystemd/sd-bus',
1491 'src/libsystemd/sd-device',
1492 'src/libsystemd/sd-event',
1493 'src/libsystemd/sd-hwdb',
1494 'src/libsystemd/sd-id128',
1495 'src/libsystemd/sd-netlink',
1496 'src/libsystemd/sd-network',
1497 'src/libsystemd/sd-resolve',
1498 'src/libsystemd-network',
1499 '.')
1500
1501 add_project_arguments('-include', 'config.h', language : 'c')
1502
1503 generate_gperfs = find_program('tools/generate-gperfs.py')
1504
1505 subdir('po')
1506 subdir('catalog')
1507 subdir('src/systemd')
1508 subdir('src/basic')
1509 subdir('src/libsystemd')
1510 subdir('src/libsystemd-network')
1511 subdir('src/journal')
1512 subdir('src/login')
1513
1514 libjournal_core = static_library(
1515 'journal-core',
1516 libjournal_core_sources,
1517 journald_gperf_c,
1518 include_directories : includes,
1519 install : false)
1520
1521 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1522 libsystemd = shared_library(
1523 'systemd',
1524 disable_mempool_c,
1525 version : libsystemd_version,
1526 include_directories : includes,
1527 link_args : ['-shared',
1528 '-Wl,--version-script=' + libsystemd_sym_path],
1529 link_with : [libbasic,
1530 libbasic_gcrypt],
1531 link_whole : [libsystemd_static,
1532 libjournal_client],
1533 dependencies : [threads,
1534 librt,
1535 libxz,
1536 liblz4],
1537 link_depends : libsystemd_sym,
1538 install : true,
1539 install_dir : rootlibdir)
1540
1541 static_libsystemd = get_option('static-libsystemd')
1542 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1543
1544 install_libsystemd_static = static_library(
1545 'systemd',
1546 libsystemd_sources,
1547 journal_client_sources,
1548 basic_sources,
1549 basic_gcrypt_sources,
1550 disable_mempool_c,
1551 include_directories : includes,
1552 build_by_default : static_libsystemd != 'false',
1553 install : static_libsystemd != 'false',
1554 install_dir : rootlibdir,
1555 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1556 dependencies : [threads,
1557 librt,
1558 libxz,
1559 liblz4,
1560 libcap,
1561 libblkid,
1562 libmount,
1563 libselinux,
1564 libgcrypt],
1565 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1566
1567 #Generate autosuspend rules
1568 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1569
1570 ############################################################
1571
1572 # binaries that have --help and are intended for use by humans,
1573 # usually, but not always, installed in /bin.
1574 public_programs = []
1575
1576 subdir('src/libudev')
1577 subdir('src/shared')
1578 subdir('src/core')
1579 subdir('src/shutdown')
1580 subdir('src/udev')
1581 subdir('src/network')
1582
1583 subdir('src/analyze')
1584 subdir('src/journal-remote')
1585 subdir('src/coredump')
1586 subdir('src/pstore')
1587 subdir('src/hostname')
1588 subdir('src/import')
1589 subdir('src/partition')
1590 subdir('src/kernel-install')
1591 subdir('src/locale')
1592 subdir('src/machine')
1593 subdir('src/portable')
1594 subdir('src/userdb')
1595 subdir('src/home')
1596 subdir('src/nspawn')
1597 subdir('src/resolve')
1598 subdir('src/timedate')
1599 subdir('src/timesync')
1600 subdir('src/vconsole')
1601 subdir('src/boot/efi')
1602
1603 subdir('src/test')
1604 subdir('src/fuzz')
1605 subdir('rules.d')
1606 subdir('test')
1607
1608 ############################################################
1609
1610 # only static linking apart from libdl, to make sure that the
1611 # module is linked to all libraries that it uses.
1612 test_dlopen = executable(
1613 'test-dlopen',
1614 test_dlopen_c,
1615 disable_mempool_c,
1616 include_directories : includes,
1617 link_with : [libbasic],
1618 dependencies : [libdl],
1619 build_by_default : want_tests != 'false')
1620
1621 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1622 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1623 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1624 ['resolve', 'ENABLE_NSS_RESOLVE']]
1625
1626 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1627 if condition
1628 module = tuple[0]
1629
1630 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1631 version_script_arg = join_paths(project_source_root, sym)
1632
1633 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1634 if tuple.length() > 2
1635 sources += tuple[2].split()
1636 endif
1637
1638 nss = shared_library(
1639 'nss_' + module,
1640 sources,
1641 disable_mempool_c,
1642 version : '2',
1643 include_directories : includes,
1644 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1645 link_args : ['-Wl,-z,nodelete',
1646 '-shared',
1647 '-Wl,--version-script=' + version_script_arg],
1648 link_with : [libsystemd_static,
1649 libshared_static,
1650 libbasic],
1651 dependencies : [threads,
1652 librt],
1653 link_depends : sym,
1654 install : true,
1655 install_dir : rootlibdir)
1656
1657 # We cannot use shared_module because it does not support version suffix.
1658 # Unfortunately shared_library insists on creating the symlink…
1659 meson.add_install_script('sh', '-c',
1660 'rm $DESTDIR@0@/libnss_@1@.so'
1661 .format(rootlibdir, module))
1662
1663 if want_tests != 'false'
1664 test('dlopen-nss_' + module,
1665 test_dlopen,
1666 # path to dlopen must include a slash
1667 args : nss.full_path())
1668 endif
1669 endif
1670 endforeach
1671
1672 ############################################################
1673
1674 executable('systemd',
1675 systemd_sources,
1676 include_directories : includes,
1677 link_with : [libcore,
1678 libshared],
1679 dependencies : [versiondep,
1680 threads,
1681 librt,
1682 libseccomp,
1683 libselinux,
1684 libmount,
1685 libblkid],
1686 install_rpath : rootlibexecdir,
1687 install : true,
1688 install_dir : rootlibexecdir)
1689
1690 meson.add_install_script(meson_make_symlink,
1691 join_paths(rootlibexecdir, 'systemd'),
1692 join_paths(rootsbindir, 'init'))
1693
1694 exe = executable('systemd-analyze',
1695 systemd_analyze_sources,
1696 include_directories : includes,
1697 link_with : [libcore,
1698 libshared],
1699 dependencies : [versiondep,
1700 threads,
1701 librt,
1702 libseccomp,
1703 libselinux,
1704 libmount,
1705 libblkid],
1706 install_rpath : rootlibexecdir,
1707 install : true)
1708 public_programs += exe
1709
1710 executable('systemd-journald',
1711 systemd_journald_sources,
1712 include_directories : includes,
1713 link_with : [libjournal_core,
1714 libshared],
1715 dependencies : [threads,
1716 libxz,
1717 liblz4,
1718 libselinux],
1719 install_rpath : rootlibexecdir,
1720 install : true,
1721 install_dir : rootlibexecdir)
1722
1723 exe = executable('systemd-cat',
1724 systemd_cat_sources,
1725 include_directories : includes,
1726 link_with : [libjournal_core,
1727 libshared],
1728 dependencies : [threads],
1729 install_rpath : rootlibexecdir,
1730 install : true)
1731 public_programs += exe
1732
1733 exe = executable('journalctl',
1734 journalctl_sources,
1735 include_directories : includes,
1736 link_with : [libshared],
1737 dependencies : [threads,
1738 libqrencode,
1739 libxz,
1740 liblz4,
1741 libpcre2],
1742 install_rpath : rootlibexecdir,
1743 install : true,
1744 install_dir : rootbindir)
1745 public_programs += exe
1746
1747 executable('systemd-getty-generator',
1748 'src/getty-generator/getty-generator.c',
1749 include_directories : includes,
1750 link_with : [libshared],
1751 install_rpath : rootlibexecdir,
1752 install : true,
1753 install_dir : systemgeneratordir)
1754
1755 executable('systemd-debug-generator',
1756 'src/debug-generator/debug-generator.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 install_rpath : rootlibexecdir,
1760 install : true,
1761 install_dir : systemgeneratordir)
1762
1763 executable('systemd-run-generator',
1764 'src/run-generator/run-generator.c',
1765 include_directories : includes,
1766 link_with : [libshared],
1767 install_rpath : rootlibexecdir,
1768 install : true,
1769 install_dir : systemgeneratordir)
1770
1771 executable('systemd-fstab-generator',
1772 'src/fstab-generator/fstab-generator.c',
1773 include_directories : includes,
1774 link_with : [libcore_shared,
1775 libshared],
1776 install_rpath : rootlibexecdir,
1777 install : true,
1778 install_dir : systemgeneratordir)
1779
1780 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1781 executable('30-systemd-environment-d-generator',
1782 'src/environment-d-generator/environment-d-generator.c',
1783 include_directories : includes,
1784 link_with : [libshared],
1785 install_rpath : rootlibexecdir,
1786 install : true,
1787 install_dir : userenvgeneratordir)
1788
1789 meson.add_install_script(meson_make_symlink,
1790 join_paths(sysconfdir, 'environment'),
1791 join_paths(environmentdir, '99-environment.conf'))
1792 endif
1793
1794 if conf.get('ENABLE_HIBERNATE') == 1
1795 executable('systemd-hibernate-resume-generator',
1796 'src/hibernate-resume/hibernate-resume-generator.c',
1797 include_directories : includes,
1798 link_with : [libshared],
1799 install_rpath : rootlibexecdir,
1800 install : true,
1801 install_dir : systemgeneratordir)
1802
1803 executable('systemd-hibernate-resume',
1804 'src/hibernate-resume/hibernate-resume.c',
1805 include_directories : includes,
1806 link_with : [libshared],
1807 install_rpath : rootlibexecdir,
1808 install : true,
1809 install_dir : rootlibexecdir)
1810 endif
1811
1812 if conf.get('HAVE_BLKID') == 1
1813 executable('systemd-gpt-auto-generator',
1814 'src/gpt-auto-generator/gpt-auto-generator.c',
1815 'src/shared/blkid-util.h',
1816 include_directories : includes,
1817 link_with : [libshared],
1818 dependencies : libblkid,
1819 install_rpath : rootlibexecdir,
1820 install : true,
1821 install_dir : systemgeneratordir)
1822
1823 exe = executable('systemd-dissect',
1824 'src/dissect/dissect.c',
1825 include_directories : includes,
1826 link_with : [libshared],
1827 install_rpath : rootlibexecdir,
1828 install : true,
1829 install_dir : rootlibexecdir)
1830 public_programs += exe
1831 endif
1832
1833 if conf.get('ENABLE_RESOLVE') == 1
1834 executable('systemd-resolved',
1835 systemd_resolved_sources,
1836 include_directories : includes,
1837 link_with : [libshared,
1838 libbasic_gcrypt,
1839 libsystemd_resolve_core],
1840 dependencies : systemd_resolved_dependencies,
1841 install_rpath : rootlibexecdir,
1842 install : true,
1843 install_dir : rootlibexecdir)
1844
1845 exe = executable('resolvectl',
1846 resolvectl_sources,
1847 include_directories : includes,
1848 link_with : [libshared,
1849 libbasic_gcrypt,
1850 libsystemd_resolve_core],
1851 dependencies : [threads,
1852 libgpg_error,
1853 libm,
1854 libidn],
1855 install_rpath : rootlibexecdir,
1856 install : true)
1857 public_programs += exe
1858
1859 meson.add_install_script(meson_make_symlink,
1860 join_paths(bindir, 'resolvectl'),
1861 join_paths(rootsbindir, 'resolvconf'))
1862
1863 meson.add_install_script(meson_make_symlink,
1864 join_paths(bindir, 'resolvectl'),
1865 join_paths(bindir, 'systemd-resolve'))
1866 endif
1867
1868 if conf.get('ENABLE_LOGIND') == 1
1869 executable('systemd-logind',
1870 systemd_logind_sources,
1871 include_directories : includes,
1872 link_with : [liblogind_core,
1873 libshared],
1874 dependencies : [threads,
1875 libacl],
1876 install_rpath : rootlibexecdir,
1877 install : true,
1878 install_dir : rootlibexecdir)
1879
1880 exe = executable('loginctl',
1881 loginctl_sources,
1882 include_directories : includes,
1883 link_with : [libshared],
1884 dependencies : [threads,
1885 liblz4,
1886 libxz],
1887 install_rpath : rootlibexecdir,
1888 install : true,
1889 install_dir : rootbindir)
1890 public_programs += exe
1891
1892 exe = executable('systemd-inhibit',
1893 'src/login/inhibit.c',
1894 include_directories : includes,
1895 link_with : [libshared],
1896 install_rpath : rootlibexecdir,
1897 install : true,
1898 install_dir : rootbindir)
1899 public_programs += exe
1900
1901 if conf.get('HAVE_PAM') == 1
1902 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1903 pam_systemd = shared_library(
1904 'pam_systemd',
1905 pam_systemd_c,
1906 name_prefix : '',
1907 include_directories : includes,
1908 link_args : ['-shared',
1909 '-Wl,--version-script=' + version_script_arg],
1910 link_with : [libsystemd_static,
1911 libshared_static],
1912 dependencies : [threads,
1913 libpam,
1914 libpam_misc],
1915 link_depends : pam_systemd_sym,
1916 install : true,
1917 install_dir : pamlibdir)
1918
1919 if want_tests != 'false'
1920 test('dlopen-pam_systemd',
1921 test_dlopen,
1922 # path to dlopen must include a slash
1923 args : pam_systemd.full_path())
1924 endif
1925 endif
1926
1927 executable('systemd-user-runtime-dir',
1928 user_runtime_dir_sources,
1929 include_directories : includes,
1930 link_with : [libshared],
1931 install_rpath : rootlibexecdir,
1932 install : true,
1933 install_dir : rootlibexecdir)
1934 endif
1935
1936 if conf.get('HAVE_PAM') == 1
1937 executable('systemd-user-sessions',
1938 'src/user-sessions/user-sessions.c',
1939 include_directories : includes,
1940 link_with : [libshared],
1941 install_rpath : rootlibexecdir,
1942 install : true,
1943 install_dir : rootlibexecdir)
1944 endif
1945
1946 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1947 exe = executable('bootctl',
1948 'src/boot/bootctl.c',
1949 include_directories : includes,
1950 link_with : [libshared],
1951 dependencies : [libblkid],
1952 install_rpath : rootlibexecdir,
1953 install : true)
1954 public_programs += exe
1955
1956 executable('systemd-bless-boot',
1957 'src/boot/bless-boot.c',
1958 include_directories : includes,
1959 link_with : [libshared],
1960 dependencies : [libblkid],
1961 install_rpath : rootlibexecdir,
1962 install : true,
1963 install_dir : rootlibexecdir)
1964
1965 executable('systemd-bless-boot-generator',
1966 'src/boot/bless-boot-generator.c',
1967 include_directories : includes,
1968 link_with : [libshared],
1969 install_rpath : rootlibexecdir,
1970 install : true,
1971 install_dir : systemgeneratordir)
1972 endif
1973
1974 executable('systemd-boot-check-no-failures',
1975 'src/boot/boot-check-no-failures.c',
1976 include_directories : includes,
1977 link_with : [libshared],
1978 dependencies : [libblkid],
1979 install_rpath : rootlibexecdir,
1980 install : true,
1981 install_dir : rootlibexecdir)
1982
1983 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1984 include_directories : includes,
1985 link_with : [libshared],
1986 dependencies : [threads],
1987 install_rpath : rootlibexecdir,
1988 install : true)
1989 public_programs += exe
1990
1991
1992 if get_option('link-systemctl-shared')
1993 systemctl_link_with = [libshared]
1994 else
1995 systemctl_link_with = [libsystemd_static,
1996 libshared_static,
1997 libjournal_client,
1998 libbasic_gcrypt]
1999 endif
2000
2001 exe = executable('systemctl',
2002 'src/systemctl/systemctl.c',
2003 'src/systemctl/sysv-compat.h',
2004 'src/systemctl/sysv-compat.c',
2005 include_directories : includes,
2006 link_with : systemctl_link_with,
2007 dependencies : [threads,
2008 libcap,
2009 libselinux,
2010 libxz,
2011 liblz4],
2012 install_rpath : rootlibexecdir,
2013 install : true,
2014 install_dir : rootbindir)
2015 public_programs += exe
2016
2017 if conf.get('ENABLE_PORTABLED') == 1
2018 executable('systemd-portabled',
2019 systemd_portabled_sources,
2020 include_directories : includes,
2021 link_with : [libshared],
2022 dependencies : [threads],
2023 install_rpath : rootlibexecdir,
2024 install : true,
2025 install_dir : rootlibexecdir)
2026
2027 exe = executable('portablectl', 'src/portable/portablectl.c',
2028 include_directories : includes,
2029 link_with : [libshared],
2030 dependencies : [threads],
2031 install_rpath : rootlibexecdir,
2032 install : true,
2033 install_dir : rootbindir)
2034 public_programs += exe
2035 endif
2036
2037 if conf.get('ENABLE_USERDB') == 1
2038 executable('systemd-userwork',
2039 systemd_userwork_sources,
2040 include_directories : includes,
2041 link_with : [libshared],
2042 dependencies : [threads],
2043 install_rpath : rootlibexecdir,
2044 install : true,
2045 install_dir : rootlibexecdir)
2046
2047 executable('systemd-userdbd',
2048 systemd_userdbd_sources,
2049 include_directories : includes,
2050 link_with : [libshared],
2051 dependencies : [threads],
2052 install_rpath : rootlibexecdir,
2053 install : true,
2054 install_dir : rootlibexecdir)
2055
2056 executable('userdbctl',
2057 userdbctl_sources,
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_HOMED') == 1
2067 executable('systemd-homework',
2068 systemd_homework_sources,
2069 include_directories : includes,
2070 link_with : [libshared],
2071 dependencies : [threads,
2072 libcryptsetup,
2073 libblkid,
2074 libcrypt,
2075 libopenssl,
2076 libfdisk,
2077 libp11kit],
2078 install_rpath : rootlibexecdir,
2079 install : true,
2080 install_dir : rootlibexecdir)
2081
2082 executable('systemd-homed',
2083 systemd_homed_sources,
2084 include_directories : includes,
2085 link_with : [libshared],
2086 dependencies : [threads,
2087 libcrypt,
2088 libopenssl,
2089 libpwquality],
2090 install_rpath : rootlibexecdir,
2091 install : true,
2092 install_dir : rootlibexecdir)
2093
2094 executable('homectl',
2095 homectl_sources,
2096 include_directories : includes,
2097 link_with : [libshared],
2098 dependencies : [threads,
2099 libcrypt,
2100 libopenssl,
2101 libp11kit,
2102 libpwquality],
2103 install_rpath : rootlibexecdir,
2104 install : true,
2105 install_dir : rootbindir)
2106
2107 if conf.get('HAVE_PAM') == 1
2108 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2109 pam_systemd = shared_library(
2110 'pam_systemd_home',
2111 pam_systemd_home_c,
2112 name_prefix : '',
2113 include_directories : includes,
2114 link_args : ['-shared',
2115 '-Wl,--version-script=' + version_script_arg],
2116 link_with : [libsystemd_static,
2117 libshared_static],
2118 dependencies : [threads,
2119 libpam,
2120 libpam_misc,
2121 libcrypt],
2122 link_depends : pam_systemd_home_sym,
2123 install : true,
2124 install_dir : pamlibdir)
2125 endif
2126 endif
2127
2128 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2129 meson.add_install_script(meson_make_symlink,
2130 join_paths(rootbindir, 'systemctl'),
2131 join_paths(rootsbindir, alias))
2132 endforeach
2133
2134 if conf.get('ENABLE_BACKLIGHT') == 1
2135 executable('systemd-backlight',
2136 'src/backlight/backlight.c',
2137 include_directories : includes,
2138 link_with : [libshared],
2139 install_rpath : rootlibexecdir,
2140 install : true,
2141 install_dir : rootlibexecdir)
2142 endif
2143
2144 if conf.get('ENABLE_RFKILL') == 1
2145 executable('systemd-rfkill',
2146 'src/rfkill/rfkill.c',
2147 include_directories : includes,
2148 link_with : [libshared],
2149 install_rpath : rootlibexecdir,
2150 install : true,
2151 install_dir : rootlibexecdir)
2152 endif
2153
2154 executable('systemd-system-update-generator',
2155 'src/system-update-generator/system-update-generator.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2159 install : true,
2160 install_dir : systemgeneratordir)
2161
2162 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2163 systemd_cryptsetup_sources = files('''
2164 src/cryptsetup/cryptsetup.c
2165 src/cryptsetup/cryptsetup-pkcs11.h
2166 '''.split())
2167
2168 if conf.get('HAVE_P11KIT') == 1
2169 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2170 endif
2171
2172 executable('systemd-cryptsetup',
2173 systemd_cryptsetup_sources,
2174 include_directories : includes,
2175 link_with : [libshared],
2176 dependencies : [libcryptsetup,
2177 libp11kit],
2178 install_rpath : rootlibexecdir,
2179 install : true,
2180 install_dir : rootlibexecdir)
2181
2182 executable('systemd-cryptsetup-generator',
2183 'src/cryptsetup/cryptsetup-generator.c',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 dependencies : [libcryptsetup],
2187 install_rpath : rootlibexecdir,
2188 install : true,
2189 install_dir : systemgeneratordir)
2190
2191 executable('systemd-veritysetup',
2192 'src/veritysetup/veritysetup.c',
2193 include_directories : includes,
2194 link_with : [libshared],
2195 dependencies : [libcryptsetup],
2196 install_rpath : rootlibexecdir,
2197 install : true,
2198 install_dir : rootlibexecdir)
2199
2200 executable('systemd-veritysetup-generator',
2201 'src/veritysetup/veritysetup-generator.c',
2202 include_directories : includes,
2203 link_with : [libshared],
2204 dependencies : [libcryptsetup],
2205 install_rpath : rootlibexecdir,
2206 install : true,
2207 install_dir : systemgeneratordir)
2208 endif
2209
2210 if conf.get('HAVE_SYSV_COMPAT') == 1
2211 executable('systemd-sysv-generator',
2212 'src/sysv-generator/sysv-generator.c',
2213 include_directories : includes,
2214 link_with : [libshared],
2215 install_rpath : rootlibexecdir,
2216 install : true,
2217 install_dir : systemgeneratordir)
2218
2219 executable('systemd-rc-local-generator',
2220 'src/rc-local-generator/rc-local-generator.c',
2221 include_directories : includes,
2222 link_with : [libshared],
2223 install_rpath : rootlibexecdir,
2224 install : true,
2225 install_dir : systemgeneratordir)
2226 endif
2227
2228 if conf.get('ENABLE_HOSTNAMED') == 1
2229 executable('systemd-hostnamed',
2230 'src/hostname/hostnamed.c',
2231 include_directories : includes,
2232 link_with : [libshared],
2233 install_rpath : rootlibexecdir,
2234 install : true,
2235 install_dir : rootlibexecdir)
2236
2237 exe = executable('hostnamectl',
2238 'src/hostname/hostnamectl.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 install_rpath : rootlibexecdir,
2242 install : true)
2243 public_programs += exe
2244 endif
2245
2246 if conf.get('ENABLE_LOCALED') == 1
2247 if conf.get('HAVE_XKBCOMMON') == 1
2248 # logind will load libxkbcommon.so dynamically on its own
2249 deps = [libdl]
2250 else
2251 deps = []
2252 endif
2253
2254 executable('systemd-localed',
2255 systemd_localed_sources,
2256 include_directories : includes,
2257 link_with : [libshared],
2258 dependencies : deps,
2259 install_rpath : rootlibexecdir,
2260 install : true,
2261 install_dir : rootlibexecdir)
2262
2263 exe = executable('localectl',
2264 localectl_sources,
2265 include_directories : includes,
2266 link_with : [libshared],
2267 install_rpath : rootlibexecdir,
2268 install : true)
2269 public_programs += exe
2270 endif
2271
2272 if conf.get('ENABLE_TIMEDATED') == 1
2273 executable('systemd-timedated',
2274 'src/timedate/timedated.c',
2275 include_directories : includes,
2276 link_with : [libshared],
2277 install_rpath : rootlibexecdir,
2278 install : true,
2279 install_dir : rootlibexecdir)
2280 endif
2281
2282 if conf.get('ENABLE_TIMEDATECTL') == 1
2283 exe = executable('timedatectl',
2284 'src/timedate/timedatectl.c',
2285 include_directories : includes,
2286 install_rpath : rootlibexecdir,
2287 link_with : [libshared],
2288 dependencies : [libm],
2289 install : true)
2290 public_programs += exe
2291 endif
2292
2293 if conf.get('ENABLE_TIMESYNCD') == 1
2294 if get_option('link-timesyncd-shared')
2295 timesyncd_link_with = [libshared]
2296 else
2297 timesyncd_link_with = [libsystemd_static,
2298 libshared_static,
2299 libjournal_client,
2300 libbasic_gcrypt]
2301 endif
2302
2303 executable('systemd-timesyncd',
2304 systemd_timesyncd_sources,
2305 include_directories : includes,
2306 link_with : [timesyncd_link_with],
2307 dependencies : [threads,
2308 libm],
2309 install_rpath : rootlibexecdir,
2310 install : true,
2311 install_dir : rootlibexecdir)
2312
2313 executable('systemd-time-wait-sync',
2314 'src/time-wait-sync/time-wait-sync.c',
2315 include_directories : includes,
2316 link_with : [timesyncd_link_with],
2317 install_rpath : rootlibexecdir,
2318 install : true,
2319 install_dir : rootlibexecdir)
2320 endif
2321
2322 if conf.get('ENABLE_MACHINED') == 1
2323 executable('systemd-machined',
2324 systemd_machined_sources,
2325 include_directories : includes,
2326 link_with : [libmachine_core,
2327 libshared],
2328 install_rpath : rootlibexecdir,
2329 install : true,
2330 install_dir : rootlibexecdir)
2331
2332 exe = executable('machinectl',
2333 'src/machine/machinectl.c',
2334 include_directories : includes,
2335 link_with : [libshared],
2336 dependencies : [threads,
2337 libxz,
2338 liblz4],
2339 install_rpath : rootlibexecdir,
2340 install : true,
2341 install_dir : rootbindir)
2342 public_programs += exe
2343 endif
2344
2345 if conf.get('ENABLE_IMPORTD') == 1
2346 executable('systemd-importd',
2347 systemd_importd_sources,
2348 include_directories : includes,
2349 link_with : [libshared],
2350 dependencies : [threads],
2351 install_rpath : rootlibexecdir,
2352 install : true,
2353 install_dir : rootlibexecdir)
2354
2355 systemd_pull = executable('systemd-pull',
2356 systemd_pull_sources,
2357 include_directories : includes,
2358 link_with : [libshared],
2359 dependencies : [versiondep,
2360 libcurl,
2361 libz,
2362 libbzip2,
2363 libxz,
2364 libgcrypt],
2365 install_rpath : rootlibexecdir,
2366 install : true,
2367 install_dir : rootlibexecdir)
2368
2369 systemd_import = executable('systemd-import',
2370 systemd_import_sources,
2371 include_directories : includes,
2372 link_with : [libshared],
2373 dependencies : [libcurl,
2374 libz,
2375 libbzip2,
2376 libxz],
2377 install_rpath : rootlibexecdir,
2378 install : true,
2379 install_dir : rootlibexecdir)
2380
2381 systemd_import_fs = executable('systemd-import-fs',
2382 systemd_import_fs_sources,
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2386 install : true,
2387 install_dir : rootlibexecdir)
2388
2389 systemd_export = executable('systemd-export',
2390 systemd_export_sources,
2391 include_directories : includes,
2392 link_with : [libshared],
2393 dependencies : [libcurl,
2394 libz,
2395 libbzip2,
2396 libxz],
2397 install_rpath : rootlibexecdir,
2398 install : true,
2399 install_dir : rootlibexecdir)
2400
2401 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2402 endif
2403
2404 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2405 exe = executable('systemd-journal-upload',
2406 systemd_journal_upload_sources,
2407 include_directories : includes,
2408 link_with : [libshared],
2409 dependencies : [versiondep,
2410 threads,
2411 libcurl,
2412 libgnutls,
2413 libxz,
2414 liblz4],
2415 install_rpath : rootlibexecdir,
2416 install : true,
2417 install_dir : rootlibexecdir)
2418 public_programs += exe
2419 endif
2420
2421 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2422 s_j_remote = executable('systemd-journal-remote',
2423 systemd_journal_remote_sources,
2424 include_directories : includes,
2425 link_with : [libshared,
2426 libsystemd_journal_remote],
2427 dependencies : [threads,
2428 libmicrohttpd,
2429 libgnutls,
2430 libxz,
2431 liblz4],
2432 install_rpath : rootlibexecdir,
2433 install : true,
2434 install_dir : rootlibexecdir)
2435
2436 s_j_gatewayd = executable('systemd-journal-gatewayd',
2437 systemd_journal_gatewayd_sources,
2438 include_directories : includes,
2439 link_with : [libshared],
2440 dependencies : [threads,
2441 libmicrohttpd,
2442 libgnutls,
2443 libxz,
2444 liblz4],
2445 install_rpath : rootlibexecdir,
2446 install : true,
2447 install_dir : rootlibexecdir)
2448 public_programs += [s_j_remote, s_j_gatewayd]
2449 endif
2450
2451 if conf.get('ENABLE_COREDUMP') == 1
2452 executable('systemd-coredump',
2453 systemd_coredump_sources,
2454 include_directories : includes,
2455 link_with : [libshared],
2456 dependencies : [threads,
2457 libacl,
2458 libdw,
2459 libxz,
2460 liblz4],
2461 install_rpath : rootlibexecdir,
2462 install : true,
2463 install_dir : rootlibexecdir)
2464
2465 exe = executable('coredumpctl',
2466 coredumpctl_sources,
2467 include_directories : includes,
2468 link_with : [libshared],
2469 dependencies : [threads,
2470 libxz,
2471 liblz4],
2472 install_rpath : rootlibexecdir,
2473 install : true)
2474 public_programs += exe
2475 endif
2476
2477 if conf.get('ENABLE_PSTORE') == 1
2478 executable('systemd-pstore',
2479 systemd_pstore_sources,
2480 include_directories : includes,
2481 link_with : [libshared],
2482 dependencies : [threads,
2483 libacl,
2484 libdw,
2485 libxz,
2486 liblz4],
2487 install_rpath : rootlibexecdir,
2488 install : true,
2489 install_dir : rootlibexecdir)
2490 endif
2491
2492 if conf.get('ENABLE_BINFMT') == 1
2493 exe = executable('systemd-binfmt',
2494 'src/binfmt/binfmt.c',
2495 include_directories : includes,
2496 link_with : [libshared],
2497 install_rpath : rootlibexecdir,
2498 install : true,
2499 install_dir : rootlibexecdir)
2500 public_programs += exe
2501
2502 meson.add_install_script('sh', '-c',
2503 mkdir_p.format(binfmtdir))
2504 meson.add_install_script('sh', '-c',
2505 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2506 endif
2507
2508 if conf.get('ENABLE_REPART') == 1
2509 executable('systemd-repart',
2510 systemd_repart_sources,
2511 include_directories : includes,
2512 link_with : [libshared],
2513 dependencies : [threads,
2514 libcryptsetup,
2515 libblkid,
2516 libfdisk,
2517 libopenssl],
2518 install_rpath : rootlibexecdir,
2519 install : true,
2520 install_dir : rootbindir)
2521 endif
2522
2523 if conf.get('ENABLE_VCONSOLE') == 1
2524 executable('systemd-vconsole-setup',
2525 'src/vconsole/vconsole-setup.c',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 install_rpath : rootlibexecdir,
2529 install : true,
2530 install_dir : rootlibexecdir)
2531 endif
2532
2533 if conf.get('ENABLE_RANDOMSEED') == 1
2534 executable('systemd-random-seed',
2535 'src/random-seed/random-seed.c',
2536 include_directories : includes,
2537 link_with : [libshared],
2538 install_rpath : rootlibexecdir,
2539 install : true,
2540 install_dir : rootlibexecdir)
2541 endif
2542
2543 if conf.get('ENABLE_FIRSTBOOT') == 1
2544 executable('systemd-firstboot',
2545 'src/firstboot/firstboot.c',
2546 include_directories : includes,
2547 link_with : [libshared],
2548 dependencies : [libcrypt],
2549 install_rpath : rootlibexecdir,
2550 install : true,
2551 install_dir : rootbindir)
2552 endif
2553
2554 executable('systemd-remount-fs',
2555 'src/remount-fs/remount-fs.c',
2556 include_directories : includes,
2557 link_with : [libcore_shared,
2558 libshared],
2559 install_rpath : rootlibexecdir,
2560 install : true,
2561 install_dir : rootlibexecdir)
2562
2563 executable('systemd-machine-id-setup',
2564 'src/machine-id-setup/machine-id-setup-main.c',
2565 include_directories : includes,
2566 link_with : [libcore_shared,
2567 libshared],
2568 install_rpath : rootlibexecdir,
2569 install : true,
2570 install_dir : rootbindir)
2571
2572 executable('systemd-fsck',
2573 'src/fsck/fsck.c',
2574 include_directories : includes,
2575 link_with : [libshared],
2576 install_rpath : rootlibexecdir,
2577 install : true,
2578 install_dir : rootlibexecdir)
2579
2580 executable('systemd-growfs',
2581 'src/partition/growfs.c',
2582 include_directories : includes,
2583 link_with : [libshared],
2584 dependencies : [libcryptsetup],
2585 install_rpath : rootlibexecdir,
2586 install : true,
2587 install_dir : rootlibexecdir)
2588
2589 executable('systemd-makefs',
2590 'src/partition/makefs.c',
2591 include_directories : includes,
2592 link_with : [libshared],
2593 install_rpath : rootlibexecdir,
2594 install : true,
2595 install_dir : rootlibexecdir)
2596
2597 executable('systemd-sleep',
2598 'src/sleep/sleep.c',
2599 include_directories : includes,
2600 link_with : [libshared],
2601 install_rpath : rootlibexecdir,
2602 install : true,
2603 install_dir : rootlibexecdir)
2604
2605 install_data('src/sleep/sleep.conf',
2606 install_dir : pkgsysconfdir)
2607
2608 exe = executable('systemd-sysctl',
2609 'src/sysctl/sysctl.c',
2610 include_directories : includes,
2611 link_with : [libshared],
2612 install_rpath : rootlibexecdir,
2613 install : true,
2614 install_dir : rootlibexecdir)
2615 public_programs += exe
2616
2617 executable('systemd-ac-power',
2618 'src/ac-power/ac-power.c',
2619 include_directories : includes,
2620 link_with : [libshared],
2621 install_rpath : rootlibexecdir,
2622 install : true,
2623 install_dir : rootlibexecdir)
2624
2625 exe = executable('systemd-detect-virt',
2626 'src/detect-virt/detect-virt.c',
2627 include_directories : includes,
2628 link_with : [libshared],
2629 install_rpath : rootlibexecdir,
2630 install : true)
2631 public_programs += exe
2632
2633 exe = executable('systemd-delta',
2634 'src/delta/delta.c',
2635 include_directories : includes,
2636 link_with : [libshared],
2637 install_rpath : rootlibexecdir,
2638 install : true)
2639 public_programs += exe
2640
2641 exe = executable('systemd-escape',
2642 'src/escape/escape.c',
2643 include_directories : includes,
2644 link_with : [libshared],
2645 install_rpath : rootlibexecdir,
2646 install : true,
2647 install_dir : rootbindir)
2648 public_programs += exe
2649
2650 exe = executable('systemd-notify',
2651 'src/notify/notify.c',
2652 include_directories : includes,
2653 link_with : [libshared],
2654 install_rpath : rootlibexecdir,
2655 install : true,
2656 install_dir : rootbindir)
2657 public_programs += exe
2658
2659 executable('systemd-volatile-root',
2660 'src/volatile-root/volatile-root.c',
2661 include_directories : includes,
2662 link_with : [libshared],
2663 install_rpath : rootlibexecdir,
2664 install : true,
2665 install_dir : rootlibexecdir)
2666
2667 executable('systemd-cgroups-agent',
2668 'src/cgroups-agent/cgroups-agent.c',
2669 include_directories : includes,
2670 link_with : [libshared],
2671 install_rpath : rootlibexecdir,
2672 install : true,
2673 install_dir : rootlibexecdir)
2674
2675 exe = executable('systemd-id128',
2676 'src/id128/id128.c',
2677 include_directories : includes,
2678 link_with : [libshared],
2679 install_rpath : rootlibexecdir,
2680 install : true)
2681 public_programs += exe
2682
2683 exe = executable('systemd-path',
2684 'src/path/path.c',
2685 include_directories : includes,
2686 link_with : [libshared],
2687 install_rpath : rootlibexecdir,
2688 install : true)
2689 public_programs += exe
2690
2691 exe = executable('systemd-ask-password',
2692 'src/ask-password/ask-password.c',
2693 include_directories : includes,
2694 link_with : [libshared],
2695 install_rpath : rootlibexecdir,
2696 install : true,
2697 install_dir : rootbindir)
2698 public_programs += exe
2699
2700 executable('systemd-reply-password',
2701 'src/reply-password/reply-password.c',
2702 include_directories : includes,
2703 link_with : [libshared],
2704 install_rpath : rootlibexecdir,
2705 install : true,
2706 install_dir : rootlibexecdir)
2707
2708 exe = executable('systemd-tty-ask-password-agent',
2709 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2710 include_directories : includes,
2711 link_with : [libshared],
2712 install_rpath : rootlibexecdir,
2713 install : true,
2714 install_dir : rootbindir)
2715 public_programs += exe
2716
2717 exe = executable('systemd-cgls',
2718 'src/cgls/cgls.c',
2719 include_directories : includes,
2720 link_with : [libshared],
2721 install_rpath : rootlibexecdir,
2722 install : true)
2723 public_programs += exe
2724
2725 exe = executable('systemd-cgtop',
2726 'src/cgtop/cgtop.c',
2727 include_directories : includes,
2728 link_with : [libshared],
2729 install_rpath : rootlibexecdir,
2730 install : true)
2731 public_programs += exe
2732
2733 executable('systemd-initctl',
2734 'src/initctl/initctl.c',
2735 include_directories : includes,
2736 link_with : [libshared],
2737 install_rpath : rootlibexecdir,
2738 install : true,
2739 install_dir : rootlibexecdir)
2740
2741 exe = executable('systemd-mount',
2742 'src/mount/mount-tool.c',
2743 include_directories : includes,
2744 link_with : [libshared],
2745 dependencies: [libmount],
2746 install_rpath : rootlibexecdir,
2747 install : true)
2748 public_programs += exe
2749
2750 meson.add_install_script(meson_make_symlink,
2751 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2752
2753 exe = executable('systemd-run',
2754 'src/run/run.c',
2755 include_directories : includes,
2756 link_with : [libshared],
2757 install_rpath : rootlibexecdir,
2758 install : true)
2759 public_programs += exe
2760
2761 exe = executable('systemd-stdio-bridge',
2762 'src/stdio-bridge/stdio-bridge.c',
2763 include_directories : includes,
2764 link_with : [libshared],
2765 dependencies : [versiondep],
2766 install_rpath : rootlibexecdir,
2767 install : true)
2768 public_programs += exe
2769
2770 exe = executable('busctl',
2771 'src/busctl/busctl.c',
2772 'src/busctl/busctl-introspect.c',
2773 'src/busctl/busctl-introspect.h',
2774 include_directories : includes,
2775 link_with : [libshared],
2776 install_rpath : rootlibexecdir,
2777 install : true)
2778 public_programs += exe
2779
2780 if conf.get('ENABLE_SYSUSERS') == 1
2781 exe = executable('systemd-sysusers',
2782 'src/sysusers/sysusers.c',
2783 include_directories : includes,
2784 link_with : [libshared],
2785 install_rpath : rootlibexecdir,
2786 install : true,
2787 install_dir : rootbindir)
2788 public_programs += exe
2789 endif
2790
2791 if conf.get('ENABLE_TMPFILES') == 1
2792 exe = executable('systemd-tmpfiles',
2793 'src/tmpfiles/tmpfiles.c',
2794 include_directories : includes,
2795 link_with : [libshared],
2796 dependencies : [libacl],
2797 install_rpath : rootlibexecdir,
2798 install : true,
2799 install_dir : rootbindir)
2800 public_programs += exe
2801
2802 if want_tests != 'false'
2803 test('test-systemd-tmpfiles',
2804 test_systemd_tmpfiles_py,
2805 # https://github.com/mesonbuild/meson/issues/2681
2806 args : exe.full_path())
2807 endif
2808 endif
2809
2810 if conf.get('ENABLE_HWDB') == 1
2811 exe = executable('systemd-hwdb',
2812 'src/hwdb/hwdb.c',
2813 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2814 include_directories : includes,
2815 link_with : [libudev_static],
2816 install_rpath : udev_rpath,
2817 install : true,
2818 install_dir : rootbindir)
2819 public_programs += exe
2820 endif
2821
2822 if conf.get('ENABLE_QUOTACHECK') == 1
2823 executable('systemd-quotacheck',
2824 'src/quotacheck/quotacheck.c',
2825 include_directories : includes,
2826 link_with : [libshared],
2827 install_rpath : rootlibexecdir,
2828 install : true,
2829 install_dir : rootlibexecdir)
2830 endif
2831
2832 exe = executable('systemd-socket-proxyd',
2833 'src/socket-proxy/socket-proxyd.c',
2834 include_directories : includes,
2835 link_with : [libshared],
2836 dependencies : [threads],
2837 install_rpath : rootlibexecdir,
2838 install : true,
2839 install_dir : rootlibexecdir)
2840 public_programs += exe
2841
2842 exe = executable('systemd-udevd',
2843 systemd_udevd_sources,
2844 include_directories : includes,
2845 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2846 link_with : [libudev_core,
2847 libsystemd_network,
2848 libudev_static],
2849 dependencies : [versiondep,
2850 threads,
2851 libkmod,
2852 libidn,
2853 libacl,
2854 libblkid],
2855 install_rpath : udev_rpath,
2856 install : true,
2857 install_dir : rootlibexecdir)
2858 public_programs += exe
2859
2860 exe = executable('udevadm',
2861 udevadm_sources,
2862 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2863 include_directories : includes,
2864 link_with : [libudev_core,
2865 libsystemd_network,
2866 libudev_static],
2867 dependencies : [versiondep,
2868 threads,
2869 libkmod,
2870 libidn,
2871 libacl,
2872 libblkid],
2873 install_rpath : udev_rpath,
2874 install : true,
2875 install_dir : rootbindir)
2876 public_programs += exe
2877
2878 executable('systemd-shutdown',
2879 systemd_shutdown_sources,
2880 include_directories : includes,
2881 link_with : [libcore_shared,
2882 libshared],
2883 dependencies : [libmount],
2884 install_rpath : rootlibexecdir,
2885 install : true,
2886 install_dir : rootlibexecdir)
2887
2888 executable('systemd-update-done',
2889 'src/update-done/update-done.c',
2890 include_directories : includes,
2891 link_with : [libshared],
2892 install_rpath : rootlibexecdir,
2893 install : true,
2894 install_dir : rootlibexecdir)
2895
2896 executable('systemd-update-utmp',
2897 'src/update-utmp/update-utmp.c',
2898 include_directories : includes,
2899 link_with : [libshared],
2900 dependencies : [libaudit],
2901 install_rpath : rootlibexecdir,
2902 install : true,
2903 install_dir : rootlibexecdir)
2904
2905 if conf.get('HAVE_KMOD') == 1
2906 executable('systemd-modules-load',
2907 'src/modules-load/modules-load.c',
2908 include_directories : includes,
2909 link_with : [libshared],
2910 dependencies : [libkmod],
2911 install_rpath : rootlibexecdir,
2912 install : true,
2913 install_dir : rootlibexecdir)
2914
2915 meson.add_install_script('sh', '-c',
2916 mkdir_p.format(modulesloaddir))
2917 meson.add_install_script('sh', '-c',
2918 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2919 endif
2920
2921 exe = executable('systemd-nspawn',
2922 systemd_nspawn_sources,
2923 include_directories : includes,
2924 link_with : [libcore_shared,
2925 libnspawn_core,
2926 libshared],
2927 dependencies : [libblkid,
2928 libseccomp],
2929 install_rpath : rootlibexecdir,
2930 install : true)
2931 public_programs += exe
2932
2933 if conf.get('ENABLE_NETWORKD') == 1
2934 executable('systemd-networkd',
2935 systemd_networkd_sources,
2936 include_directories : network_include_dir,
2937 link_with : [libnetworkd_core,
2938 libsystemd_network,
2939 libudev_static,
2940 networkd_link_with],
2941 dependencies : [threads],
2942 install_rpath : rootlibexecdir,
2943 install : true,
2944 install_dir : rootlibexecdir)
2945
2946 executable('systemd-networkd-wait-online',
2947 systemd_networkd_wait_online_sources,
2948 include_directories : includes,
2949 link_with : [libnetworkd_core,
2950 networkd_link_with],
2951 install_rpath : rootlibexecdir,
2952 install : true,
2953 install_dir : rootlibexecdir)
2954
2955 exe = executable('networkctl',
2956 networkctl_sources,
2957 include_directories : includes,
2958 link_with : [libsystemd_network,
2959 networkd_link_with],
2960 install_rpath : rootlibexecdir,
2961 install : true,
2962 install_dir : rootbindir)
2963 public_programs += exe
2964
2965 executable('systemd-network-generator',
2966 network_generator_sources,
2967 include_directories : includes,
2968 link_with : [networkd_link_with],
2969 install_rpath : rootlibexecdir,
2970 install : true,
2971 install_dir : rootlibexecdir)
2972 endif
2973
2974 executable('systemd-sulogin-shell',
2975 ['src/sulogin-shell/sulogin-shell.c'],
2976 include_directories : includes,
2977 link_with : [libshared],
2978 install_rpath : rootlibexecdir,
2979 install : true,
2980 install_dir : rootlibexecdir)
2981
2982 ############################################################
2983
2984 custom_target(
2985 'systemd-runtest.env',
2986 output : 'systemd-runtest.env',
2987 command : ['sh', '-c', '{ ' +
2988 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2989 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2990 '} >@OUTPUT@'],
2991 build_by_default : true)
2992
2993 foreach tuple : tests
2994 sources = tuple[0]
2995 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2996 dependencies = tuple[2]
2997 condition = tuple.length() >= 4 ? tuple[3] : ''
2998 type = tuple.length() >= 5 ? tuple[4] : ''
2999 defs = tuple.length() >= 6 ? tuple[5] : []
3000 incs = tuple.length() >= 7 ? tuple[6] : includes
3001 timeout = 30
3002
3003 name = sources[0].split('/')[-1].split('.')[0]
3004 if type.startswith('timeout=')
3005 timeout = type.split('=')[1].to_int()
3006 type = ''
3007 endif
3008
3009 if condition == '' or conf.get(condition) == 1
3010 exe = executable(
3011 name,
3012 sources,
3013 include_directories : incs,
3014 link_with : link_with,
3015 dependencies : [versiondep,
3016 dependencies],
3017 c_args : defs,
3018 build_by_default : want_tests != 'false',
3019 install_rpath : rootlibexecdir,
3020 install : install_tests,
3021 install_dir : join_paths(testsdir, type))
3022
3023 if type == 'manual'
3024 message('@0@ is a manual test'.format(name))
3025 elif type == 'unsafe' and want_tests != 'unsafe'
3026 message('@0@ is an unsafe test'.format(name))
3027 elif want_tests != 'false'
3028 test(name, exe,
3029 env : test_env,
3030 timeout : timeout)
3031 endif
3032 else
3033 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3034 endif
3035 endforeach
3036
3037 exe = executable(
3038 'test-libsystemd-sym',
3039 test_libsystemd_sym_c,
3040 include_directories : includes,
3041 link_with : [libsystemd],
3042 build_by_default : want_tests != 'false',
3043 install : install_tests,
3044 install_dir : testsdir)
3045 if want_tests != 'false'
3046 test('test-libsystemd-sym', exe)
3047 endif
3048
3049 exe = executable(
3050 'test-libsystemd-static-sym',
3051 test_libsystemd_sym_c,
3052 include_directories : includes,
3053 link_with : [install_libsystemd_static],
3054 dependencies : [threads], # threads is already included in dependencies on the library,
3055 # but does not seem to get propagated. Add here as a work-around.
3056 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3057 install : install_tests and static_libsystemd_pic,
3058 install_dir : testsdir)
3059 if want_tests != 'false' and static_libsystemd_pic
3060 test('test-libsystemd-static-sym', exe)
3061 endif
3062
3063 exe = executable(
3064 'test-libudev-sym',
3065 test_libudev_sym_c,
3066 include_directories : includes,
3067 c_args : '-Wno-deprecated-declarations',
3068 link_with : [libudev],
3069 build_by_default : want_tests != 'false',
3070 install : install_tests,
3071 install_dir : testsdir)
3072 if want_tests != 'false'
3073 test('test-libudev-sym', exe)
3074 endif
3075
3076 exe = executable(
3077 'test-libudev-static-sym',
3078 test_libudev_sym_c,
3079 include_directories : includes,
3080 c_args : '-Wno-deprecated-declarations',
3081 link_with : [install_libudev_static],
3082 build_by_default : want_tests != 'false' and static_libudev_pic,
3083 install : install_tests and static_libudev_pic,
3084 install_dir : testsdir)
3085 if want_tests != 'false' and static_libudev_pic
3086 test('test-libudev-static-sym', exe)
3087 endif
3088
3089 ############################################################
3090
3091 fuzzer_exes = []
3092
3093 if get_option('tests') != 'false'
3094 foreach tuple : fuzzers
3095 sources = tuple[0]
3096 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3097 dependencies = tuple[2]
3098 defs = tuple.length() >= 4 ? tuple[3] : []
3099 incs = tuple.length() >= 5 ? tuple[4] : includes
3100 link_args = []
3101
3102 if want_ossfuzz or want_fuzzbuzz
3103 dependencies += fuzzing_engine
3104 elif want_libfuzzer
3105 if fuzzing_engine.found()
3106 dependencies += fuzzing_engine
3107 else
3108 link_args += ['-fsanitize=fuzzer']
3109 endif
3110 else
3111 sources += 'src/fuzz/fuzz-main.c'
3112 endif
3113
3114 if want_fuzzbuzz
3115 sources += 'src/fuzz/fuzzer-entry-point.c'
3116 endif
3117
3118 name = sources[0].split('/')[-1].split('.')[0]
3119
3120 fuzzer_exes += executable(
3121 name,
3122 sources,
3123 include_directories : [incs, include_directories('src/fuzz')],
3124 link_with : link_with,
3125 dependencies : dependencies,
3126 c_args : defs,
3127 link_args: link_args,
3128 install : false)
3129 endforeach
3130 endif
3131
3132 run_target('fuzzers',
3133 depends : fuzzer_exes,
3134 command : ['true'])
3135
3136 ############################################################
3137
3138 make_directive_index_py = find_program('tools/make-directive-index.py')
3139 make_man_index_py = find_program('tools/make-man-index.py')
3140 xml_helper_py = find_program('tools/xml_helper.py')
3141 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3142 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3143
3144 subdir('sysctl.d')
3145 subdir('sysusers.d')
3146 subdir('tmpfiles.d')
3147 subdir('hwdb.d')
3148 subdir('units')
3149 subdir('presets')
3150 subdir('network')
3151 subdir('man')
3152 subdir('shell-completion/bash')
3153 subdir('shell-completion/zsh')
3154 subdir('docs/sysvinit')
3155 subdir('docs/var-log')
3156
3157 install_subdir('factory/etc',
3158 install_dir : factorydir)
3159
3160 install_data('xorg/50-systemd-user.sh',
3161 install_dir : xinitrcdir)
3162 install_data('modprobe.d/systemd.conf',
3163 install_dir : modprobedir)
3164 install_data('LICENSE.GPL2',
3165 'LICENSE.LGPL2.1',
3166 'NEWS',
3167 'README',
3168 'docs/CODING_STYLE.md',
3169 'docs/DISTRO_PORTING.md',
3170 'docs/ENVIRONMENT.md',
3171 'docs/HACKING.md',
3172 'docs/TRANSIENT-SETTINGS.md',
3173 'docs/TRANSLATORS.md',
3174 'docs/UIDS-GIDS.md',
3175 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3176 install_dir : docdir)
3177
3178 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3179 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3180
3181 ############################################################
3182
3183 meson_check_help = find_program('tools/meson-check-help.sh')
3184
3185 foreach exec : public_programs
3186 name = exec.full_path().split('/')[-1]
3187 if want_tests != 'false'
3188 test('check-help-' + name,
3189 meson_check_help,
3190 args : exec.full_path())
3191 endif
3192 endforeach
3193
3194 ############################################################
3195
3196 check_directives_sh = find_program('tools/check-directives.sh')
3197
3198 if want_tests != 'false'
3199 test('check-directives',
3200 check_directives_sh,
3201 args : project_source_root)
3202 endif
3203
3204 ############################################################
3205
3206 # Enable tests for all supported sanitizers
3207 foreach tuple : sanitizers
3208 sanitizer = tuple[0]
3209 build = tuple[1]
3210
3211 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3212 prev = ''
3213 foreach p : fuzz_regression_tests
3214 b = p.split('/')[-2]
3215 c = p.split('/')[-1]
3216
3217 name = '@0@:@1@'.format(b, sanitizer)
3218
3219 if name != prev
3220 if want_tests == 'false'
3221 message('Not compiling @0@ because tests is set to false'.format(name))
3222 elif slow_tests
3223 exe = custom_target(
3224 name,
3225 output : name,
3226 depends : build,
3227 command : [env, 'ln', '-fs',
3228 join_paths(build.full_path(), b),
3229 '@OUTPUT@'],
3230 build_by_default : true)
3231 else
3232 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3233 endif
3234 endif
3235 prev = name
3236
3237 if want_tests != 'false' and slow_tests
3238 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3239 env,
3240 args : [exe.full_path(),
3241 join_paths(project_source_root, p)])
3242 endif
3243 endforeach
3244 endif
3245 endforeach
3246
3247
3248 ############################################################
3249
3250 if git.found()
3251 all_files = run_command(
3252 git,
3253 ['--git-dir=@0@/.git'.format(project_source_root),
3254 'ls-files',
3255 ':/*.[ch]'])
3256 all_files = files(all_files.stdout().split())
3257
3258 custom_target(
3259 'tags',
3260 output : 'tags',
3261 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3262 run_target(
3263 'ctags',
3264 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3265 endif
3266
3267 if git.found()
3268 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3269 run_target(
3270 'git-contrib',
3271 command : [meson_git_contrib_sh])
3272 endif
3273
3274 if git.found()
3275 git_head = run_command(
3276 git,
3277 ['--git-dir=@0@/.git'.format(project_source_root),
3278 'rev-parse', 'HEAD']).stdout().strip()
3279 git_head_short = run_command(
3280 git,
3281 ['--git-dir=@0@/.git'.format(project_source_root),
3282 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3283
3284 run_target(
3285 'git-snapshot',
3286 command : ['git', 'archive',
3287 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3288 git_head_short),
3289 '--prefix', 'systemd-@0@/'.format(git_head),
3290 'HEAD'])
3291 endif
3292
3293 ############################################################
3294
3295 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3296 run_target(
3297 'check-api-docs',
3298 depends : [man, libsystemd, libudev],
3299 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3300
3301 ############################################################
3302 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3303
3304 status = [
3305 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3306
3307 'split /usr: @0@'.format(split_usr),
3308 'split bin-sbin: @0@'.format(split_bin),
3309 'prefix directory: @0@'.format(prefixdir),
3310 'rootprefix directory: @0@'.format(rootprefixdir),
3311 'sysconf directory: @0@'.format(sysconfdir),
3312 'include directory: @0@'.format(includedir),
3313 'lib directory: @0@'.format(libdir),
3314 'rootlib directory: @0@'.format(rootlibdir),
3315 'SysV init scripts: @0@'.format(sysvinit_path),
3316 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3317 'PAM modules directory: @0@'.format(pamlibdir),
3318 'PAM configuration directory: @0@'.format(pamconfdir),
3319 'RPM macros directory: @0@'.format(rpmmacrosdir),
3320 'modprobe.d directory: @0@'.format(modprobedir),
3321 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3322 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3323 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3324 'bash completions directory: @0@'.format(bashcompletiondir),
3325 'zsh completions directory: @0@'.format(zshcompletiondir),
3326 'extra start script: @0@'.format(get_option('rc-local')),
3327 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3328 get_option('debug-tty')),
3329 'TTY GID: @0@'.format(tty_gid),
3330 'users GID: @0@'.format(substs.get('USERS_GID')),
3331 'maximum system UID: @0@'.format(system_uid_max),
3332 'maximum system GID: @0@'.format(system_gid_max),
3333 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3334 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3335 'minimum container UID base: @0@'.format(container_uid_base_min),
3336 'maximum container UID base: @0@'.format(container_uid_base_max),
3337 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3338 'render group access mode: @0@'.format(get_option('group-render-mode')),
3339 'certificate root directory: @0@'.format(get_option('certificate-root')),
3340 'support URL: @0@'.format(support_url),
3341 'nobody user name: @0@'.format(nobody_user),
3342 'nobody group name: @0@'.format(nobody_group),
3343 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3344 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3345
3346 'default DNSSEC mode: @0@'.format(default_dnssec),
3347 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3348 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3349 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3350 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3351 'default locale: @0@'.format(default_locale),
3352 'default user $PATH: @0@'.format(default_user_path_display),
3353 'systemd service watchdog: @0@'.format(watchdog_opt)]
3354
3355 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3356 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3357 status += [
3358 'default DNS servers: @0@'.format(alt_dns_servers),
3359 'default NTP servers: @0@'.format(alt_ntp_servers)]
3360
3361 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3362 '@@0@'.format(time_epoch)).stdout().strip()
3363 status += [
3364 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3365
3366 status += [
3367 'static libsystemd: @0@'.format(static_libsystemd),
3368 'static libudev: @0@'.format(static_libudev)]
3369
3370 # TODO:
3371 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3372 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3373 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3374
3375 if conf.get('ENABLE_EFI') == 1
3376 status += 'efi arch: @0@'.format(efi_arch)
3377
3378 if have_gnu_efi
3379 status += [
3380 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3381 'EFI CC @0@'.format(' '.join(efi_cc)),
3382 'EFI lds: @0@'.format(efi_lds),
3383 'EFI crt0: @0@'.format(efi_crt0),
3384 'EFI include directory: @0@'.format(efi_incdir)]
3385 endif
3386 endif
3387
3388 found = []
3389 missing = []
3390
3391 foreach tuple : [
3392 ['libcryptsetup'],
3393 ['PAM'],
3394 ['pwquality'],
3395 ['libfdisk'],
3396 ['p11kit'],
3397 ['AUDIT'],
3398 ['IMA'],
3399 ['AppArmor'],
3400 ['SELinux'],
3401 ['SECCOMP'],
3402 ['SMACK'],
3403 ['zlib'],
3404 ['xz'],
3405 ['lz4'],
3406 ['bzip2'],
3407 ['ACL'],
3408 ['gcrypt'],
3409 ['qrencode'],
3410 ['microhttpd'],
3411 ['gnutls'],
3412 ['openssl'],
3413 ['libcurl'],
3414 ['idn'],
3415 ['libidn2'],
3416 ['libidn'],
3417 ['libiptc'],
3418 ['elfutils'],
3419 ['binfmt'],
3420 ['repart'],
3421 ['vconsole'],
3422 ['quotacheck'],
3423 ['tmpfiles'],
3424 ['environment.d'],
3425 ['sysusers'],
3426 ['firstboot'],
3427 ['randomseed'],
3428 ['backlight'],
3429 ['rfkill'],
3430 ['logind'],
3431 ['machined'],
3432 ['portabled'],
3433 ['userdb'],
3434 ['homed'],
3435 ['importd'],
3436 ['hostnamed'],
3437 ['timedated'],
3438 ['timesyncd'],
3439 ['localed'],
3440 ['networkd'],
3441 ['resolve'],
3442 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3443 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3444 ['coredump'],
3445 ['pstore'],
3446 ['polkit'],
3447 ['legacy pkla', install_polkit_pkla],
3448 ['efi'],
3449 ['gnu-efi', have_gnu_efi],
3450 ['kmod'],
3451 ['xkbcommon'],
3452 ['pcre2'],
3453 ['blkid'],
3454 ['dbus'],
3455 ['glib'],
3456 ['nss-myhostname'],
3457 ['nss-mymachines'],
3458 ['nss-resolve'],
3459 ['nss-systemd'],
3460 ['hwdb'],
3461 ['tpm'],
3462 ['man pages', want_man],
3463 ['html pages', want_html],
3464 ['man page indices', want_man and have_lxml],
3465 ['SysV compat'],
3466 ['utmp'],
3467 ['ldconfig'],
3468 ['hibernate'],
3469 ['adm group', get_option('adm-group')],
3470 ['wheel group', get_option('wheel-group')],
3471 ['gshadow'],
3472 ['debug hashmap'],
3473 ['debug mmap cache'],
3474 ['debug siphash'],
3475 ['valgrind', conf.get('VALGRIND') == 1],
3476 ['trace logging', conf.get('LOG_TRACE') == 1],
3477 ['link-udev-shared', get_option('link-udev-shared')],
3478 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3479 ['link-networkd-shared', get_option('link-networkd-shared')],
3480 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3481 ]
3482
3483 if tuple.length() >= 2
3484 cond = tuple[1]
3485 else
3486 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3487 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3488 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3489 endif
3490 if cond
3491 found += tuple[0]
3492 else
3493 missing += tuple[0]
3494 endif
3495 endforeach
3496
3497 status += [
3498 '',
3499 'enabled features: @0@'.format(', '.join(found)),
3500 '',
3501 'disabled features: @0@'.format(', '.join(missing)),
3502 '']
3503 message('\n '.join(status))
3504
3505 if rootprefixdir != rootprefix_default
3506 warning('\n' +
3507 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3508 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3509 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3510 endif