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