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