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