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