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