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