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