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