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