]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
TEST-50-DISSECT: drop now-unneeded MountAPIVFS=yes and full paths to executables
[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_gensalt_ra', crypt_header]]
889
890 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
891 dependencies : libcrypt)
892 conf.set10('HAVE_' + ident[0].to_upper(), have)
893 endforeach
894
895 libcap = dependency('libcap', required : false)
896 if not libcap.found()
897 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
898 libcap = cc.find_library('cap')
899 endif
900
901 libmount = dependency('mount',
902 version : fuzzer_build ? '>= 0' : '>= 2.30')
903
904 want_libfdisk = get_option('fdisk')
905 if want_libfdisk != 'false' and not skip_deps
906 libfdisk = dependency('fdisk',
907 version : '>= 2.33',
908 required : want_libfdisk == 'true')
909 have = libfdisk.found()
910 else
911 have = false
912 libfdisk = []
913 endif
914 conf.set10('HAVE_LIBFDISK', have)
915
916 want_pwquality = get_option('pwquality')
917 if want_pwquality != 'false' and not skip_deps
918 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
919 have = libpwquality.found()
920 else
921 have = false
922 libpwquality = []
923 endif
924 conf.set10('HAVE_PWQUALITY', have)
925
926 want_seccomp = get_option('seccomp')
927 if want_seccomp != 'false' and not skip_deps
928 libseccomp = dependency('libseccomp',
929 version : '>= 2.3.1',
930 required : want_seccomp == 'true')
931 have = libseccomp.found()
932 else
933 have = false
934 libseccomp = []
935 endif
936 conf.set10('HAVE_SECCOMP', have)
937
938 want_selinux = get_option('selinux')
939 if want_selinux != 'false' and not skip_deps
940 libselinux = dependency('libselinux',
941 version : '>= 2.1.9',
942 required : want_selinux == 'true')
943 have = libselinux.found()
944 else
945 have = false
946 libselinux = []
947 endif
948 conf.set10('HAVE_SELINUX', have)
949
950 want_apparmor = get_option('apparmor')
951 if want_apparmor != 'false' and not skip_deps
952 libapparmor = dependency('libapparmor',
953 version : '>= 2.13',
954 required : want_apparmor == 'true')
955 have = libapparmor.found()
956 else
957 have = false
958 libapparmor = []
959 endif
960 conf.set10('HAVE_APPARMOR', have)
961
962 smack_run_label = get_option('smack-run-label')
963 if smack_run_label != ''
964 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
965 endif
966
967 want_polkit = get_option('polkit')
968 install_polkit = false
969 install_polkit_pkla = false
970 if want_polkit != 'false' and not skip_deps
971 install_polkit = true
972
973 libpolkit = dependency('polkit-gobject-1',
974 required : false)
975 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
976 message('Old polkit detected, will install pkla files')
977 install_polkit_pkla = true
978 endif
979 endif
980 conf.set10('ENABLE_POLKIT', install_polkit)
981
982 want_acl = get_option('acl')
983 if want_acl != 'false' and not skip_deps
984 libacl = cc.find_library('acl', required : want_acl == 'true')
985 have = libacl.found()
986 else
987 have = false
988 libacl = []
989 endif
990 conf.set10('HAVE_ACL', have)
991
992 want_audit = get_option('audit')
993 if want_audit != 'false' and not skip_deps
994 libaudit = dependency('audit', required : want_audit == 'true')
995 have = libaudit.found()
996 else
997 have = false
998 libaudit = []
999 endif
1000 conf.set10('HAVE_AUDIT', have)
1001
1002 want_blkid = get_option('blkid')
1003 if want_blkid != 'false' and not skip_deps
1004 libblkid = dependency('blkid', required : want_blkid == 'true')
1005 have = libblkid.found()
1006 else
1007 have = false
1008 libblkid = []
1009 endif
1010 conf.set10('HAVE_BLKID', have)
1011
1012 want_kmod = get_option('kmod')
1013 if want_kmod != 'false' and not skip_deps
1014 libkmod = dependency('libkmod',
1015 version : '>= 15',
1016 required : want_kmod == 'true')
1017 have = libkmod.found()
1018 else
1019 have = false
1020 libkmod = []
1021 endif
1022 conf.set10('HAVE_KMOD', have)
1023
1024 want_pam = get_option('pam')
1025 if want_pam != 'false' and not skip_deps
1026 libpam = cc.find_library('pam', required : want_pam == 'true')
1027 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1028 have = libpam.found() and libpam_misc.found()
1029 else
1030 have = false
1031 libpam = []
1032 libpam_misc = []
1033 endif
1034 conf.set10('HAVE_PAM', have)
1035
1036 want_microhttpd = get_option('microhttpd')
1037 if want_microhttpd != 'false' and not skip_deps
1038 libmicrohttpd = dependency('libmicrohttpd',
1039 version : '>= 0.9.33',
1040 required : want_microhttpd == 'true')
1041 have = libmicrohttpd.found()
1042 else
1043 have = false
1044 libmicrohttpd = []
1045 endif
1046 conf.set10('HAVE_MICROHTTPD', have)
1047
1048 want_libcryptsetup = get_option('libcryptsetup')
1049 if want_libcryptsetup != 'false' and not skip_deps
1050 libcryptsetup = dependency('libcryptsetup',
1051 version : '>= 2.0.1',
1052 required : want_libcryptsetup == 'true')
1053 have = libcryptsetup.found()
1054
1055 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1056 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1057 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1058 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1059 else
1060 have = false
1061 libcryptsetup = []
1062 endif
1063 conf.set10('HAVE_LIBCRYPTSETUP', have)
1064
1065 want_libcurl = get_option('libcurl')
1066 if want_libcurl != 'false' and not skip_deps
1067 libcurl = dependency('libcurl',
1068 version : '>= 7.32.0',
1069 required : want_libcurl == 'true')
1070 have = libcurl.found()
1071 else
1072 have = false
1073 libcurl = []
1074 endif
1075 conf.set10('HAVE_LIBCURL', have)
1076
1077 want_libidn = get_option('libidn')
1078 want_libidn2 = get_option('libidn2')
1079 if want_libidn == 'true' and want_libidn2 == 'true'
1080 error('libidn and libidn2 cannot be requested simultaneously')
1081 endif
1082
1083 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1084 libidn = dependency('libidn2',
1085 required : want_libidn2 == 'true')
1086 have = libidn.found()
1087 else
1088 have = false
1089 libidn = []
1090 endif
1091 conf.set10('HAVE_LIBIDN2', have)
1092 if not have and want_libidn != 'false' and not skip_deps
1093 # libidn is used for both libidn and libidn2 objects
1094 libidn = dependency('libidn',
1095 required : want_libidn == 'true')
1096 have = libidn.found()
1097 else
1098 have = false
1099 endif
1100 conf.set10('HAVE_LIBIDN', have)
1101
1102 want_libiptc = get_option('libiptc')
1103 if want_libiptc != 'false' and not skip_deps
1104 libiptc = dependency('libiptc',
1105 required : want_libiptc == 'true')
1106 have = libiptc.found()
1107 else
1108 have = false
1109 libiptc = []
1110 endif
1111 conf.set10('HAVE_LIBIPTC', have)
1112
1113 want_qrencode = get_option('qrencode')
1114 if want_qrencode != 'false' and not skip_deps
1115 libqrencode = dependency('libqrencode',
1116 required : want_qrencode == 'true')
1117 have = libqrencode.found()
1118 else
1119 have = false
1120 libqrencode = []
1121 endif
1122 conf.set10('HAVE_QRENCODE', have)
1123
1124 want_gcrypt = get_option('gcrypt')
1125 if want_gcrypt != 'false' and not skip_deps
1126 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1127 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1128 have = libgcrypt.found() and libgpg_error.found()
1129 else
1130 have = false
1131 endif
1132 if not have
1133 # link to neither of the libs if one is not found
1134 libgcrypt = []
1135 libgpg_error = []
1136 endif
1137 conf.set10('HAVE_GCRYPT', have)
1138
1139 want_gnutls = get_option('gnutls')
1140 if want_gnutls != 'false' and not skip_deps
1141 libgnutls = dependency('gnutls',
1142 version : '>= 3.1.4',
1143 required : want_gnutls == 'true')
1144 have = libgnutls.found()
1145 else
1146 have = false
1147 libgnutls = []
1148 endif
1149 conf.set10('HAVE_GNUTLS', have)
1150
1151 want_openssl = get_option('openssl')
1152 if want_openssl != 'false' and not skip_deps
1153 libopenssl = dependency('openssl',
1154 version : '>= 1.1.0',
1155 required : want_openssl == 'true')
1156 have = libopenssl.found()
1157 else
1158 have = false
1159 libopenssl = []
1160 endif
1161 conf.set10('HAVE_OPENSSL', have)
1162
1163 want_p11kit = get_option('p11kit')
1164 if want_p11kit != 'false' and not skip_deps
1165 libp11kit = dependency('p11-kit-1',
1166 version : '>= 0.23.3',
1167 required : want_p11kit == 'true')
1168 have = libp11kit.found()
1169 else
1170 have = false
1171 libp11kit = []
1172 endif
1173 conf.set10('HAVE_P11KIT', have)
1174
1175 want_libfido2 = get_option('libfido2')
1176 if want_libfido2 != 'false' and not skip_deps
1177 libfido2 = dependency('libfido2',
1178 required : want_libfido2 == 'true')
1179 have = libfido2.found()
1180 else
1181 have = false
1182 libfido2 = []
1183 endif
1184 conf.set10('HAVE_LIBFIDO2', have)
1185
1186 want_elfutils = get_option('elfutils')
1187 if want_elfutils != 'false' and not skip_deps
1188 libdw = dependency('libdw',
1189 required : want_elfutils == 'true')
1190 have = libdw.found()
1191 else
1192 have = false
1193 libdw = []
1194 endif
1195 conf.set10('HAVE_ELFUTILS', have)
1196
1197 want_zlib = get_option('zlib')
1198 if want_zlib != 'false' and not skip_deps
1199 libz = dependency('zlib',
1200 required : want_zlib == 'true')
1201 have = libz.found()
1202 else
1203 have = false
1204 libz = []
1205 endif
1206 conf.set10('HAVE_ZLIB', have)
1207
1208 want_bzip2 = get_option('bzip2')
1209 if want_bzip2 != 'false' and not skip_deps
1210 libbzip2 = cc.find_library('bz2',
1211 required : want_bzip2 == 'true')
1212 have = libbzip2.found()
1213 else
1214 have = false
1215 libbzip2 = []
1216 endif
1217 conf.set10('HAVE_BZIP2', have)
1218
1219 want_xz = get_option('xz')
1220 if want_xz != 'false' and not skip_deps
1221 libxz = dependency('liblzma',
1222 required : want_xz == 'true')
1223 have_xz = libxz.found()
1224 else
1225 have_xz = false
1226 libxz = []
1227 endif
1228 conf.set10('HAVE_XZ', have_xz)
1229
1230 want_lz4 = get_option('lz4')
1231 if want_lz4 != 'false' and not skip_deps
1232 liblz4 = dependency('liblz4',
1233 version : '>= 1.3.0',
1234 required : want_lz4 == 'true')
1235 have_lz4 = liblz4.found()
1236 else
1237 have_lz4 = false
1238 liblz4 = []
1239 endif
1240 conf.set10('HAVE_LZ4', have_lz4)
1241
1242 want_zstd = get_option('zstd')
1243 if want_zstd != 'false' and not skip_deps
1244 libzstd = dependency('libzstd',
1245 required : want_zstd == 'true',
1246 version : '>= 1.4.0')
1247 have_zstd = libzstd.found()
1248 else
1249 have_zstd = false
1250 libzstd = []
1251 endif
1252 conf.set10('HAVE_ZSTD', have_zstd)
1253
1254 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1255
1256 want_xkbcommon = get_option('xkbcommon')
1257 if want_xkbcommon != 'false' and not skip_deps
1258 libxkbcommon = dependency('xkbcommon',
1259 version : '>= 0.3.0',
1260 required : want_xkbcommon == 'true')
1261 have = libxkbcommon.found()
1262 else
1263 have = false
1264 libxkbcommon = []
1265 endif
1266 conf.set10('HAVE_XKBCOMMON', have)
1267
1268 want_pcre2 = get_option('pcre2')
1269 if want_pcre2 != 'false'
1270 libpcre2 = dependency('libpcre2-8',
1271 required : want_pcre2 == 'true')
1272 have = libpcre2.found()
1273 else
1274 have = false
1275 libpcre2 = []
1276 endif
1277 conf.set10('HAVE_PCRE2', have)
1278
1279 want_glib = get_option('glib')
1280 if want_glib != 'false' and not skip_deps
1281 libglib = dependency('glib-2.0',
1282 version : '>= 2.22.0',
1283 required : want_glib == 'true')
1284 libgobject = dependency('gobject-2.0',
1285 version : '>= 2.22.0',
1286 required : want_glib == 'true')
1287 libgio = dependency('gio-2.0',
1288 required : want_glib == 'true')
1289 have = libglib.found() and libgobject.found() and libgio.found()
1290 else
1291 have = false
1292 libglib = []
1293 libgobject = []
1294 libgio = []
1295 endif
1296 conf.set10('HAVE_GLIB', have)
1297
1298 want_dbus = get_option('dbus')
1299 if want_dbus != 'false' and not skip_deps
1300 libdbus = dependency('dbus-1',
1301 version : '>= 1.3.2',
1302 required : want_dbus == 'true')
1303 have = libdbus.found()
1304 else
1305 have = false
1306 libdbus = []
1307 endif
1308 conf.set10('HAVE_DBUS', have)
1309
1310 default_dnssec = get_option('default-dnssec')
1311 if skip_deps
1312 default_dnssec = 'no'
1313 endif
1314 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1315 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1316 default_dnssec = 'no'
1317 endif
1318 conf.set('DEFAULT_DNSSEC_MODE',
1319 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1320 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1321
1322 dns_over_tls = get_option('dns-over-tls')
1323 if dns_over_tls != 'false'
1324 if dns_over_tls == 'openssl'
1325 have_gnutls = false
1326 else
1327 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1328 if dns_over_tls == 'gnutls' and not have_gnutls
1329 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1330 endif
1331 endif
1332 if dns_over_tls == 'gnutls' or have_gnutls
1333 have_openssl = false
1334 else
1335 have_openssl = conf.get('HAVE_OPENSSL') == 1
1336 if dns_over_tls != 'auto' and not have_openssl
1337 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1338 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1339 endif
1340 endif
1341 have = have_gnutls or have_openssl
1342 else
1343 have = false
1344 have_gnutls = false
1345 have_openssl = false
1346 endif
1347 conf.set10('ENABLE_DNS_OVER_TLS', have)
1348 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1349 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1350
1351 default_dns_over_tls = get_option('default-dns-over-tls')
1352 if skip_deps
1353 default_dns_over_tls = 'no'
1354 endif
1355 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1356 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.')
1357 default_dns_over_tls = 'no'
1358 endif
1359 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1360 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1361 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1362
1363 default_mdns = get_option('default-mdns')
1364 conf.set('DEFAULT_MDNS_MODE',
1365 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1366 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1367
1368 default_llmnr = get_option('default-llmnr')
1369 conf.set('DEFAULT_LLMNR_MODE',
1370 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1371 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1372
1373 want_repart = get_option('repart')
1374 if want_repart != 'false'
1375 have = (conf.get('HAVE_OPENSSL') == 1 and
1376 conf.get('HAVE_LIBFDISK') == 1)
1377 if want_repart == 'true' and not have
1378 error('repart support was requested, but dependencies are not available')
1379 endif
1380 else
1381 have = false
1382 endif
1383 conf.set10('ENABLE_REPART', have)
1384
1385 want_importd = get_option('importd')
1386 if want_importd != 'false'
1387 have = (conf.get('HAVE_LIBCURL') == 1 and
1388 conf.get('HAVE_ZLIB') == 1 and
1389 conf.get('HAVE_XZ') == 1 and
1390 conf.get('HAVE_GCRYPT') == 1)
1391 if want_importd == 'true' and not have
1392 error('importd support was requested, but dependencies are not available')
1393 endif
1394 else
1395 have = false
1396 endif
1397 conf.set10('ENABLE_IMPORTD', have)
1398
1399 want_homed = get_option('homed')
1400 if want_homed != 'false'
1401 have = (conf.get('HAVE_OPENSSL') == 1 and
1402 conf.get('HAVE_LIBFDISK') == 1 and
1403 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1404 if want_homed == 'true' and not have
1405 error('homed support was requested, but dependencies are not available')
1406 endif
1407 else
1408 have = false
1409 endif
1410 conf.set10('ENABLE_HOMED', have)
1411
1412 have = have and conf.get('HAVE_PAM') == 1
1413 conf.set10('ENABLE_PAM_HOME', have)
1414
1415 want_remote = get_option('remote')
1416 if want_remote != 'false'
1417 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1418 conf.get('HAVE_LIBCURL') == 1]
1419 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1420 # it's possible to build one without the other. Complain only if
1421 # support was explicitly requested. The auxiliary files like sysusers
1422 # config should be installed when any of the programs are built.
1423 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1424 error('remote support was requested, but dependencies are not available')
1425 endif
1426 have = have_deps[0] or have_deps[1]
1427 else
1428 have = false
1429 endif
1430 conf.set10('ENABLE_REMOTE', have)
1431
1432 foreach term : ['analyze',
1433 'backlight',
1434 'binfmt',
1435 'coredump',
1436 'efi',
1437 'environment-d',
1438 'firstboot',
1439 'gshadow',
1440 'hibernate',
1441 'hostnamed',
1442 'hwdb',
1443 'idn',
1444 'ima',
1445 'initrd',
1446 'ldconfig',
1447 'localed',
1448 'logind',
1449 'machined',
1450 'networkd',
1451 'nss-myhostname',
1452 'nss-systemd',
1453 'portabled',
1454 'pstore',
1455 'quotacheck',
1456 'randomseed',
1457 'resolve',
1458 'rfkill',
1459 'smack',
1460 'sysusers',
1461 'timedated',
1462 'timesyncd',
1463 'tmpfiles',
1464 'tpm',
1465 'userdb',
1466 'utmp',
1467 'vconsole',
1468 'xdg-autostart']
1469 have = get_option(term)
1470 name = 'ENABLE_' + term.underscorify().to_upper()
1471 conf.set10(name, have)
1472 endforeach
1473
1474 foreach tuple : [['nss-mymachines', 'machined'],
1475 ['nss-resolve', 'resolve']]
1476 want = get_option(tuple[0])
1477 if want != 'false'
1478 have = get_option(tuple[1])
1479 if want == 'true' and not have
1480 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1481 endif
1482 else
1483 have = false
1484 endif
1485 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1486 conf.set10(name, have)
1487 endforeach
1488
1489 enable_nss = false
1490 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1491 'ENABLE_NSS_MYMACHINES',
1492 'ENABLE_NSS_RESOLVE',
1493 'ENABLE_NSS_SYSTEMD']
1494 if conf.get(term) == 1
1495 enable_nss = true
1496 endif
1497 endforeach
1498 conf.set10('ENABLE_NSS', enable_nss)
1499
1500 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1501
1502 tests = []
1503 fuzzers = []
1504
1505 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1506
1507 #####################################################################
1508
1509 if get_option('efi')
1510 efi_arch = host_machine.cpu_family()
1511
1512 if efi_arch == 'x86'
1513 EFI_MACHINE_TYPE_NAME = 'ia32'
1514 gnu_efi_arch = 'ia32'
1515 elif efi_arch == 'x86_64'
1516 EFI_MACHINE_TYPE_NAME = 'x64'
1517 gnu_efi_arch = 'x86_64'
1518 elif efi_arch == 'arm'
1519 EFI_MACHINE_TYPE_NAME = 'arm'
1520 gnu_efi_arch = 'arm'
1521 elif efi_arch == 'aarch64'
1522 EFI_MACHINE_TYPE_NAME = 'aa64'
1523 gnu_efi_arch = 'aarch64'
1524 else
1525 EFI_MACHINE_TYPE_NAME = ''
1526 gnu_efi_arch = ''
1527 endif
1528
1529 have = true
1530 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1531
1532 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1533 else
1534 have = false
1535 endif
1536 conf.set10('ENABLE_EFI', have)
1537
1538 #####################################################################
1539
1540 config_h = configure_file(
1541 output : 'config.h',
1542 configuration : conf)
1543
1544 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1545
1546 includes = include_directories('src/basic',
1547 'src/boot',
1548 'src/home',
1549 'src/shared',
1550 'src/systemd',
1551 'src/journal',
1552 'src/journal-remote',
1553 'src/nspawn',
1554 'src/resolve',
1555 'src/timesync',
1556 'src/time-wait-sync',
1557 'src/login',
1558 'src/udev',
1559 'src/libudev',
1560 'src/core',
1561 'src/shutdown',
1562 'src/xdg-autostart-generator',
1563 'src/libsystemd/sd-bus',
1564 'src/libsystemd/sd-device',
1565 'src/libsystemd/sd-event',
1566 'src/libsystemd/sd-hwdb',
1567 'src/libsystemd/sd-id128',
1568 'src/libsystemd/sd-netlink',
1569 'src/libsystemd/sd-network',
1570 'src/libsystemd/sd-resolve',
1571 'src/libsystemd-network',
1572 '.')
1573
1574 add_project_arguments('-include', 'config.h', language : 'c')
1575
1576 generate_gperfs = find_program('tools/generate-gperfs.py')
1577
1578 subdir('po')
1579 subdir('catalog')
1580 subdir('src/systemd')
1581 subdir('src/basic')
1582 subdir('src/libsystemd')
1583 subdir('src/libsystemd-network')
1584 subdir('src/journal')
1585 subdir('src/login')
1586
1587 libjournal_core = static_library(
1588 'journal-core',
1589 libjournal_core_sources,
1590 journald_gperf_c,
1591 include_directories : includes,
1592 install : false)
1593
1594 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1595 libsystemd = shared_library(
1596 'systemd',
1597 disable_mempool_c,
1598 version : libsystemd_version,
1599 include_directories : includes,
1600 link_args : ['-shared',
1601 '-Wl,--version-script=' + libsystemd_sym_path],
1602 link_with : [libbasic,
1603 libbasic_gcrypt],
1604 link_whole : [libsystemd_static,
1605 libjournal_client],
1606 dependencies : [threads,
1607 librt,
1608 libxz,
1609 libzstd,
1610 liblz4],
1611 link_depends : libsystemd_sym,
1612 install : true,
1613 install_dir : rootlibdir)
1614
1615 static_libsystemd = get_option('static-libsystemd')
1616 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1617
1618 install_libsystemd_static = static_library(
1619 'systemd',
1620 libsystemd_sources,
1621 journal_client_sources,
1622 basic_sources,
1623 basic_gcrypt_sources,
1624 disable_mempool_c,
1625 include_directories : includes,
1626 build_by_default : static_libsystemd != 'false',
1627 install : static_libsystemd != 'false',
1628 install_dir : rootlibdir,
1629 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1630 dependencies : [threads,
1631 librt,
1632 libxz,
1633 libzstd,
1634 liblz4,
1635 libcap,
1636 libblkid,
1637 libmount,
1638 libselinux,
1639 libgcrypt],
1640 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1641
1642 ############################################################
1643
1644 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1645 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1646 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1647 make_directive_index_py = find_program('tools/make-directive-index.py')
1648 make_man_index_py = find_program('tools/make-man-index.py')
1649 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1650 xml_helper_py = find_program('tools/xml_helper.py')
1651 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1652
1653 ############################################################
1654
1655 # binaries that have --help and are intended for use by humans,
1656 # usually, but not always, installed in /bin.
1657 public_programs = []
1658
1659 subdir('src/libudev')
1660 subdir('src/shared')
1661 subdir('src/core')
1662 subdir('src/shutdown')
1663 subdir('src/udev')
1664 subdir('src/network')
1665
1666 subdir('src/analyze')
1667 subdir('src/journal-remote')
1668 subdir('src/coredump')
1669 subdir('src/pstore')
1670 subdir('src/hostname')
1671 subdir('src/import')
1672 subdir('src/partition')
1673 subdir('src/kernel-install')
1674 subdir('src/locale')
1675 subdir('src/machine')
1676 subdir('src/portable')
1677 subdir('src/userdb')
1678 subdir('src/home')
1679 subdir('src/nspawn')
1680 subdir('src/resolve')
1681 subdir('src/timedate')
1682 subdir('src/timesync')
1683 subdir('src/tmpfiles')
1684 subdir('src/vconsole')
1685 subdir('src/boot/efi')
1686
1687 subdir('src/test')
1688 subdir('src/fuzz')
1689 subdir('rules.d')
1690 subdir('test')
1691
1692 ############################################################
1693
1694 # only static linking apart from libdl, to make sure that the
1695 # module is linked to all libraries that it uses.
1696 test_dlopen = executable(
1697 'test-dlopen',
1698 test_dlopen_c,
1699 disable_mempool_c,
1700 include_directories : includes,
1701 link_with : [libbasic],
1702 dependencies : [libdl],
1703 build_by_default : want_tests != 'false')
1704
1705 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1706 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1707 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1708 ['resolve', 'ENABLE_NSS_RESOLVE']]
1709
1710 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1711 if condition
1712 module = tuple[0]
1713
1714 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1715 version_script_arg = join_paths(project_source_root, sym)
1716
1717 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1718 if tuple.length() > 2
1719 sources += tuple[2].split()
1720 endif
1721
1722 nss = shared_library(
1723 'nss_' + module,
1724 sources,
1725 disable_mempool_c,
1726 version : '2',
1727 include_directories : includes,
1728 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1729 link_args : ['-Wl,-z,nodelete',
1730 '-shared',
1731 '-Wl,--version-script=' + version_script_arg],
1732 link_with : [libsystemd_static,
1733 libshared_static,
1734 libbasic],
1735 dependencies : [threads,
1736 librt],
1737 link_depends : sym,
1738 install : true,
1739 install_dir : rootlibdir)
1740
1741 # We cannot use shared_module because it does not support version suffix.
1742 # Unfortunately shared_library insists on creating the symlink…
1743 meson.add_install_script('sh', '-c',
1744 'rm $DESTDIR@0@/libnss_@1@.so'
1745 .format(rootlibdir, module))
1746
1747 if want_tests != 'false'
1748 test('dlopen-nss_' + module,
1749 test_dlopen,
1750 # path to dlopen must include a slash
1751 args : nss.full_path())
1752 endif
1753 endif
1754 endforeach
1755
1756 ############################################################
1757
1758 executable(
1759 'systemd',
1760 systemd_sources,
1761 include_directories : includes,
1762 link_with : [libcore,
1763 libshared],
1764 dependencies : [versiondep,
1765 threads,
1766 librt,
1767 libseccomp,
1768 libselinux,
1769 libmount,
1770 libblkid],
1771 install_rpath : rootlibexecdir,
1772 install : true,
1773 install_dir : rootlibexecdir)
1774
1775 meson.add_install_script(meson_make_symlink,
1776 join_paths(rootlibexecdir, 'systemd'),
1777 join_paths(rootsbindir, 'init'))
1778
1779 public_programs += executable(
1780 'systemd-analyze',
1781 systemd_analyze_sources,
1782 include_directories : includes,
1783 link_with : [libcore,
1784 libshared],
1785 dependencies : [versiondep,
1786 threads,
1787 librt,
1788 libseccomp,
1789 libselinux,
1790 libmount,
1791 libblkid],
1792 install_rpath : rootlibexecdir,
1793 install : conf.get('ENABLE_ANALYZE'))
1794
1795 executable(
1796 'systemd-journald',
1797 systemd_journald_sources,
1798 include_directories : includes,
1799 link_with : [libjournal_core,
1800 libshared],
1801 dependencies : [threads,
1802 libxz,
1803 liblz4,
1804 libselinux,
1805 libzstd],
1806 install_rpath : rootlibexecdir,
1807 install : true,
1808 install_dir : rootlibexecdir)
1809
1810 public_programs += executable(
1811 'systemd-cat',
1812 systemd_cat_sources,
1813 include_directories : includes,
1814 link_with : [libjournal_core,
1815 libshared],
1816 dependencies : [threads],
1817 install_rpath : rootlibexecdir,
1818 install : true)
1819
1820 public_programs += executable(
1821 'journalctl',
1822 journalctl_sources,
1823 include_directories : includes,
1824 link_with : [libshared],
1825 dependencies : [threads,
1826 libdl,
1827 libxz,
1828 liblz4,
1829 libzstd,
1830 libdl],
1831 install_rpath : rootlibexecdir,
1832 install : true,
1833 install_dir : rootbindir)
1834
1835 executable(
1836 'systemd-getty-generator',
1837 'src/getty-generator/getty-generator.c',
1838 include_directories : includes,
1839 link_with : [libshared],
1840 install_rpath : rootlibexecdir,
1841 install : true,
1842 install_dir : systemgeneratordir)
1843
1844 executable(
1845 'systemd-debug-generator',
1846 'src/debug-generator/debug-generator.c',
1847 include_directories : includes,
1848 link_with : [libshared],
1849 install_rpath : rootlibexecdir,
1850 install : true,
1851 install_dir : systemgeneratordir)
1852
1853 executable(
1854 'systemd-run-generator',
1855 'src/run-generator/run-generator.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1859 install : true,
1860 install_dir : systemgeneratordir)
1861
1862 executable(
1863 'systemd-fstab-generator',
1864 'src/fstab-generator/fstab-generator.c',
1865 include_directories : includes,
1866 link_with : [libcore_shared,
1867 libshared],
1868 install_rpath : rootlibexecdir,
1869 install : true,
1870 install_dir : systemgeneratordir)
1871
1872 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1873 executable(
1874 '30-systemd-environment-d-generator',
1875 'src/environment-d-generator/environment-d-generator.c',
1876 include_directories : includes,
1877 link_with : [libshared],
1878 install_rpath : rootlibexecdir,
1879 install : true,
1880 install_dir : userenvgeneratordir)
1881
1882 meson.add_install_script(meson_make_symlink,
1883 join_paths(sysconfdir, 'environment'),
1884 join_paths(environmentdir, '99-environment.conf'))
1885 endif
1886
1887 if conf.get('ENABLE_HIBERNATE') == 1
1888 executable(
1889 'systemd-hibernate-resume-generator',
1890 'src/hibernate-resume/hibernate-resume-generator.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 install_rpath : rootlibexecdir,
1894 install : true,
1895 install_dir : systemgeneratordir)
1896
1897 executable(
1898 'systemd-hibernate-resume',
1899 'src/hibernate-resume/hibernate-resume.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 install_rpath : rootlibexecdir,
1903 install : true,
1904 install_dir : rootlibexecdir)
1905 endif
1906
1907 if conf.get('HAVE_BLKID') == 1
1908 executable(
1909 'systemd-gpt-auto-generator',
1910 'src/gpt-auto-generator/gpt-auto-generator.c',
1911 'src/shared/blkid-util.h',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 dependencies : libblkid,
1915 install_rpath : rootlibexecdir,
1916 install : true,
1917 install_dir : systemgeneratordir)
1918
1919 public_programs += executable(
1920 'systemd-dissect',
1921 'src/dissect/dissect.c',
1922 include_directories : includes,
1923 link_with : [libshared],
1924 install_rpath : rootlibexecdir,
1925 install : true)
1926 endif
1927
1928 if conf.get('ENABLE_RESOLVE') == 1
1929 executable(
1930 'systemd-resolved',
1931 systemd_resolved_sources,
1932 include_directories : includes,
1933 link_with : [libshared,
1934 libbasic_gcrypt,
1935 libsystemd_resolve_core],
1936 dependencies : systemd_resolved_dependencies,
1937 install_rpath : rootlibexecdir,
1938 install : true,
1939 install_dir : rootlibexecdir)
1940
1941 public_programs += executable(
1942 'resolvectl',
1943 resolvectl_sources,
1944 include_directories : includes,
1945 link_with : [libshared,
1946 libbasic_gcrypt,
1947 libsystemd_resolve_core],
1948 dependencies : [threads,
1949 libgpg_error,
1950 libm,
1951 libidn],
1952 install_rpath : rootlibexecdir,
1953 install : true)
1954
1955 meson.add_install_script(meson_make_symlink,
1956 join_paths(bindir, 'resolvectl'),
1957 join_paths(rootsbindir, 'resolvconf'))
1958
1959 meson.add_install_script(meson_make_symlink,
1960 join_paths(bindir, 'resolvectl'),
1961 join_paths(bindir, 'systemd-resolve'))
1962 endif
1963
1964 if conf.get('ENABLE_LOGIND') == 1
1965 executable(
1966 'systemd-logind',
1967 systemd_logind_sources,
1968 include_directories : includes,
1969 link_with : [liblogind_core,
1970 libshared],
1971 dependencies : [threads,
1972 libacl],
1973 install_rpath : rootlibexecdir,
1974 install : true,
1975 install_dir : rootlibexecdir)
1976
1977 public_programs += executable(
1978 'loginctl',
1979 loginctl_sources,
1980 include_directories : includes,
1981 link_with : [libshared],
1982 dependencies : [threads,
1983 liblz4,
1984 libxz,
1985 libzstd],
1986 install_rpath : rootlibexecdir,
1987 install : true,
1988 install_dir : rootbindir)
1989
1990 public_programs += executable(
1991 'systemd-inhibit',
1992 'src/login/inhibit.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 install_rpath : rootlibexecdir,
1996 install : true,
1997 install_dir : rootbindir)
1998
1999 if conf.get('HAVE_PAM') == 1
2000 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
2001 pam_systemd = shared_library(
2002 'pam_systemd',
2003 pam_systemd_c,
2004 name_prefix : '',
2005 include_directories : includes,
2006 link_args : ['-shared',
2007 '-Wl,--version-script=' + version_script_arg],
2008 link_with : [libsystemd_static,
2009 libshared_static],
2010 dependencies : [threads,
2011 libpam,
2012 libpam_misc],
2013 link_depends : pam_systemd_sym,
2014 install : true,
2015 install_dir : pamlibdir)
2016
2017 if want_tests != 'false'
2018 test('dlopen-pam_systemd',
2019 test_dlopen,
2020 # path to dlopen must include a slash
2021 args : pam_systemd.full_path())
2022 endif
2023 endif
2024
2025 executable(
2026 'systemd-user-runtime-dir',
2027 user_runtime_dir_sources,
2028 include_directories : includes,
2029 link_with : [libshared],
2030 install_rpath : rootlibexecdir,
2031 install : true,
2032 install_dir : rootlibexecdir)
2033 endif
2034
2035 if conf.get('HAVE_PAM') == 1
2036 executable(
2037 'systemd-user-sessions',
2038 'src/user-sessions/user-sessions.c',
2039 include_directories : includes,
2040 link_with : [libshared],
2041 install_rpath : rootlibexecdir,
2042 install : true,
2043 install_dir : rootlibexecdir)
2044 endif
2045
2046 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2047 public_programs += executable(
2048 'bootctl',
2049 'src/boot/bootctl.c',
2050 include_directories : includes,
2051 link_with : [libshared],
2052 dependencies : [libblkid],
2053 install_rpath : rootlibexecdir,
2054 install : true)
2055
2056 public_programs += executable(
2057 'systemd-bless-boot',
2058 'src/boot/bless-boot.c',
2059 include_directories : includes,
2060 link_with : [libshared],
2061 dependencies : [libblkid],
2062 install_rpath : rootlibexecdir,
2063 install : true,
2064 install_dir : rootlibexecdir)
2065
2066 executable(
2067 'systemd-bless-boot-generator',
2068 'src/boot/bless-boot-generator.c',
2069 include_directories : includes,
2070 link_with : [libshared],
2071 install_rpath : rootlibexecdir,
2072 install : true,
2073 install_dir : systemgeneratordir)
2074 endif
2075
2076 executable(
2077 'systemd-boot-check-no-failures',
2078 'src/boot/boot-check-no-failures.c',
2079 include_directories : includes,
2080 link_with : [libshared],
2081 dependencies : [libblkid],
2082 install_rpath : rootlibexecdir,
2083 install : true,
2084 install_dir : rootlibexecdir)
2085
2086 public_programs += executable(
2087 'systemd-socket-activate',
2088 'src/activate/activate.c',
2089 include_directories : includes,
2090 link_with : [libshared],
2091 dependencies : [threads],
2092 install_rpath : rootlibexecdir,
2093 install : true)
2094
2095 if get_option('link-systemctl-shared')
2096 systemctl_link_with = [libshared]
2097 else
2098 systemctl_link_with = [libsystemd_static,
2099 libshared_static,
2100 libjournal_client,
2101 libbasic_gcrypt]
2102 endif
2103
2104 public_programs += executable(
2105 'systemctl',
2106 'src/systemctl/systemctl.c',
2107 'src/systemctl/sysv-compat.h',
2108 'src/systemctl/sysv-compat.c',
2109 include_directories : includes,
2110 link_with : systemctl_link_with,
2111 dependencies : [threads,
2112 libcap,
2113 libselinux,
2114 libxz,
2115 liblz4,
2116 libzstd],
2117 install_rpath : rootlibexecdir,
2118 install : true,
2119 install_dir : rootbindir)
2120
2121 if conf.get('ENABLE_PORTABLED') == 1
2122 executable(
2123 'systemd-portabled',
2124 systemd_portabled_sources,
2125 include_directories : includes,
2126 link_with : [libshared],
2127 dependencies : [threads],
2128 install_rpath : rootlibexecdir,
2129 install : true,
2130 install_dir : rootlibexecdir)
2131
2132 public_programs += executable(
2133 'portablectl',
2134 'src/portable/portablectl.c',
2135 include_directories : includes,
2136 link_with : [libshared],
2137 dependencies : [threads],
2138 install_rpath : rootlibexecdir,
2139 install : true,
2140 install_dir : rootbindir)
2141 endif
2142
2143 if conf.get('ENABLE_USERDB') == 1
2144 executable(
2145 'systemd-userwork',
2146 systemd_userwork_sources,
2147 include_directories : includes,
2148 link_with : [libshared],
2149 dependencies : [threads],
2150 install_rpath : rootlibexecdir,
2151 install : true,
2152 install_dir : rootlibexecdir)
2153
2154 executable(
2155 'systemd-userdbd',
2156 systemd_userdbd_sources,
2157 include_directories : includes,
2158 link_with : [libshared],
2159 dependencies : [threads],
2160 install_rpath : rootlibexecdir,
2161 install : true,
2162 install_dir : rootlibexecdir)
2163
2164 public_programs += executable(
2165 'userdbctl',
2166 userdbctl_sources,
2167 include_directories : includes,
2168 link_with : [libshared],
2169 dependencies : [threads],
2170 install_rpath : rootlibexecdir,
2171 install : true,
2172 install_dir : rootbindir)
2173 endif
2174
2175 if conf.get('ENABLE_HOMED') == 1
2176 executable(
2177 'systemd-homework',
2178 systemd_homework_sources,
2179 include_directories : includes,
2180 link_with : [libshared],
2181 dependencies : [threads,
2182 libcryptsetup,
2183 libblkid,
2184 libcrypt,
2185 libopenssl,
2186 libfdisk,
2187 libp11kit,
2188 libfido2],
2189 install_rpath : rootlibexecdir,
2190 install : true,
2191 install_dir : rootlibexecdir)
2192
2193 executable(
2194 'systemd-homed',
2195 systemd_homed_sources,
2196 include_directories : includes,
2197 link_with : [libshared],
2198 dependencies : [threads,
2199 libcrypt,
2200 libopenssl],
2201 install_rpath : rootlibexecdir,
2202 install : true,
2203 install_dir : rootlibexecdir)
2204
2205 public_programs += executable(
2206 'homectl',
2207 homectl_sources,
2208 include_directories : includes,
2209 link_with : [libshared],
2210 dependencies : [threads,
2211 libcrypt,
2212 libopenssl,
2213 libp11kit,
2214 libfido2,
2215 libdl],
2216 install_rpath : rootlibexecdir,
2217 install : true,
2218 install_dir : rootbindir)
2219
2220 if conf.get('HAVE_PAM') == 1
2221 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2222 pam_systemd = shared_library(
2223 'pam_systemd_home',
2224 pam_systemd_home_c,
2225 name_prefix : '',
2226 include_directories : includes,
2227 link_args : ['-shared',
2228 '-Wl,--version-script=' + version_script_arg],
2229 link_with : [libsystemd_static,
2230 libshared_static],
2231 dependencies : [threads,
2232 libpam,
2233 libpam_misc,
2234 libcrypt],
2235 link_depends : pam_systemd_home_sym,
2236 install : true,
2237 install_dir : pamlibdir)
2238 endif
2239 endif
2240
2241 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2242 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2243 meson.add_install_script(meson_make_symlink,
2244 join_paths(rootbindir, 'systemctl'),
2245 join_paths(rootsbindir, alias))
2246 endforeach
2247
2248 meson.add_install_script(meson_make_symlink,
2249 join_paths(rootbindir, 'udevadm'),
2250 join_paths(rootlibexecdir, 'systemd-udevd'))
2251
2252 if conf.get('ENABLE_BACKLIGHT') == 1
2253 executable(
2254 'systemd-backlight',
2255 'src/backlight/backlight.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 install_rpath : rootlibexecdir,
2259 install : true,
2260 install_dir : rootlibexecdir)
2261 endif
2262
2263 if conf.get('ENABLE_RFKILL') == 1
2264 executable(
2265 'systemd-rfkill',
2266 'src/rfkill/rfkill.c',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2270 install : true,
2271 install_dir : rootlibexecdir)
2272 endif
2273
2274 executable(
2275 'systemd-system-update-generator',
2276 'src/system-update-generator/system-update-generator.c',
2277 include_directories : includes,
2278 link_with : [libshared],
2279 install_rpath : rootlibexecdir,
2280 install : true,
2281 install_dir : systemgeneratordir)
2282
2283 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2284 systemd_cryptsetup_sources = files('''
2285 src/cryptsetup/cryptsetup-pkcs11.h
2286 src/cryptsetup/cryptsetup-keyfile.c
2287 src/cryptsetup/cryptsetup-keyfile.h
2288 src/cryptsetup/cryptsetup.c
2289 '''.split())
2290
2291 if conf.get('HAVE_P11KIT') == 1
2292 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2293 endif
2294
2295 executable(
2296 'systemd-cryptsetup',
2297 systemd_cryptsetup_sources,
2298 include_directories : includes,
2299 link_with : [libshared],
2300 dependencies : [libcryptsetup,
2301 libp11kit],
2302 install_rpath : rootlibexecdir,
2303 install : true,
2304 install_dir : rootlibexecdir)
2305
2306 executable(
2307 'systemd-cryptsetup-generator',
2308 'src/cryptsetup/cryptsetup-generator.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2312 install : true,
2313 install_dir : systemgeneratordir)
2314
2315 executable(
2316 'systemd-veritysetup',
2317 'src/veritysetup/veritysetup.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 dependencies : [libcryptsetup],
2321 install_rpath : rootlibexecdir,
2322 install : true,
2323 install_dir : rootlibexecdir)
2324
2325 executable(
2326 'systemd-veritysetup-generator',
2327 'src/veritysetup/veritysetup-generator.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2331 install : true,
2332 install_dir : systemgeneratordir)
2333 endif
2334
2335 if conf.get('HAVE_SYSV_COMPAT') == 1
2336 executable(
2337 'systemd-sysv-generator',
2338 'src/sysv-generator/sysv-generator.c',
2339 include_directories : includes,
2340 link_with : [libshared],
2341 install_rpath : rootlibexecdir,
2342 install : true,
2343 install_dir : systemgeneratordir)
2344
2345 executable(
2346 'systemd-rc-local-generator',
2347 'src/rc-local-generator/rc-local-generator.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2351 install : true,
2352 install_dir : systemgeneratordir)
2353 endif
2354
2355 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2356 executable(
2357 'systemd-xdg-autostart-generator',
2358 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2359 'src/xdg-autostart-generator/xdg-autostart-service.c',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2363 install : true,
2364 install_dir : usergeneratordir)
2365
2366 executable(
2367 'systemd-xdg-autostart-condition',
2368 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2369 include_directories : includes,
2370 link_with : [libshared],
2371 install_rpath : rootlibexecdir,
2372 install : true,
2373 install_dir : rootlibexecdir)
2374 endif
2375
2376 if conf.get('ENABLE_HOSTNAMED') == 1
2377 executable(
2378 'systemd-hostnamed',
2379 'src/hostname/hostnamed.c',
2380 include_directories : includes,
2381 link_with : [libshared],
2382 install_rpath : rootlibexecdir,
2383 install : true,
2384 install_dir : rootlibexecdir)
2385
2386 public_programs += executable(
2387 'hostnamectl',
2388 'src/hostname/hostnamectl.c',
2389 include_directories : includes,
2390 link_with : [libshared],
2391 install_rpath : rootlibexecdir,
2392 install : true)
2393 endif
2394
2395 if conf.get('ENABLE_LOCALED') == 1
2396 if conf.get('HAVE_XKBCOMMON') == 1
2397 # logind will load libxkbcommon.so dynamically on its own
2398 deps = [libdl]
2399 else
2400 deps = []
2401 endif
2402
2403 executable(
2404 'systemd-localed',
2405 systemd_localed_sources,
2406 include_directories : includes,
2407 link_with : [libshared],
2408 dependencies : deps,
2409 install_rpath : rootlibexecdir,
2410 install : true,
2411 install_dir : rootlibexecdir)
2412
2413 public_programs += executable(
2414 'localectl',
2415 localectl_sources,
2416 include_directories : includes,
2417 link_with : [libshared],
2418 install_rpath : rootlibexecdir,
2419 install : true)
2420 endif
2421
2422 if conf.get('ENABLE_TIMEDATED') == 1
2423 executable(
2424 'systemd-timedated',
2425 'src/timedate/timedated.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2429 install : true,
2430 install_dir : rootlibexecdir)
2431 endif
2432
2433 if conf.get('ENABLE_TIMEDATECTL') == 1
2434 public_programs += executable(
2435 'timedatectl',
2436 'src/timedate/timedatectl.c',
2437 include_directories : includes,
2438 install_rpath : rootlibexecdir,
2439 link_with : [libshared],
2440 dependencies : [libm],
2441 install : true)
2442 endif
2443
2444 if conf.get('ENABLE_TIMESYNCD') == 1
2445 if get_option('link-timesyncd-shared')
2446 timesyncd_link_with = [libshared]
2447 else
2448 timesyncd_link_with = [libsystemd_static,
2449 libshared_static,
2450 libjournal_client,
2451 libbasic_gcrypt]
2452 endif
2453
2454 executable(
2455 'systemd-timesyncd',
2456 systemd_timesyncd_sources,
2457 include_directories : includes,
2458 link_with : [timesyncd_link_with],
2459 dependencies : [threads,
2460 libm],
2461 install_rpath : rootlibexecdir,
2462 install : true,
2463 install_dir : rootlibexecdir)
2464
2465 executable(
2466 'systemd-time-wait-sync',
2467 'src/time-wait-sync/time-wait-sync.c',
2468 include_directories : includes,
2469 link_with : [timesyncd_link_with],
2470 install_rpath : rootlibexecdir,
2471 install : true,
2472 install_dir : rootlibexecdir)
2473 endif
2474
2475 if conf.get('ENABLE_MACHINED') == 1
2476 executable(
2477 'systemd-machined',
2478 systemd_machined_sources,
2479 include_directories : includes,
2480 link_with : [libmachine_core,
2481 libshared],
2482 install_rpath : rootlibexecdir,
2483 install : true,
2484 install_dir : rootlibexecdir)
2485
2486 public_programs += executable(
2487 'machinectl',
2488 'src/machine/machinectl.c',
2489 include_directories : includes,
2490 link_with : [libshared],
2491 dependencies : [threads,
2492 libxz,
2493 liblz4,
2494 libzstd],
2495 install_rpath : rootlibexecdir,
2496 install : true,
2497 install_dir : rootbindir)
2498 endif
2499
2500 if conf.get('ENABLE_IMPORTD') == 1
2501 executable(
2502 'systemd-importd',
2503 systemd_importd_sources,
2504 include_directories : includes,
2505 link_with : [libshared],
2506 dependencies : [threads],
2507 install_rpath : rootlibexecdir,
2508 install : true,
2509 install_dir : rootlibexecdir)
2510
2511 systemd_pull = executable(
2512 'systemd-pull',
2513 systemd_pull_sources,
2514 include_directories : includes,
2515 link_with : [libshared],
2516 dependencies : [versiondep,
2517 libcurl,
2518 libz,
2519 libbzip2,
2520 libxz,
2521 libgcrypt],
2522 install_rpath : rootlibexecdir,
2523 install : true,
2524 install_dir : rootlibexecdir)
2525
2526 systemd_import = executable(
2527 'systemd-import',
2528 systemd_import_sources,
2529 include_directories : includes,
2530 link_with : [libshared],
2531 dependencies : [libcurl,
2532 libz,
2533 libbzip2,
2534 libxz],
2535 install_rpath : rootlibexecdir,
2536 install : true,
2537 install_dir : rootlibexecdir)
2538
2539 systemd_import_fs = executable(
2540 'systemd-import-fs',
2541 systemd_import_fs_sources,
2542 include_directories : includes,
2543 link_with : [libshared],
2544 install_rpath : rootlibexecdir,
2545 install : true,
2546 install_dir : rootlibexecdir)
2547
2548 systemd_export = executable(
2549 'systemd-export',
2550 systemd_export_sources,
2551 include_directories : includes,
2552 link_with : [libshared],
2553 dependencies : [libcurl,
2554 libz,
2555 libbzip2,
2556 libxz],
2557 install_rpath : rootlibexecdir,
2558 install : true,
2559 install_dir : rootlibexecdir)
2560
2561 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2562 endif
2563
2564 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2565 public_programs += executable(
2566 'systemd-journal-upload',
2567 systemd_journal_upload_sources,
2568 include_directories : includes,
2569 link_with : [libshared],
2570 dependencies : [versiondep,
2571 threads,
2572 libcurl,
2573 libgnutls,
2574 libxz,
2575 liblz4,
2576 libzstd],
2577 install_rpath : rootlibexecdir,
2578 install : true,
2579 install_dir : rootlibexecdir)
2580 endif
2581
2582 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2583 public_programs += executable(
2584 'systemd-journal-remote',
2585 systemd_journal_remote_sources,
2586 include_directories : includes,
2587 link_with : [libshared,
2588 libsystemd_journal_remote],
2589 dependencies : [threads,
2590 libmicrohttpd,
2591 libgnutls,
2592 libxz,
2593 liblz4,
2594 libzstd],
2595 install_rpath : rootlibexecdir,
2596 install : true,
2597 install_dir : rootlibexecdir)
2598
2599 public_programs += executable(
2600 'systemd-journal-gatewayd',
2601 systemd_journal_gatewayd_sources,
2602 include_directories : includes,
2603 link_with : [libshared],
2604 dependencies : [threads,
2605 libmicrohttpd,
2606 libgnutls,
2607 libxz,
2608 liblz4,
2609 libzstd],
2610 install_rpath : rootlibexecdir,
2611 install : true,
2612 install_dir : rootlibexecdir)
2613 endif
2614
2615 if conf.get('ENABLE_COREDUMP') == 1
2616 executable(
2617 'systemd-coredump',
2618 systemd_coredump_sources,
2619 include_directories : includes,
2620 link_with : [libshared],
2621 dependencies : [threads,
2622 libacl,
2623 libdw,
2624 libxz,
2625 liblz4,
2626 libzstd],
2627 install_rpath : rootlibexecdir,
2628 install : true,
2629 install_dir : rootlibexecdir)
2630
2631 public_programs += executable(
2632 'coredumpctl',
2633 coredumpctl_sources,
2634 include_directories : includes,
2635 link_with : [libshared],
2636 dependencies : [threads,
2637 libxz,
2638 liblz4,
2639 libzstd],
2640 install_rpath : rootlibexecdir,
2641 install : true)
2642 endif
2643
2644 if conf.get('ENABLE_PSTORE') == 1
2645 executable(
2646 'systemd-pstore',
2647 systemd_pstore_sources,
2648 include_directories : includes,
2649 link_with : [libshared],
2650 dependencies : [threads,
2651 libacl,
2652 libdw,
2653 libxz,
2654 liblz4,
2655 libzstd],
2656 install_rpath : rootlibexecdir,
2657 install : true,
2658 install_dir : rootlibexecdir)
2659 endif
2660
2661 if conf.get('ENABLE_BINFMT') == 1
2662 public_programs += executable(
2663 'systemd-binfmt',
2664 'src/binfmt/binfmt.c',
2665 include_directories : includes,
2666 link_with : [libshared],
2667 install_rpath : rootlibexecdir,
2668 install : true,
2669 install_dir : rootlibexecdir)
2670
2671 meson.add_install_script('sh', '-c',
2672 mkdir_p.format(binfmtdir))
2673 meson.add_install_script('sh', '-c',
2674 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2675 endif
2676
2677 if conf.get('ENABLE_REPART') == 1
2678 exe = executable(
2679 'systemd-repart',
2680 systemd_repart_sources,
2681 include_directories : includes,
2682 link_with : [libshared],
2683 dependencies : [threads,
2684 libblkid,
2685 libfdisk,
2686 libopenssl],
2687 install_rpath : rootlibexecdir,
2688 install : true,
2689 install_dir : rootbindir)
2690 public_programs += exe
2691
2692 if want_tests != 'false'
2693 test('test-repart',
2694 test_repart_sh,
2695 args : exe.full_path())
2696 endif
2697 endif
2698
2699 if conf.get('ENABLE_VCONSOLE') == 1
2700 executable(
2701 'systemd-vconsole-setup',
2702 'src/vconsole/vconsole-setup.c',
2703 include_directories : includes,
2704 link_with : [libshared],
2705 install_rpath : rootlibexecdir,
2706 install : true,
2707 install_dir : rootlibexecdir)
2708 endif
2709
2710 if conf.get('ENABLE_RANDOMSEED') == 1
2711 executable(
2712 'systemd-random-seed',
2713 'src/random-seed/random-seed.c',
2714 include_directories : includes,
2715 link_with : [libshared],
2716 install_rpath : rootlibexecdir,
2717 install : true,
2718 install_dir : rootlibexecdir)
2719 endif
2720
2721 if conf.get('ENABLE_FIRSTBOOT') == 1
2722 executable(
2723 'systemd-firstboot',
2724 'src/firstboot/firstboot.c',
2725 include_directories : includes,
2726 link_with : [libshared],
2727 dependencies : [libcrypt],
2728 install_rpath : rootlibexecdir,
2729 install : true,
2730 install_dir : rootbindir)
2731 endif
2732
2733 executable(
2734 'systemd-remount-fs',
2735 'src/remount-fs/remount-fs.c',
2736 include_directories : includes,
2737 link_with : [libcore_shared,
2738 libshared],
2739 install_rpath : rootlibexecdir,
2740 install : true,
2741 install_dir : rootlibexecdir)
2742
2743 executable(
2744 'systemd-machine-id-setup',
2745 'src/machine-id-setup/machine-id-setup-main.c',
2746 include_directories : includes,
2747 link_with : [libcore_shared,
2748 libshared],
2749 install_rpath : rootlibexecdir,
2750 install : true,
2751 install_dir : rootbindir)
2752
2753 executable(
2754 'systemd-fsck',
2755 'src/fsck/fsck.c',
2756 include_directories : includes,
2757 link_with : [libshared],
2758 install_rpath : rootlibexecdir,
2759 install : true,
2760 install_dir : rootlibexecdir)
2761
2762 executable('systemd-growfs',
2763 'src/partition/growfs.c',
2764 include_directories : includes,
2765 link_with : [libshared],
2766 install_rpath : rootlibexecdir,
2767 install : true,
2768 install_dir : rootlibexecdir)
2769
2770 executable(
2771 'systemd-makefs',
2772 'src/partition/makefs.c',
2773 include_directories : includes,
2774 link_with : [libshared],
2775 install_rpath : rootlibexecdir,
2776 install : true,
2777 install_dir : rootlibexecdir)
2778
2779 executable(
2780 'systemd-sleep',
2781 'src/sleep/sleep.c',
2782 include_directories : includes,
2783 link_with : [libshared],
2784 install_rpath : rootlibexecdir,
2785 install : true,
2786 install_dir : rootlibexecdir)
2787
2788 install_data('src/sleep/sleep.conf',
2789 install_dir : pkgsysconfdir)
2790
2791 public_programs += executable(
2792 'systemd-sysctl',
2793 'src/sysctl/sysctl.c',
2794 include_directories : includes,
2795 link_with : [libshared],
2796 install_rpath : rootlibexecdir,
2797 install : true,
2798 install_dir : rootlibexecdir)
2799
2800 executable(
2801 'systemd-ac-power',
2802 'src/ac-power/ac-power.c',
2803 include_directories : includes,
2804 link_with : [libshared],
2805 install_rpath : rootlibexecdir,
2806 install : true,
2807 install_dir : rootlibexecdir)
2808
2809 public_programs += executable(
2810 'systemd-detect-virt',
2811 'src/detect-virt/detect-virt.c',
2812 include_directories : includes,
2813 link_with : [libshared],
2814 install_rpath : rootlibexecdir,
2815 install : true)
2816
2817 public_programs += executable(
2818 'systemd-delta',
2819 'src/delta/delta.c',
2820 include_directories : includes,
2821 link_with : [libshared],
2822 install_rpath : rootlibexecdir,
2823 install : true)
2824
2825 public_programs += executable(
2826 'systemd-escape',
2827 'src/escape/escape.c',
2828 include_directories : includes,
2829 link_with : [libshared],
2830 install_rpath : rootlibexecdir,
2831 install : true,
2832 install_dir : rootbindir)
2833
2834 public_programs += executable(
2835 'systemd-notify',
2836 'src/notify/notify.c',
2837 include_directories : includes,
2838 link_with : [libshared],
2839 install_rpath : rootlibexecdir,
2840 install : true,
2841 install_dir : rootbindir)
2842
2843 executable(
2844 'systemd-volatile-root',
2845 'src/volatile-root/volatile-root.c',
2846 include_directories : includes,
2847 link_with : [libshared],
2848 install_rpath : rootlibexecdir,
2849 install : conf.get('ENABLE_INITRD') == 1,
2850 install_dir : rootlibexecdir)
2851
2852 executable(
2853 'systemd-cgroups-agent',
2854 'src/cgroups-agent/cgroups-agent.c',
2855 include_directories : includes,
2856 link_with : [libshared],
2857 install_rpath : rootlibexecdir,
2858 install : true,
2859 install_dir : rootlibexecdir)
2860
2861 public_programs += executable(
2862 'systemd-id128',
2863 'src/id128/id128.c',
2864 include_directories : includes,
2865 link_with : [libshared],
2866 install_rpath : rootlibexecdir,
2867 install : true)
2868
2869 public_programs += executable(
2870 'systemd-path',
2871 'src/path/path.c',
2872 include_directories : includes,
2873 link_with : [libshared],
2874 install_rpath : rootlibexecdir,
2875 install : true)
2876
2877 public_programs += executable(
2878 'systemd-ask-password',
2879 'src/ask-password/ask-password.c',
2880 include_directories : includes,
2881 link_with : [libshared],
2882 install_rpath : rootlibexecdir,
2883 install : true,
2884 install_dir : rootbindir)
2885
2886 executable(
2887 'systemd-reply-password',
2888 'src/reply-password/reply-password.c',
2889 include_directories : includes,
2890 link_with : [libshared],
2891 install_rpath : rootlibexecdir,
2892 install : true,
2893 install_dir : rootlibexecdir)
2894
2895 public_programs += executable(
2896 'systemd-tty-ask-password-agent',
2897 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2898 include_directories : includes,
2899 link_with : [libshared],
2900 install_rpath : rootlibexecdir,
2901 install : true,
2902 install_dir : rootbindir)
2903
2904 public_programs += executable(
2905 'systemd-cgls',
2906 'src/cgls/cgls.c',
2907 include_directories : includes,
2908 link_with : [libshared],
2909 install_rpath : rootlibexecdir,
2910 install : true)
2911
2912 public_programs += executable(
2913 'systemd-cgtop',
2914 'src/cgtop/cgtop.c',
2915 include_directories : includes,
2916 link_with : [libshared],
2917 install_rpath : rootlibexecdir,
2918 install : true)
2919
2920 executable(
2921 'systemd-initctl',
2922 'src/initctl/initctl.c',
2923 include_directories : includes,
2924 link_with : [libshared],
2925 install_rpath : rootlibexecdir,
2926 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2927 install_dir : rootlibexecdir)
2928
2929 public_programs += executable(
2930 'systemd-mount',
2931 'src/mount/mount-tool.c',
2932 include_directories : includes,
2933 link_with : [libshared],
2934 dependencies: [libmount],
2935 install_rpath : rootlibexecdir,
2936 install : true)
2937
2938 meson.add_install_script(meson_make_symlink,
2939 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2940
2941 public_programs += executable(
2942 'systemd-run',
2943 'src/run/run.c',
2944 include_directories : includes,
2945 link_with : [libshared],
2946 install_rpath : rootlibexecdir,
2947 install : true)
2948
2949 public_programs += executable(
2950 'systemd-stdio-bridge',
2951 'src/stdio-bridge/stdio-bridge.c',
2952 include_directories : includes,
2953 link_with : [libshared],
2954 dependencies : [versiondep],
2955 install_rpath : rootlibexecdir,
2956 install : true)
2957
2958 public_programs += executable(
2959 'busctl',
2960 'src/busctl/busctl.c',
2961 'src/busctl/busctl-introspect.c',
2962 'src/busctl/busctl-introspect.h',
2963 include_directories : includes,
2964 link_with : [libshared],
2965 install_rpath : rootlibexecdir,
2966 install : true)
2967
2968 if conf.get('ENABLE_SYSUSERS') == 1
2969 public_programs += executable(
2970 'systemd-sysusers',
2971 'src/sysusers/sysusers.c',
2972 include_directories : includes,
2973 link_with : [libshared],
2974 install_rpath : rootlibexecdir,
2975 install : true,
2976 install_dir : rootbindir)
2977
2978 if have_standalone_binaries
2979 public_programs += executable(
2980 'systemd-sysusers.standalone',
2981 'src/sysusers/sysusers.c',
2982 include_directories : includes,
2983 link_with : [libshared_static,
2984 libbasic,
2985 libbasic_gcrypt,
2986 libsystemd_static,
2987 libjournal_client],
2988 install : true,
2989 install_dir : rootbindir)
2990 endif
2991 endif
2992
2993 if conf.get('ENABLE_TMPFILES') == 1
2994 exe = executable(
2995 'systemd-tmpfiles',
2996 systemd_tmpfiles_sources,
2997 include_directories : includes,
2998 link_with : [libshared],
2999 dependencies : [libacl],
3000 install_rpath : rootlibexecdir,
3001 install : true,
3002 install_dir : rootbindir)
3003 public_programs += exe
3004
3005 if want_tests != 'false'
3006 test('test-systemd-tmpfiles',
3007 test_systemd_tmpfiles_py,
3008 # https://github.com/mesonbuild/meson/issues/2681
3009 args : exe.full_path())
3010 endif
3011
3012 if have_standalone_binaries
3013 public_programs += executable(
3014 'systemd-tmpfiles.standalone',
3015 systemd_tmpfiles_sources,
3016 include_directories : includes,
3017 link_with : [libshared_static,
3018 libbasic,
3019 libbasic_gcrypt,
3020 libsystemd_static,
3021 libjournal_client],
3022 dependencies : [libacl],
3023 install : true,
3024 install_dir : rootbindir)
3025 endif
3026 endif
3027
3028 if conf.get('ENABLE_HWDB') == 1
3029 public_programs += executable(
3030 'systemd-hwdb',
3031 'src/hwdb/hwdb.c',
3032 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3033 include_directories : includes,
3034 link_with : [libudev_static],
3035 install_rpath : udev_rpath,
3036 install : true,
3037 install_dir : rootbindir)
3038 endif
3039
3040 if conf.get('ENABLE_QUOTACHECK') == 1
3041 executable(
3042 'systemd-quotacheck',
3043 'src/quotacheck/quotacheck.c',
3044 include_directories : includes,
3045 link_with : [libshared],
3046 install_rpath : rootlibexecdir,
3047 install : true,
3048 install_dir : rootlibexecdir)
3049 endif
3050
3051 public_programs += executable(
3052 'systemd-socket-proxyd',
3053 'src/socket-proxy/socket-proxyd.c',
3054 include_directories : includes,
3055 link_with : [libshared],
3056 dependencies : [threads],
3057 install_rpath : rootlibexecdir,
3058 install : true,
3059 install_dir : rootlibexecdir)
3060
3061 public_programs += executable(
3062 'udevadm',
3063 udevadm_sources,
3064 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3065 include_directories : includes,
3066 link_with : [libudev_core,
3067 libsystemd_network,
3068 libudev_static],
3069 dependencies : [versiondep,
3070 threads,
3071 libkmod,
3072 libidn,
3073 libacl,
3074 libblkid],
3075 install_rpath : udev_rpath,
3076 install : true,
3077 install_dir : rootbindir)
3078
3079 executable(
3080 'systemd-shutdown',
3081 systemd_shutdown_sources,
3082 include_directories : includes,
3083 link_with : [libcore_shared,
3084 libshared],
3085 dependencies : [libmount],
3086 install_rpath : rootlibexecdir,
3087 install : true,
3088 install_dir : rootlibexecdir)
3089
3090 executable(
3091 'systemd-update-done',
3092 'src/update-done/update-done.c',
3093 include_directories : includes,
3094 link_with : [libshared],
3095 install_rpath : rootlibexecdir,
3096 install : true,
3097 install_dir : rootlibexecdir)
3098
3099 executable(
3100 'systemd-update-utmp',
3101 'src/update-utmp/update-utmp.c',
3102 include_directories : includes,
3103 link_with : [libshared],
3104 dependencies : [libaudit],
3105 install_rpath : rootlibexecdir,
3106 install : (conf.get('ENABLE_UTMP') == 1),
3107 install_dir : rootlibexecdir)
3108
3109 if conf.get('HAVE_KMOD') == 1
3110 executable(
3111 'systemd-modules-load',
3112 'src/modules-load/modules-load.c',
3113 include_directories : includes,
3114 link_with : [libshared],
3115 dependencies : [libkmod],
3116 install_rpath : rootlibexecdir,
3117 install : true,
3118 install_dir : rootlibexecdir)
3119
3120 meson.add_install_script('sh', '-c',
3121 mkdir_p.format(modulesloaddir))
3122 meson.add_install_script('sh', '-c',
3123 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3124 endif
3125
3126 public_programs += executable(
3127 'systemd-nspawn',
3128 systemd_nspawn_sources,
3129 include_directories : includes,
3130 link_with : [libcore_shared,
3131 libnspawn_core,
3132 libshared],
3133 dependencies : [libblkid,
3134 libseccomp],
3135 install_rpath : rootlibexecdir,
3136 install : true)
3137
3138 if conf.get('ENABLE_NETWORKD') == 1
3139 executable(
3140 'systemd-networkd',
3141 systemd_networkd_sources,
3142 include_directories : network_include_dir,
3143 link_with : [libnetworkd_core,
3144 libsystemd_network,
3145 libudev_static,
3146 networkd_link_with],
3147 dependencies : [threads],
3148 install_rpath : rootlibexecdir,
3149 install : true,
3150 install_dir : rootlibexecdir)
3151
3152 executable(
3153 'systemd-networkd-wait-online',
3154 systemd_networkd_wait_online_sources,
3155 include_directories : includes,
3156 link_with : [libnetworkd_core,
3157 networkd_link_with],
3158 install_rpath : rootlibexecdir,
3159 install : true,
3160 install_dir : rootlibexecdir)
3161
3162 public_programs += executable(
3163 'networkctl',
3164 networkctl_sources,
3165 include_directories : includes,
3166 link_with : [libsystemd_network,
3167 networkd_link_with],
3168 install_rpath : rootlibexecdir,
3169 install : true,
3170 install_dir : rootbindir)
3171
3172 exe = executable(
3173 'systemd-network-generator',
3174 network_generator_sources,
3175 include_directories : includes,
3176 link_with : [networkd_link_with],
3177 install_rpath : rootlibexecdir,
3178 install : true,
3179 install_dir : rootlibexecdir)
3180
3181 if want_tests != 'false'
3182 test('test-network-generator-conversion',
3183 test_network_generator_conversion_sh,
3184 # https://github.com/mesonbuild/meson/issues/2681
3185 args : exe.full_path())
3186 endif
3187 endif
3188
3189 executable(
3190 'systemd-sulogin-shell',
3191 ['src/sulogin-shell/sulogin-shell.c'],
3192 include_directories : includes,
3193 link_with : [libshared],
3194 install_rpath : rootlibexecdir,
3195 install : true,
3196 install_dir : rootlibexecdir)
3197
3198 ############################################################
3199
3200 custom_target(
3201 'systemd-runtest.env',
3202 output : 'systemd-runtest.env',
3203 command : ['sh', '-c', '{ ' +
3204 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3205 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3206 '} >@OUTPUT@'],
3207 build_by_default : true)
3208
3209 foreach tuple : tests
3210 sources = tuple[0]
3211 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3212 dependencies = tuple[2]
3213 condition = tuple.length() >= 4 ? tuple[3] : ''
3214 type = tuple.length() >= 5 ? tuple[4] : ''
3215 defs = tuple.length() >= 6 ? tuple[5] : []
3216 incs = tuple.length() >= 7 ? tuple[6] : includes
3217 timeout = 30
3218
3219 name = sources[0].split('/')[-1].split('.')[0]
3220 if type.startswith('timeout=')
3221 timeout = type.split('=')[1].to_int()
3222 type = ''
3223 endif
3224
3225 if condition == '' or conf.get(condition) == 1
3226 exe = executable(
3227 name,
3228 sources,
3229 include_directories : incs,
3230 link_with : link_with,
3231 dependencies : [versiondep,
3232 dependencies],
3233 c_args : defs,
3234 build_by_default : want_tests != 'false',
3235 install_rpath : rootlibexecdir,
3236 install : install_tests,
3237 install_dir : join_paths(testsdir, type))
3238
3239 if type == 'manual'
3240 message('@0@ is a manual test'.format(name))
3241 elif type == 'unsafe' and want_tests != 'unsafe'
3242 message('@0@ is an unsafe test'.format(name))
3243 elif want_tests != 'false'
3244 test(name, exe,
3245 env : test_env,
3246 timeout : timeout)
3247 endif
3248 else
3249 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3250 endif
3251 endforeach
3252
3253 exe = executable(
3254 'test-libsystemd-sym',
3255 test_libsystemd_sym_c,
3256 include_directories : includes,
3257 link_with : [libsystemd],
3258 build_by_default : want_tests != 'false',
3259 install : install_tests,
3260 install_dir : testsdir)
3261 if want_tests != 'false'
3262 test('test-libsystemd-sym', exe)
3263 endif
3264
3265 exe = executable(
3266 'test-libsystemd-static-sym',
3267 test_libsystemd_sym_c,
3268 include_directories : includes,
3269 link_with : [install_libsystemd_static],
3270 dependencies : [threads], # threads is already included in dependencies on the library,
3271 # but does not seem to get propagated. Add here as a work-around.
3272 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3273 install : install_tests and static_libsystemd_pic,
3274 install_dir : testsdir)
3275 if want_tests != 'false' and static_libsystemd_pic
3276 test('test-libsystemd-static-sym', exe)
3277 endif
3278
3279 exe = executable(
3280 'test-libudev-sym',
3281 test_libudev_sym_c,
3282 include_directories : includes,
3283 c_args : '-Wno-deprecated-declarations',
3284 link_with : [libudev],
3285 build_by_default : want_tests != 'false',
3286 install : install_tests,
3287 install_dir : testsdir)
3288 if want_tests != 'false'
3289 test('test-libudev-sym', exe)
3290 endif
3291
3292 exe = executable(
3293 'test-libudev-static-sym',
3294 test_libudev_sym_c,
3295 include_directories : includes,
3296 c_args : '-Wno-deprecated-declarations',
3297 link_with : [install_libudev_static],
3298 build_by_default : want_tests != 'false' and static_libudev_pic,
3299 install : install_tests and static_libudev_pic,
3300 install_dir : testsdir)
3301 if want_tests != 'false' and static_libudev_pic
3302 test('test-libudev-static-sym', exe)
3303 endif
3304
3305 ############################################################
3306
3307 fuzzer_exes = []
3308
3309 if get_option('tests') != 'false'
3310 foreach tuple : fuzzers
3311 sources = tuple[0]
3312 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3313 dependencies = tuple[2]
3314 defs = tuple.length() >= 4 ? tuple[3] : []
3315 incs = tuple.length() >= 5 ? tuple[4] : includes
3316 link_args = []
3317
3318 if want_ossfuzz
3319 dependencies += fuzzing_engine
3320 elif want_libfuzzer
3321 if fuzzing_engine.found()
3322 dependencies += fuzzing_engine
3323 else
3324 link_args += ['-fsanitize=fuzzer']
3325 endif
3326 else
3327 sources += 'src/fuzz/fuzz-main.c'
3328 endif
3329
3330 name = sources[0].split('/')[-1].split('.')[0]
3331
3332 fuzzer_exes += executable(
3333 name,
3334 sources,
3335 include_directories : [incs, include_directories('src/fuzz')],
3336 link_with : link_with,
3337 dependencies : dependencies,
3338 c_args : defs,
3339 link_args: link_args,
3340 install : false)
3341 endforeach
3342 endif
3343
3344 run_target(
3345 'fuzzers',
3346 depends : fuzzer_exes,
3347 command : ['true'])
3348
3349 ############################################################
3350
3351 subdir('sysctl.d')
3352 subdir('sysusers.d')
3353 subdir('tmpfiles.d')
3354 subdir('hwdb.d')
3355 subdir('units')
3356 subdir('presets')
3357 subdir('network')
3358 subdir('man')
3359 subdir('shell-completion/bash')
3360 subdir('shell-completion/zsh')
3361 subdir('docs/sysvinit')
3362 subdir('docs/var-log')
3363
3364 install_subdir('factory/etc',
3365 install_dir : factorydir)
3366
3367 install_data('xorg/50-systemd-user.sh',
3368 install_dir : xinitrcdir)
3369 install_data('modprobe.d/systemd.conf',
3370 install_dir : modprobedir)
3371 install_data('LICENSE.GPL2',
3372 'LICENSE.LGPL2.1',
3373 'NEWS',
3374 'README',
3375 'docs/CODING_STYLE.md',
3376 'docs/DISTRO_PORTING.md',
3377 'docs/ENVIRONMENT.md',
3378 'docs/HACKING.md',
3379 'docs/TRANSIENT-SETTINGS.md',
3380 'docs/TRANSLATORS.md',
3381 'docs/UIDS-GIDS.md',
3382 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3383 install_dir : docdir)
3384
3385 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3386 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3387
3388 ############################################################
3389
3390 check_help = find_program('tools/check-help.sh')
3391
3392 foreach exec : public_programs
3393 name = exec.full_path().split('/')[-1]
3394 if want_tests != 'false'
3395 test('check-help-' + name,
3396 check_help,
3397 args : exec.full_path())
3398 endif
3399 endforeach
3400
3401 ############################################################
3402
3403 check_directives_sh = find_program('tools/check-directives.sh')
3404
3405 if want_tests != 'false'
3406 test('check-directives',
3407 check_directives_sh,
3408 args : project_source_root)
3409 endif
3410
3411 ############################################################
3412
3413 # Enable tests for all supported sanitizers
3414 foreach tuple : sanitizers
3415 sanitizer = tuple[0]
3416 build = tuple[1]
3417
3418 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3419 prev = ''
3420 foreach p : fuzz_regression_tests
3421 b = p.split('/')[-2]
3422 c = p.split('/')[-1]
3423
3424 name = '@0@:@1@'.format(b, sanitizer)
3425
3426 if name != prev
3427 if want_tests == 'false'
3428 message('Not compiling @0@ because tests is set to false'.format(name))
3429 elif slow_tests or fuzz_tests
3430 exe = custom_target(
3431 name,
3432 output : name,
3433 depends : build,
3434 command : [env, 'ln', '-fs',
3435 join_paths(build.full_path(), b),
3436 '@OUTPUT@'],
3437 build_by_default : true)
3438 else
3439 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3440 endif
3441 endif
3442 prev = name
3443
3444 if want_tests != 'false' and (slow_tests or fuzz_tests)
3445 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3446 env,
3447 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3448 timeout : 60,
3449 args : [exe.full_path(),
3450 join_paths(project_source_root, p)])
3451 endif
3452 endforeach
3453 endif
3454 endforeach
3455
3456
3457 ############################################################
3458
3459 if git.found()
3460 all_files = run_command(
3461 git,
3462 ['--git-dir=@0@/.git'.format(project_source_root),
3463 'ls-files',
3464 ':/*.[ch]'])
3465 all_files = files(all_files.stdout().split())
3466
3467 custom_target(
3468 'tags',
3469 output : 'tags',
3470 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3471 run_target(
3472 'ctags',
3473 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3474 endif
3475
3476 if git.found()
3477 git_contrib_sh = find_program('tools/git-contrib.sh')
3478 run_target(
3479 'git-contrib',
3480 command : [git_contrib_sh])
3481 endif
3482
3483 if git.found()
3484 git_head = run_command(
3485 git,
3486 ['--git-dir=@0@/.git'.format(project_source_root),
3487 'rev-parse', 'HEAD']).stdout().strip()
3488 git_head_short = run_command(
3489 git,
3490 ['--git-dir=@0@/.git'.format(project_source_root),
3491 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3492
3493 run_target(
3494 'git-snapshot',
3495 command : ['git', 'archive',
3496 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3497 git_head_short),
3498 '--prefix', 'systemd-@0@/'.format(git_head),
3499 'HEAD'])
3500 endif
3501
3502 ############################################################
3503
3504 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3505 run_target(
3506 'check-api-docs',
3507 depends : [man, libsystemd, libudev],
3508 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3509
3510 ############################################################
3511 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3512
3513 status = [
3514 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3515
3516 'build mode: @0@'.format(get_option('mode')),
3517 'split /usr: @0@'.format(split_usr),
3518 'split bin-sbin: @0@'.format(split_bin),
3519 'prefix directory: @0@'.format(prefixdir),
3520 'rootprefix directory: @0@'.format(rootprefixdir),
3521 'sysconf directory: @0@'.format(sysconfdir),
3522 'include directory: @0@'.format(includedir),
3523 'lib directory: @0@'.format(libdir),
3524 'rootlib directory: @0@'.format(rootlibdir),
3525 'SysV init scripts: @0@'.format(sysvinit_path),
3526 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3527 'PAM modules directory: @0@'.format(pamlibdir),
3528 'PAM configuration directory: @0@'.format(pamconfdir),
3529 'RPM macros directory: @0@'.format(rpmmacrosdir),
3530 'modprobe.d directory: @0@'.format(modprobedir),
3531 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3532 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3533 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3534 'bash completions directory: @0@'.format(bashcompletiondir),
3535 'zsh completions directory: @0@'.format(zshcompletiondir),
3536 'extra start script: @0@'.format(get_option('rc-local')),
3537 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3538 get_option('debug-tty')),
3539 'TTY GID: @0@'.format(tty_gid),
3540 'users GID: @0@'.format(substs.get('USERS_GID')),
3541 'maximum system UID: @0@'.format(system_uid_max),
3542 'maximum system GID: @0@'.format(system_gid_max),
3543 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3544 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3545 'minimum container UID base: @0@'.format(container_uid_base_min),
3546 'maximum container UID base: @0@'.format(container_uid_base_max),
3547 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3548 'render group access mode: @0@'.format(get_option('group-render-mode')),
3549 'certificate root directory: @0@'.format(get_option('certificate-root')),
3550 'support URL: @0@'.format(support_url),
3551 'nobody user name: @0@'.format(nobody_user),
3552 'nobody group name: @0@'.format(nobody_group),
3553 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3554 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3555
3556 'default DNSSEC mode: @0@'.format(default_dnssec),
3557 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3558 'default mDNS mode: @0@'.format(default_mdns),
3559 'default LLMNR mode: @0@'.format(default_llmnr),
3560 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3561 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3562 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3563 'default locale: @0@'.format(default_locale),
3564 'default user $PATH: @0@'.format(default_user_path_display),
3565 'systemd service watchdog: @0@'.format(watchdog_opt)]
3566
3567 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3568 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3569 status += [
3570 'default DNS servers: @0@'.format(alt_dns_servers),
3571 'default NTP servers: @0@'.format(alt_ntp_servers)]
3572
3573 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3574 '@@0@'.format(time_epoch)).stdout().strip()
3575 status += [
3576 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3577
3578 status += [
3579 'static libsystemd: @0@'.format(static_libsystemd),
3580 'static libudev: @0@'.format(static_libudev)]
3581
3582 # TODO:
3583 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3584 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3585 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3586
3587 if conf.get('ENABLE_EFI') == 1
3588 status += 'efi arch: @0@'.format(efi_arch)
3589
3590 if have_gnu_efi
3591 status += [
3592 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3593 'EFI CC @0@'.format(' '.join(efi_cc)),
3594 'EFI lds: @0@'.format(efi_lds),
3595 'EFI crt0: @0@'.format(efi_crt0),
3596 'EFI include directory: @0@'.format(efi_incdir)]
3597 endif
3598 endif
3599
3600 found = []
3601 missing = []
3602
3603 foreach tuple : [
3604 ['libcryptsetup'],
3605 ['PAM'],
3606 ['pwquality'],
3607 ['libfdisk'],
3608 ['p11kit'],
3609 ['libfido2'],
3610 ['AUDIT'],
3611 ['IMA'],
3612 ['AppArmor'],
3613 ['SELinux'],
3614 ['SECCOMP'],
3615 ['SMACK'],
3616 ['zlib'],
3617 ['xz'],
3618 ['zstd'],
3619 ['lz4'],
3620 ['bzip2'],
3621 ['ACL'],
3622 ['gcrypt'],
3623 ['qrencode'],
3624 ['microhttpd'],
3625 ['gnutls'],
3626 ['openssl'],
3627 ['libcurl'],
3628 ['idn'],
3629 ['initrd'],
3630 ['libidn2'],
3631 ['libidn'],
3632 ['libiptc'],
3633 ['elfutils'],
3634 ['binfmt'],
3635 ['repart'],
3636 ['vconsole'],
3637 ['quotacheck'],
3638 ['tmpfiles'],
3639 ['environment.d'],
3640 ['sysusers'],
3641 ['firstboot'],
3642 ['randomseed'],
3643 ['backlight'],
3644 ['rfkill'],
3645 ['xdg-autostart'],
3646 ['logind'],
3647 ['machined'],
3648 ['portabled'],
3649 ['userdb'],
3650 ['homed'],
3651 ['importd'],
3652 ['hostnamed'],
3653 ['timedated'],
3654 ['timesyncd'],
3655 ['localed'],
3656 ['networkd'],
3657 ['resolve'],
3658 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3659 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3660 ['coredump'],
3661 ['pstore'],
3662 ['polkit'],
3663 ['legacy pkla', install_polkit_pkla],
3664 ['efi'],
3665 ['gnu-efi', have_gnu_efi],
3666 ['kmod'],
3667 ['xkbcommon'],
3668 ['pcre2'],
3669 ['blkid'],
3670 ['dbus'],
3671 ['glib'],
3672 ['nss-myhostname'],
3673 ['nss-mymachines'],
3674 ['nss-resolve'],
3675 ['nss-systemd'],
3676 ['hwdb'],
3677 ['tpm'],
3678 ['man pages', want_man],
3679 ['html pages', want_html],
3680 ['man page indices', want_man and have_lxml],
3681 ['SysV compat'],
3682 ['utmp'],
3683 ['ldconfig'],
3684 ['hibernate'],
3685 ['adm group', get_option('adm-group')],
3686 ['wheel group', get_option('wheel-group')],
3687 ['gshadow'],
3688 ['debug hashmap'],
3689 ['debug mmap cache'],
3690 ['debug siphash'],
3691 ['valgrind', conf.get('VALGRIND') == 1],
3692 ['trace logging', conf.get('LOG_TRACE') == 1],
3693 ['install tests', install_tests],
3694 ['link-udev-shared', get_option('link-udev-shared')],
3695 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3696 ['link-networkd-shared', get_option('link-networkd-shared')],
3697 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3698 ['kernel-install', get_option('kernel-install')],
3699 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3700 ]
3701
3702 if tuple.length() >= 2
3703 cond = tuple[1]
3704 else
3705 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3706 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3707 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3708 endif
3709 if cond
3710 found += tuple[0]
3711 else
3712 missing += tuple[0]
3713 endif
3714 endforeach
3715
3716 status += [
3717 '',
3718 'enabled features: @0@'.format(', '.join(found)),
3719 '',
3720 'disabled features: @0@'.format(', '.join(missing)),
3721 '']
3722 message('\n '.join(status))
3723
3724 if rootprefixdir != rootprefix_default
3725 warning('\n' +
3726 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3727 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3728 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3729 endif