]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
Merge pull request #14696 from poettering/dissect-tweaks
[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
2093 executable('homectl',
2094 homectl_sources,
2095 include_directories : includes,
2096 link_with : [libshared],
2097 dependencies : [threads,
2098 libcrypt,
2099 libopenssl,
2100 libp11kit,
2101 libpwquality],
2102 install_rpath : rootlibexecdir,
2103 install : true,
2104 install_dir : rootbindir)
2105
2106 if conf.get('HAVE_PAM') == 1
2107 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2108 pam_systemd = shared_library(
2109 'pam_systemd_home',
2110 pam_systemd_home_c,
2111 name_prefix : '',
2112 include_directories : includes,
2113 link_args : ['-shared',
2114 '-Wl,--version-script=' + version_script_arg],
2115 link_with : [libsystemd_static,
2116 libshared_static],
2117 dependencies : [threads,
2118 libpam,
2119 libpam_misc,
2120 libcrypt],
2121 link_depends : pam_systemd_home_sym,
2122 install : true,
2123 install_dir : pamlibdir)
2124 endif
2125 endif
2126
2127 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2128 meson.add_install_script(meson_make_symlink,
2129 join_paths(rootbindir, 'systemctl'),
2130 join_paths(rootsbindir, alias))
2131 endforeach
2132
2133 if conf.get('ENABLE_BACKLIGHT') == 1
2134 executable('systemd-backlight',
2135 'src/backlight/backlight.c',
2136 include_directories : includes,
2137 link_with : [libshared],
2138 install_rpath : rootlibexecdir,
2139 install : true,
2140 install_dir : rootlibexecdir)
2141 endif
2142
2143 if conf.get('ENABLE_RFKILL') == 1
2144 executable('systemd-rfkill',
2145 'src/rfkill/rfkill.c',
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2149 install : true,
2150 install_dir : rootlibexecdir)
2151 endif
2152
2153 executable('systemd-system-update-generator',
2154 'src/system-update-generator/system-update-generator.c',
2155 include_directories : includes,
2156 link_with : [libshared],
2157 install_rpath : rootlibexecdir,
2158 install : true,
2159 install_dir : systemgeneratordir)
2160
2161 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2162 systemd_cryptsetup_sources = files('''
2163 src/cryptsetup/cryptsetup.c
2164 src/cryptsetup/cryptsetup-pkcs11.h
2165 '''.split())
2166
2167 if conf.get('HAVE_P11KIT') == 1
2168 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2169 endif
2170
2171 executable('systemd-cryptsetup',
2172 systemd_cryptsetup_sources,
2173 include_directories : includes,
2174 link_with : [libshared],
2175 dependencies : [libcryptsetup,
2176 libp11kit],
2177 install_rpath : rootlibexecdir,
2178 install : true,
2179 install_dir : rootlibexecdir)
2180
2181 executable('systemd-cryptsetup-generator',
2182 'src/cryptsetup/cryptsetup-generator.c',
2183 include_directories : includes,
2184 link_with : [libshared],
2185 dependencies : [libcryptsetup],
2186 install_rpath : rootlibexecdir,
2187 install : true,
2188 install_dir : systemgeneratordir)
2189
2190 executable('systemd-veritysetup',
2191 'src/veritysetup/veritysetup.c',
2192 include_directories : includes,
2193 link_with : [libshared],
2194 dependencies : [libcryptsetup],
2195 install_rpath : rootlibexecdir,
2196 install : true,
2197 install_dir : rootlibexecdir)
2198
2199 executable('systemd-veritysetup-generator',
2200 'src/veritysetup/veritysetup-generator.c',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 dependencies : [libcryptsetup],
2204 install_rpath : rootlibexecdir,
2205 install : true,
2206 install_dir : systemgeneratordir)
2207 endif
2208
2209 if conf.get('HAVE_SYSV_COMPAT') == 1
2210 executable('systemd-sysv-generator',
2211 'src/sysv-generator/sysv-generator.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2215 install : true,
2216 install_dir : systemgeneratordir)
2217
2218 executable('systemd-rc-local-generator',
2219 'src/rc-local-generator/rc-local-generator.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2223 install : true,
2224 install_dir : systemgeneratordir)
2225 endif
2226
2227 if conf.get('ENABLE_HOSTNAMED') == 1
2228 executable('systemd-hostnamed',
2229 'src/hostname/hostnamed.c',
2230 include_directories : includes,
2231 link_with : [libshared],
2232 install_rpath : rootlibexecdir,
2233 install : true,
2234 install_dir : rootlibexecdir)
2235
2236 exe = executable('hostnamectl',
2237 'src/hostname/hostnamectl.c',
2238 include_directories : includes,
2239 link_with : [libshared],
2240 install_rpath : rootlibexecdir,
2241 install : true)
2242 public_programs += exe
2243 endif
2244
2245 if conf.get('ENABLE_LOCALED') == 1
2246 if conf.get('HAVE_XKBCOMMON') == 1
2247 # logind will load libxkbcommon.so dynamically on its own
2248 deps = [libdl]
2249 else
2250 deps = []
2251 endif
2252
2253 executable('systemd-localed',
2254 systemd_localed_sources,
2255 include_directories : includes,
2256 link_with : [libshared],
2257 dependencies : deps,
2258 install_rpath : rootlibexecdir,
2259 install : true,
2260 install_dir : rootlibexecdir)
2261
2262 exe = executable('localectl',
2263 localectl_sources,
2264 include_directories : includes,
2265 link_with : [libshared],
2266 install_rpath : rootlibexecdir,
2267 install : true)
2268 public_programs += exe
2269 endif
2270
2271 if conf.get('ENABLE_TIMEDATED') == 1
2272 executable('systemd-timedated',
2273 'src/timedate/timedated.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2277 install : true,
2278 install_dir : rootlibexecdir)
2279 endif
2280
2281 if conf.get('ENABLE_TIMEDATECTL') == 1
2282 exe = executable('timedatectl',
2283 'src/timedate/timedatectl.c',
2284 include_directories : includes,
2285 install_rpath : rootlibexecdir,
2286 link_with : [libshared],
2287 dependencies : [libm],
2288 install : true)
2289 public_programs += exe
2290 endif
2291
2292 if conf.get('ENABLE_TIMESYNCD') == 1
2293 executable('systemd-timesyncd',
2294 systemd_timesyncd_sources,
2295 include_directories : includes,
2296 link_with : [libshared],
2297 dependencies : [threads,
2298 libm],
2299 install_rpath : rootlibexecdir,
2300 install : true,
2301 install_dir : rootlibexecdir)
2302
2303 executable('systemd-time-wait-sync',
2304 'src/time-wait-sync/time-wait-sync.c',
2305 include_directories : includes,
2306 link_with : [libshared],
2307 install_rpath : rootlibexecdir,
2308 install : true,
2309 install_dir : rootlibexecdir)
2310 endif
2311
2312 if conf.get('ENABLE_MACHINED') == 1
2313 executable('systemd-machined',
2314 systemd_machined_sources,
2315 include_directories : includes,
2316 link_with : [libmachine_core,
2317 libshared],
2318 install_rpath : rootlibexecdir,
2319 install : true,
2320 install_dir : rootlibexecdir)
2321
2322 exe = executable('machinectl',
2323 'src/machine/machinectl.c',
2324 include_directories : includes,
2325 link_with : [libshared],
2326 dependencies : [threads,
2327 libxz,
2328 liblz4],
2329 install_rpath : rootlibexecdir,
2330 install : true,
2331 install_dir : rootbindir)
2332 public_programs += exe
2333 endif
2334
2335 if conf.get('ENABLE_IMPORTD') == 1
2336 executable('systemd-importd',
2337 systemd_importd_sources,
2338 include_directories : includes,
2339 link_with : [libshared],
2340 dependencies : [threads],
2341 install_rpath : rootlibexecdir,
2342 install : true,
2343 install_dir : rootlibexecdir)
2344
2345 systemd_pull = executable('systemd-pull',
2346 systemd_pull_sources,
2347 include_directories : includes,
2348 link_with : [libshared],
2349 dependencies : [versiondep,
2350 libcurl,
2351 libz,
2352 libbzip2,
2353 libxz,
2354 libgcrypt],
2355 install_rpath : rootlibexecdir,
2356 install : true,
2357 install_dir : rootlibexecdir)
2358
2359 systemd_import = executable('systemd-import',
2360 systemd_import_sources,
2361 include_directories : includes,
2362 link_with : [libshared],
2363 dependencies : [libcurl,
2364 libz,
2365 libbzip2,
2366 libxz],
2367 install_rpath : rootlibexecdir,
2368 install : true,
2369 install_dir : rootlibexecdir)
2370
2371 systemd_import_fs = executable('systemd-import-fs',
2372 systemd_import_fs_sources,
2373 include_directories : includes,
2374 link_with : [libshared],
2375 install_rpath : rootlibexecdir,
2376 install : true,
2377 install_dir : rootlibexecdir)
2378
2379 systemd_export = executable('systemd-export',
2380 systemd_export_sources,
2381 include_directories : includes,
2382 link_with : [libshared],
2383 dependencies : [libcurl,
2384 libz,
2385 libbzip2,
2386 libxz],
2387 install_rpath : rootlibexecdir,
2388 install : true,
2389 install_dir : rootlibexecdir)
2390
2391 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2392 endif
2393
2394 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2395 exe = executable('systemd-journal-upload',
2396 systemd_journal_upload_sources,
2397 include_directories : includes,
2398 link_with : [libshared],
2399 dependencies : [versiondep,
2400 threads,
2401 libcurl,
2402 libgnutls,
2403 libxz,
2404 liblz4],
2405 install_rpath : rootlibexecdir,
2406 install : true,
2407 install_dir : rootlibexecdir)
2408 public_programs += exe
2409 endif
2410
2411 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2412 s_j_remote = executable('systemd-journal-remote',
2413 systemd_journal_remote_sources,
2414 include_directories : includes,
2415 link_with : [libshared,
2416 libsystemd_journal_remote],
2417 dependencies : [threads,
2418 libmicrohttpd,
2419 libgnutls,
2420 libxz,
2421 liblz4],
2422 install_rpath : rootlibexecdir,
2423 install : true,
2424 install_dir : rootlibexecdir)
2425
2426 s_j_gatewayd = executable('systemd-journal-gatewayd',
2427 systemd_journal_gatewayd_sources,
2428 include_directories : includes,
2429 link_with : [libshared],
2430 dependencies : [threads,
2431 libmicrohttpd,
2432 libgnutls,
2433 libxz,
2434 liblz4],
2435 install_rpath : rootlibexecdir,
2436 install : true,
2437 install_dir : rootlibexecdir)
2438 public_programs += [s_j_remote, s_j_gatewayd]
2439 endif
2440
2441 if conf.get('ENABLE_COREDUMP') == 1
2442 executable('systemd-coredump',
2443 systemd_coredump_sources,
2444 include_directories : includes,
2445 link_with : [libshared],
2446 dependencies : [threads,
2447 libacl,
2448 libdw,
2449 libxz,
2450 liblz4],
2451 install_rpath : rootlibexecdir,
2452 install : true,
2453 install_dir : rootlibexecdir)
2454
2455 exe = executable('coredumpctl',
2456 coredumpctl_sources,
2457 include_directories : includes,
2458 link_with : [libshared],
2459 dependencies : [threads,
2460 libxz,
2461 liblz4],
2462 install_rpath : rootlibexecdir,
2463 install : true)
2464 public_programs += exe
2465 endif
2466
2467 if conf.get('ENABLE_PSTORE') == 1
2468 executable('systemd-pstore',
2469 systemd_pstore_sources,
2470 include_directories : includes,
2471 link_with : [libshared],
2472 dependencies : [threads,
2473 libacl,
2474 libdw,
2475 libxz,
2476 liblz4],
2477 install_rpath : rootlibexecdir,
2478 install : true,
2479 install_dir : rootlibexecdir)
2480 endif
2481
2482 if conf.get('ENABLE_BINFMT') == 1
2483 exe = executable('systemd-binfmt',
2484 'src/binfmt/binfmt.c',
2485 include_directories : includes,
2486 link_with : [libshared],
2487 install_rpath : rootlibexecdir,
2488 install : true,
2489 install_dir : rootlibexecdir)
2490 public_programs += exe
2491
2492 meson.add_install_script('sh', '-c',
2493 mkdir_p.format(binfmtdir))
2494 meson.add_install_script('sh', '-c',
2495 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2496 endif
2497
2498 if conf.get('ENABLE_REPART') == 1
2499 executable('systemd-repart',
2500 systemd_repart_sources,
2501 include_directories : includes,
2502 link_with : [libshared],
2503 dependencies : [threads,
2504 libcryptsetup,
2505 libblkid,
2506 libfdisk,
2507 libopenssl],
2508 install_rpath : rootlibexecdir,
2509 install : true,
2510 install_dir : rootbindir)
2511 endif
2512
2513 if conf.get('ENABLE_VCONSOLE') == 1
2514 executable('systemd-vconsole-setup',
2515 'src/vconsole/vconsole-setup.c',
2516 include_directories : includes,
2517 link_with : [libshared],
2518 install_rpath : rootlibexecdir,
2519 install : true,
2520 install_dir : rootlibexecdir)
2521 endif
2522
2523 if conf.get('ENABLE_RANDOMSEED') == 1
2524 executable('systemd-random-seed',
2525 'src/random-seed/random-seed.c',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 install_rpath : rootlibexecdir,
2529 install : true,
2530 install_dir : rootlibexecdir)
2531 endif
2532
2533 if conf.get('ENABLE_FIRSTBOOT') == 1
2534 executable('systemd-firstboot',
2535 'src/firstboot/firstboot.c',
2536 include_directories : includes,
2537 link_with : [libshared],
2538 dependencies : [libcrypt],
2539 install_rpath : rootlibexecdir,
2540 install : true,
2541 install_dir : rootbindir)
2542 endif
2543
2544 executable('systemd-remount-fs',
2545 'src/remount-fs/remount-fs.c',
2546 include_directories : includes,
2547 link_with : [libcore_shared,
2548 libshared],
2549 install_rpath : rootlibexecdir,
2550 install : true,
2551 install_dir : rootlibexecdir)
2552
2553 executable('systemd-machine-id-setup',
2554 'src/machine-id-setup/machine-id-setup-main.c',
2555 include_directories : includes,
2556 link_with : [libcore_shared,
2557 libshared],
2558 install_rpath : rootlibexecdir,
2559 install : true,
2560 install_dir : rootbindir)
2561
2562 executable('systemd-fsck',
2563 'src/fsck/fsck.c',
2564 include_directories : includes,
2565 link_with : [libshared],
2566 install_rpath : rootlibexecdir,
2567 install : true,
2568 install_dir : rootlibexecdir)
2569
2570 executable('systemd-growfs',
2571 'src/partition/growfs.c',
2572 include_directories : includes,
2573 link_with : [libshared],
2574 dependencies : [libcryptsetup],
2575 install_rpath : rootlibexecdir,
2576 install : true,
2577 install_dir : rootlibexecdir)
2578
2579 executable('systemd-makefs',
2580 'src/partition/makefs.c',
2581 include_directories : includes,
2582 link_with : [libshared],
2583 install_rpath : rootlibexecdir,
2584 install : true,
2585 install_dir : rootlibexecdir)
2586
2587 executable('systemd-sleep',
2588 'src/sleep/sleep.c',
2589 include_directories : includes,
2590 link_with : [libshared],
2591 install_rpath : rootlibexecdir,
2592 install : true,
2593 install_dir : rootlibexecdir)
2594
2595 install_data('src/sleep/sleep.conf',
2596 install_dir : pkgsysconfdir)
2597
2598 exe = executable('systemd-sysctl',
2599 'src/sysctl/sysctl.c',
2600 include_directories : includes,
2601 link_with : [libshared],
2602 install_rpath : rootlibexecdir,
2603 install : true,
2604 install_dir : rootlibexecdir)
2605 public_programs += exe
2606
2607 executable('systemd-ac-power',
2608 'src/ac-power/ac-power.c',
2609 include_directories : includes,
2610 link_with : [libshared],
2611 install_rpath : rootlibexecdir,
2612 install : true,
2613 install_dir : rootlibexecdir)
2614
2615 exe = executable('systemd-detect-virt',
2616 'src/detect-virt/detect-virt.c',
2617 include_directories : includes,
2618 link_with : [libshared],
2619 install_rpath : rootlibexecdir,
2620 install : true)
2621 public_programs += exe
2622
2623 exe = executable('systemd-delta',
2624 'src/delta/delta.c',
2625 include_directories : includes,
2626 link_with : [libshared],
2627 install_rpath : rootlibexecdir,
2628 install : true)
2629 public_programs += exe
2630
2631 exe = executable('systemd-escape',
2632 'src/escape/escape.c',
2633 include_directories : includes,
2634 link_with : [libshared],
2635 install_rpath : rootlibexecdir,
2636 install : true,
2637 install_dir : rootbindir)
2638 public_programs += exe
2639
2640 exe = executable('systemd-notify',
2641 'src/notify/notify.c',
2642 include_directories : includes,
2643 link_with : [libshared],
2644 install_rpath : rootlibexecdir,
2645 install : true,
2646 install_dir : rootbindir)
2647 public_programs += exe
2648
2649 executable('systemd-volatile-root',
2650 'src/volatile-root/volatile-root.c',
2651 include_directories : includes,
2652 link_with : [libshared],
2653 install_rpath : rootlibexecdir,
2654 install : true,
2655 install_dir : rootlibexecdir)
2656
2657 executable('systemd-cgroups-agent',
2658 'src/cgroups-agent/cgroups-agent.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-id128',
2666 'src/id128/id128.c',
2667 include_directories : includes,
2668 link_with : [libshared],
2669 install_rpath : rootlibexecdir,
2670 install : true)
2671 public_programs += exe
2672
2673 exe = executable('systemd-path',
2674 'src/path/path.c',
2675 include_directories : includes,
2676 link_with : [libshared],
2677 install_rpath : rootlibexecdir,
2678 install : true)
2679 public_programs += exe
2680
2681 exe = executable('systemd-ask-password',
2682 'src/ask-password/ask-password.c',
2683 include_directories : includes,
2684 link_with : [libshared],
2685 install_rpath : rootlibexecdir,
2686 install : true,
2687 install_dir : rootbindir)
2688 public_programs += exe
2689
2690 executable('systemd-reply-password',
2691 'src/reply-password/reply-password.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-tty-ask-password-agent',
2699 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2700 include_directories : includes,
2701 link_with : [libshared],
2702 install_rpath : rootlibexecdir,
2703 install : true,
2704 install_dir : rootbindir)
2705 public_programs += exe
2706
2707 exe = executable('systemd-cgls',
2708 'src/cgls/cgls.c',
2709 include_directories : includes,
2710 link_with : [libshared],
2711 install_rpath : rootlibexecdir,
2712 install : true)
2713 public_programs += exe
2714
2715 exe = executable('systemd-cgtop',
2716 'src/cgtop/cgtop.c',
2717 include_directories : includes,
2718 link_with : [libshared],
2719 install_rpath : rootlibexecdir,
2720 install : true)
2721 public_programs += exe
2722
2723 executable('systemd-initctl',
2724 'src/initctl/initctl.c',
2725 include_directories : includes,
2726 link_with : [libshared],
2727 install_rpath : rootlibexecdir,
2728 install : true,
2729 install_dir : rootlibexecdir)
2730
2731 exe = executable('systemd-mount',
2732 'src/mount/mount-tool.c',
2733 include_directories : includes,
2734 link_with : [libshared],
2735 dependencies: [libmount],
2736 install_rpath : rootlibexecdir,
2737 install : true)
2738 public_programs += exe
2739
2740 meson.add_install_script(meson_make_symlink,
2741 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2742
2743 exe = executable('systemd-run',
2744 'src/run/run.c',
2745 include_directories : includes,
2746 link_with : [libshared],
2747 install_rpath : rootlibexecdir,
2748 install : true)
2749 public_programs += exe
2750
2751 exe = executable('systemd-stdio-bridge',
2752 'src/stdio-bridge/stdio-bridge.c',
2753 include_directories : includes,
2754 link_with : [libshared],
2755 dependencies : [versiondep],
2756 install_rpath : rootlibexecdir,
2757 install : true)
2758 public_programs += exe
2759
2760 exe = executable('busctl',
2761 'src/busctl/busctl.c',
2762 'src/busctl/busctl-introspect.c',
2763 'src/busctl/busctl-introspect.h',
2764 include_directories : includes,
2765 link_with : [libshared],
2766 install_rpath : rootlibexecdir,
2767 install : true)
2768 public_programs += exe
2769
2770 if conf.get('ENABLE_SYSUSERS') == 1
2771 exe = executable('systemd-sysusers',
2772 'src/sysusers/sysusers.c',
2773 include_directories : includes,
2774 link_with : [libshared],
2775 install_rpath : rootlibexecdir,
2776 install : true,
2777 install_dir : rootbindir)
2778 public_programs += exe
2779 endif
2780
2781 if conf.get('ENABLE_TMPFILES') == 1
2782 exe = executable('systemd-tmpfiles',
2783 'src/tmpfiles/tmpfiles.c',
2784 include_directories : includes,
2785 link_with : [libshared],
2786 dependencies : [libacl],
2787 install_rpath : rootlibexecdir,
2788 install : true,
2789 install_dir : rootbindir)
2790 public_programs += exe
2791
2792 if want_tests != 'false'
2793 test('test-systemd-tmpfiles',
2794 test_systemd_tmpfiles_py,
2795 # https://github.com/mesonbuild/meson/issues/2681
2796 args : exe.full_path())
2797 endif
2798 endif
2799
2800 if conf.get('ENABLE_HWDB') == 1
2801 exe = executable('systemd-hwdb',
2802 'src/hwdb/hwdb.c',
2803 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2804 include_directories : includes,
2805 link_with : [libudev_static],
2806 install_rpath : udev_rpath,
2807 install : true,
2808 install_dir : rootbindir)
2809 public_programs += exe
2810 endif
2811
2812 if conf.get('ENABLE_QUOTACHECK') == 1
2813 executable('systemd-quotacheck',
2814 'src/quotacheck/quotacheck.c',
2815 include_directories : includes,
2816 link_with : [libshared],
2817 install_rpath : rootlibexecdir,
2818 install : true,
2819 install_dir : rootlibexecdir)
2820 endif
2821
2822 exe = executable('systemd-socket-proxyd',
2823 'src/socket-proxy/socket-proxyd.c',
2824 include_directories : includes,
2825 link_with : [libshared],
2826 dependencies : [threads],
2827 install_rpath : rootlibexecdir,
2828 install : true,
2829 install_dir : rootlibexecdir)
2830 public_programs += exe
2831
2832 exe = executable('systemd-udevd',
2833 systemd_udevd_sources,
2834 include_directories : includes,
2835 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2836 link_with : [libudev_core,
2837 libsystemd_network,
2838 libudev_static],
2839 dependencies : [versiondep,
2840 threads,
2841 libkmod,
2842 libidn,
2843 libacl,
2844 libblkid],
2845 install_rpath : udev_rpath,
2846 install : true,
2847 install_dir : rootlibexecdir)
2848 public_programs += exe
2849
2850 exe = executable('udevadm',
2851 udevadm_sources,
2852 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2853 include_directories : includes,
2854 link_with : [libudev_core,
2855 libsystemd_network,
2856 libudev_static],
2857 dependencies : [versiondep,
2858 threads,
2859 libkmod,
2860 libidn,
2861 libacl,
2862 libblkid],
2863 install_rpath : udev_rpath,
2864 install : true,
2865 install_dir : rootbindir)
2866 public_programs += exe
2867
2868 executable('systemd-shutdown',
2869 systemd_shutdown_sources,
2870 include_directories : includes,
2871 link_with : [libcore_shared,
2872 libshared],
2873 dependencies : [libmount],
2874 install_rpath : rootlibexecdir,
2875 install : true,
2876 install_dir : rootlibexecdir)
2877
2878 executable('systemd-update-done',
2879 'src/update-done/update-done.c',
2880 include_directories : includes,
2881 link_with : [libshared],
2882 install_rpath : rootlibexecdir,
2883 install : true,
2884 install_dir : rootlibexecdir)
2885
2886 executable('systemd-update-utmp',
2887 'src/update-utmp/update-utmp.c',
2888 include_directories : includes,
2889 link_with : [libshared],
2890 dependencies : [libaudit],
2891 install_rpath : rootlibexecdir,
2892 install : true,
2893 install_dir : rootlibexecdir)
2894
2895 if conf.get('HAVE_KMOD') == 1
2896 executable('systemd-modules-load',
2897 'src/modules-load/modules-load.c',
2898 include_directories : includes,
2899 link_with : [libshared],
2900 dependencies : [libkmod],
2901 install_rpath : rootlibexecdir,
2902 install : true,
2903 install_dir : rootlibexecdir)
2904
2905 meson.add_install_script('sh', '-c',
2906 mkdir_p.format(modulesloaddir))
2907 meson.add_install_script('sh', '-c',
2908 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2909 endif
2910
2911 exe = executable('systemd-nspawn',
2912 systemd_nspawn_sources,
2913 include_directories : includes,
2914 link_with : [libcore_shared,
2915 libnspawn_core,
2916 libshared],
2917 dependencies : [libblkid,
2918 libseccomp],
2919 install_rpath : rootlibexecdir,
2920 install : true)
2921 public_programs += exe
2922
2923 if conf.get('ENABLE_NETWORKD') == 1
2924 executable('systemd-networkd',
2925 systemd_networkd_sources,
2926 include_directories : network_include_dir,
2927 link_with : [libnetworkd_core,
2928 libsystemd_network,
2929 libudev_static,
2930 networkd_link_with],
2931 dependencies : [threads],
2932 install_rpath : rootlibexecdir,
2933 install : true,
2934 install_dir : rootlibexecdir)
2935
2936 executable('systemd-networkd-wait-online',
2937 systemd_networkd_wait_online_sources,
2938 include_directories : includes,
2939 link_with : [libnetworkd_core,
2940 networkd_link_with],
2941 install_rpath : rootlibexecdir,
2942 install : true,
2943 install_dir : rootlibexecdir)
2944
2945 exe = executable('networkctl',
2946 networkctl_sources,
2947 include_directories : includes,
2948 link_with : [libsystemd_network,
2949 networkd_link_with],
2950 install_rpath : rootlibexecdir,
2951 install : true,
2952 install_dir : rootbindir)
2953 public_programs += exe
2954
2955 executable('systemd-network-generator',
2956 network_generator_sources,
2957 include_directories : includes,
2958 link_with : [networkd_link_with],
2959 install_rpath : rootlibexecdir,
2960 install : true,
2961 install_dir : rootlibexecdir)
2962 endif
2963
2964 executable('systemd-sulogin-shell',
2965 ['src/sulogin-shell/sulogin-shell.c'],
2966 include_directories : includes,
2967 link_with : [libshared],
2968 install_rpath : rootlibexecdir,
2969 install : true,
2970 install_dir : rootlibexecdir)
2971
2972 ############################################################
2973
2974 custom_target(
2975 'systemd-runtest.env',
2976 output : 'systemd-runtest.env',
2977 command : ['sh', '-c', '{ ' +
2978 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2979 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2980 '} >@OUTPUT@'],
2981 build_by_default : true)
2982
2983 foreach tuple : tests
2984 sources = tuple[0]
2985 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2986 dependencies = tuple[2]
2987 condition = tuple.length() >= 4 ? tuple[3] : ''
2988 type = tuple.length() >= 5 ? tuple[4] : ''
2989 defs = tuple.length() >= 6 ? tuple[5] : []
2990 incs = tuple.length() >= 7 ? tuple[6] : includes
2991 timeout = 30
2992
2993 name = sources[0].split('/')[-1].split('.')[0]
2994 if type.startswith('timeout=')
2995 timeout = type.split('=')[1].to_int()
2996 type = ''
2997 endif
2998
2999 if condition == '' or conf.get(condition) == 1
3000 exe = executable(
3001 name,
3002 sources,
3003 include_directories : incs,
3004 link_with : link_with,
3005 dependencies : [versiondep,
3006 dependencies],
3007 c_args : defs,
3008 build_by_default : want_tests != 'false',
3009 install_rpath : rootlibexecdir,
3010 install : install_tests,
3011 install_dir : join_paths(testsdir, type))
3012
3013 if type == 'manual'
3014 message('@0@ is a manual test'.format(name))
3015 elif type == 'unsafe' and want_tests != 'unsafe'
3016 message('@0@ is an unsafe test'.format(name))
3017 elif want_tests != 'false'
3018 test(name, exe,
3019 env : test_env,
3020 timeout : timeout)
3021 endif
3022 else
3023 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3024 endif
3025 endforeach
3026
3027 exe = executable(
3028 'test-libsystemd-sym',
3029 test_libsystemd_sym_c,
3030 include_directories : includes,
3031 link_with : [libsystemd],
3032 build_by_default : want_tests != 'false',
3033 install : install_tests,
3034 install_dir : testsdir)
3035 if want_tests != 'false'
3036 test('test-libsystemd-sym', exe)
3037 endif
3038
3039 exe = executable(
3040 'test-libsystemd-static-sym',
3041 test_libsystemd_sym_c,
3042 include_directories : includes,
3043 link_with : [install_libsystemd_static],
3044 dependencies : [threads], # threads is already included in dependencies on the library,
3045 # but does not seem to get propagated. Add here as a work-around.
3046 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3047 install : install_tests and static_libsystemd_pic,
3048 install_dir : testsdir)
3049 if want_tests != 'false' and static_libsystemd_pic
3050 test('test-libsystemd-static-sym', exe)
3051 endif
3052
3053 exe = executable(
3054 'test-libudev-sym',
3055 test_libudev_sym_c,
3056 include_directories : includes,
3057 c_args : '-Wno-deprecated-declarations',
3058 link_with : [libudev],
3059 build_by_default : want_tests != 'false',
3060 install : install_tests,
3061 install_dir : testsdir)
3062 if want_tests != 'false'
3063 test('test-libudev-sym', exe)
3064 endif
3065
3066 exe = executable(
3067 'test-libudev-static-sym',
3068 test_libudev_sym_c,
3069 include_directories : includes,
3070 c_args : '-Wno-deprecated-declarations',
3071 link_with : [install_libudev_static],
3072 build_by_default : want_tests != 'false' and static_libudev_pic,
3073 install : install_tests and static_libudev_pic,
3074 install_dir : testsdir)
3075 if want_tests != 'false' and static_libudev_pic
3076 test('test-libudev-static-sym', exe)
3077 endif
3078
3079 ############################################################
3080
3081 fuzzer_exes = []
3082
3083 if get_option('tests') != 'false'
3084 foreach tuple : fuzzers
3085 sources = tuple[0]
3086 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3087 dependencies = tuple[2]
3088 defs = tuple.length() >= 4 ? tuple[3] : []
3089 incs = tuple.length() >= 5 ? tuple[4] : includes
3090 link_args = []
3091
3092 if want_ossfuzz or want_fuzzbuzz
3093 dependencies += fuzzing_engine
3094 elif want_libfuzzer
3095 if fuzzing_engine.found()
3096 dependencies += fuzzing_engine
3097 else
3098 link_args += ['-fsanitize=fuzzer']
3099 endif
3100 else
3101 sources += 'src/fuzz/fuzz-main.c'
3102 endif
3103
3104 if want_fuzzbuzz
3105 sources += 'src/fuzz/fuzzer-entry-point.c'
3106 endif
3107
3108 name = sources[0].split('/')[-1].split('.')[0]
3109
3110 fuzzer_exes += executable(
3111 name,
3112 sources,
3113 include_directories : [incs, include_directories('src/fuzz')],
3114 link_with : link_with,
3115 dependencies : dependencies,
3116 c_args : defs,
3117 link_args: link_args,
3118 install : false)
3119 endforeach
3120 endif
3121
3122 run_target('fuzzers',
3123 depends : fuzzer_exes,
3124 command : ['true'])
3125
3126 ############################################################
3127
3128 make_directive_index_py = find_program('tools/make-directive-index.py')
3129 make_man_index_py = find_program('tools/make-man-index.py')
3130 xml_helper_py = find_program('tools/xml_helper.py')
3131 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3132 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3133
3134 subdir('sysctl.d')
3135 subdir('sysusers.d')
3136 subdir('tmpfiles.d')
3137 subdir('hwdb.d')
3138 subdir('units')
3139 subdir('presets')
3140 subdir('network')
3141 subdir('man')
3142 subdir('shell-completion/bash')
3143 subdir('shell-completion/zsh')
3144 subdir('docs/sysvinit')
3145 subdir('docs/var-log')
3146
3147 install_subdir('factory/etc',
3148 install_dir : factorydir)
3149
3150 install_data('xorg/50-systemd-user.sh',
3151 install_dir : xinitrcdir)
3152 install_data('modprobe.d/systemd.conf',
3153 install_dir : modprobedir)
3154 install_data('LICENSE.GPL2',
3155 'LICENSE.LGPL2.1',
3156 'NEWS',
3157 'README',
3158 'docs/CODING_STYLE.md',
3159 'docs/DISTRO_PORTING.md',
3160 'docs/ENVIRONMENT.md',
3161 'docs/HACKING.md',
3162 'docs/TRANSIENT-SETTINGS.md',
3163 'docs/TRANSLATORS.md',
3164 'docs/UIDS-GIDS.md',
3165 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3166 install_dir : docdir)
3167
3168 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3169 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3170
3171 ############################################################
3172
3173 meson_check_help = find_program('tools/meson-check-help.sh')
3174
3175 foreach exec : public_programs
3176 name = exec.full_path().split('/')[-1]
3177 if want_tests != 'false'
3178 test('check-help-' + name,
3179 meson_check_help,
3180 args : exec.full_path())
3181 endif
3182 endforeach
3183
3184 ############################################################
3185
3186 check_directives_sh = find_program('tools/check-directives.sh')
3187
3188 if want_tests != 'false'
3189 test('check-directives',
3190 check_directives_sh,
3191 args : project_source_root)
3192 endif
3193
3194 ############################################################
3195
3196 # Enable tests for all supported sanitizers
3197 foreach tuple : sanitizers
3198 sanitizer = tuple[0]
3199 build = tuple[1]
3200
3201 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3202 prev = ''
3203 foreach p : fuzz_regression_tests
3204 b = p.split('/')[-2]
3205 c = p.split('/')[-1]
3206
3207 name = '@0@:@1@'.format(b, sanitizer)
3208
3209 if name != prev
3210 if want_tests == 'false'
3211 message('Not compiling @0@ because tests is set to false'.format(name))
3212 elif slow_tests
3213 exe = custom_target(
3214 name,
3215 output : name,
3216 depends : build,
3217 command : [env, 'ln', '-fs',
3218 join_paths(build.full_path(), b),
3219 '@OUTPUT@'],
3220 build_by_default : true)
3221 else
3222 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3223 endif
3224 endif
3225 prev = name
3226
3227 if want_tests != 'false' and slow_tests
3228 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3229 env,
3230 args : [exe.full_path(),
3231 join_paths(project_source_root, p)])
3232 endif
3233 endforeach
3234 endif
3235 endforeach
3236
3237
3238 ############################################################
3239
3240 if git.found()
3241 all_files = run_command(
3242 git,
3243 ['--git-dir=@0@/.git'.format(project_source_root),
3244 'ls-files',
3245 ':/*.[ch]'])
3246 all_files = files(all_files.stdout().split())
3247
3248 custom_target(
3249 'tags',
3250 output : 'tags',
3251 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3252 run_target(
3253 'ctags',
3254 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3255 endif
3256
3257 if git.found()
3258 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3259 run_target(
3260 'git-contrib',
3261 command : [meson_git_contrib_sh])
3262 endif
3263
3264 if git.found()
3265 git_head = run_command(
3266 git,
3267 ['--git-dir=@0@/.git'.format(project_source_root),
3268 'rev-parse', 'HEAD']).stdout().strip()
3269 git_head_short = run_command(
3270 git,
3271 ['--git-dir=@0@/.git'.format(project_source_root),
3272 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3273
3274 run_target(
3275 'git-snapshot',
3276 command : ['git', 'archive',
3277 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3278 git_head_short),
3279 '--prefix', 'systemd-@0@/'.format(git_head),
3280 'HEAD'])
3281 endif
3282
3283 ############################################################
3284
3285 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3286 run_target(
3287 'check-api-docs',
3288 depends : [man, libsystemd, libudev],
3289 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3290
3291 ############################################################
3292 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3293
3294 status = [
3295 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3296
3297 'split /usr: @0@'.format(split_usr),
3298 'split bin-sbin: @0@'.format(split_bin),
3299 'prefix directory: @0@'.format(prefixdir),
3300 'rootprefix directory: @0@'.format(rootprefixdir),
3301 'sysconf directory: @0@'.format(sysconfdir),
3302 'include directory: @0@'.format(includedir),
3303 'lib directory: @0@'.format(libdir),
3304 'rootlib directory: @0@'.format(rootlibdir),
3305 'SysV init scripts: @0@'.format(sysvinit_path),
3306 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3307 'PAM modules directory: @0@'.format(pamlibdir),
3308 'PAM configuration directory: @0@'.format(pamconfdir),
3309 'RPM macros directory: @0@'.format(rpmmacrosdir),
3310 'modprobe.d directory: @0@'.format(modprobedir),
3311 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3312 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3313 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3314 'bash completions directory: @0@'.format(bashcompletiondir),
3315 'zsh completions directory: @0@'.format(zshcompletiondir),
3316 'extra start script: @0@'.format(get_option('rc-local')),
3317 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3318 get_option('debug-tty')),
3319 'TTY GID: @0@'.format(tty_gid),
3320 'users GID: @0@'.format(substs.get('USERS_GID')),
3321 'maximum system UID: @0@'.format(system_uid_max),
3322 'maximum system GID: @0@'.format(system_gid_max),
3323 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3324 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3325 'minimum container UID base: @0@'.format(container_uid_base_min),
3326 'maximum container UID base: @0@'.format(container_uid_base_max),
3327 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3328 'render group access mode: @0@'.format(get_option('group-render-mode')),
3329 'certificate root directory: @0@'.format(get_option('certificate-root')),
3330 'support URL: @0@'.format(support_url),
3331 'nobody user name: @0@'.format(nobody_user),
3332 'nobody group name: @0@'.format(nobody_group),
3333 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3334 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3335
3336 'default DNSSEC mode: @0@'.format(default_dnssec),
3337 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3338 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3339 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3340 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3341 'default locale: @0@'.format(default_locale),
3342 'default user $PATH: @0@'.format(default_user_path_display),
3343 'systemd service watchdog: @0@'.format(watchdog_opt)]
3344
3345 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3346 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3347 status += [
3348 'default DNS servers: @0@'.format(alt_dns_servers),
3349 'default NTP servers: @0@'.format(alt_ntp_servers)]
3350
3351 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3352 '@@0@'.format(time_epoch)).stdout().strip()
3353 status += [
3354 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3355
3356 status += [
3357 'static libsystemd: @0@'.format(static_libsystemd),
3358 'static libudev: @0@'.format(static_libudev)]
3359
3360 # TODO:
3361 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3362 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3363 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3364
3365 if conf.get('ENABLE_EFI') == 1
3366 status += 'efi arch: @0@'.format(efi_arch)
3367
3368 if have_gnu_efi
3369 status += [
3370 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3371 'EFI CC @0@'.format(' '.join(efi_cc)),
3372 'EFI lib directory: @0@'.format(efi_libdir),
3373 'EFI lds directory: @0@'.format(efi_ldsdir),
3374 'EFI include directory: @0@'.format(efi_incdir)]
3375 endif
3376 endif
3377
3378 found = []
3379 missing = []
3380
3381 foreach tuple : [
3382 ['libcryptsetup'],
3383 ['PAM'],
3384 ['pwquality'],
3385 ['fdisk'],
3386 ['p11kit'],
3387 ['AUDIT'],
3388 ['IMA'],
3389 ['AppArmor'],
3390 ['SELinux'],
3391 ['SECCOMP'],
3392 ['SMACK'],
3393 ['zlib'],
3394 ['xz'],
3395 ['lz4'],
3396 ['bzip2'],
3397 ['ACL'],
3398 ['gcrypt'],
3399 ['qrencode'],
3400 ['microhttpd'],
3401 ['gnutls'],
3402 ['openssl'],
3403 ['libcurl'],
3404 ['idn'],
3405 ['libidn2'],
3406 ['libidn'],
3407 ['libiptc'],
3408 ['elfutils'],
3409 ['binfmt'],
3410 ['repart'],
3411 ['vconsole'],
3412 ['quotacheck'],
3413 ['tmpfiles'],
3414 ['environment.d'],
3415 ['sysusers'],
3416 ['firstboot'],
3417 ['randomseed'],
3418 ['backlight'],
3419 ['rfkill'],
3420 ['logind'],
3421 ['machined'],
3422 ['portabled'],
3423 ['userdb'],
3424 ['homed'],
3425 ['importd'],
3426 ['hostnamed'],
3427 ['timedated'],
3428 ['timesyncd'],
3429 ['localed'],
3430 ['networkd'],
3431 ['resolve'],
3432 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3433 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3434 ['coredump'],
3435 ['pstore'],
3436 ['polkit'],
3437 ['legacy pkla', install_polkit_pkla],
3438 ['efi'],
3439 ['gnu-efi', have_gnu_efi],
3440 ['kmod'],
3441 ['xkbcommon'],
3442 ['pcre2'],
3443 ['blkid'],
3444 ['dbus'],
3445 ['glib'],
3446 ['nss-myhostname'],
3447 ['nss-mymachines'],
3448 ['nss-resolve'],
3449 ['nss-systemd'],
3450 ['hwdb'],
3451 ['tpm'],
3452 ['man pages', want_man],
3453 ['html pages', want_html],
3454 ['man page indices', want_man and have_lxml],
3455 ['SysV compat'],
3456 ['utmp'],
3457 ['ldconfig'],
3458 ['hibernate'],
3459 ['adm group', get_option('adm-group')],
3460 ['wheel group', get_option('wheel-group')],
3461 ['gshadow'],
3462 ['debug hashmap'],
3463 ['debug mmap cache'],
3464 ['debug siphash'],
3465 ['valgrind', conf.get('VALGRIND') == 1],
3466 ['trace logging', conf.get('LOG_TRACE') == 1],
3467 ['link-udev-shared', get_option('link-udev-shared')],
3468 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3469 ['link-networkd-shared', get_option('link-networkd-shared')],
3470 ]
3471
3472 if tuple.length() >= 2
3473 cond = tuple[1]
3474 else
3475 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3476 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3477 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3478 endif
3479 if cond
3480 found += tuple[0]
3481 else
3482 missing += tuple[0]
3483 endif
3484 endforeach
3485
3486 status += [
3487 '',
3488 'enabled features: @0@'.format(', '.join(found)),
3489 '',
3490 'disabled features: @0@'.format(', '.join(missing)),
3491 '']
3492 message('\n '.join(status))
3493
3494 if rootprefixdir != rootprefix_default
3495 warning('\n' +
3496 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3497 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3498 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3499 endif