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