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