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