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