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