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