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