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