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