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