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