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