]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
tree-wide: s/time-out/timeout/g
[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 default_net_naming_scheme = get_option('default-net-naming-scheme')
698 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
699
700 time_epoch = get_option('time-epoch')
701 if time_epoch == -1
702 NEWS = files('NEWS')
703 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
704 endif
705 conf.set('TIME_EPOCH', time_epoch)
706
707 system_uid_max = get_option('system-uid-max')
708 if system_uid_max == -1
709 system_uid_max = run_command(
710 awk,
711 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
712 '/etc/login.defs').stdout().strip()
713 if system_uid_max == ''
714 system_uid_max = 999
715 else
716 system_uid_max = system_uid_max.to_int()
717 endif
718 endif
719 conf.set('SYSTEM_UID_MAX', system_uid_max)
720 substs.set('systemuidmax', system_uid_max)
721
722 system_gid_max = get_option('system-gid-max')
723 if system_gid_max == -1
724 system_gid_max = run_command(
725 awk,
726 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
727 '/etc/login.defs').stdout().strip()
728 if system_gid_max == ''
729 system_gid_max = 999
730 else
731 system_gid_max = system_gid_max.to_int()
732 endif
733 endif
734 conf.set('SYSTEM_GID_MAX', system_gid_max)
735 substs.set('systemgidmax', system_gid_max)
736
737 dynamic_uid_min = get_option('dynamic-uid-min')
738 dynamic_uid_max = get_option('dynamic-uid-max')
739 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
740 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
741 substs.set('dynamicuidmin', dynamic_uid_min)
742 substs.set('dynamicuidmax', dynamic_uid_max)
743
744 container_uid_base_min = get_option('container-uid-base-min')
745 container_uid_base_max = get_option('container-uid-base-max')
746 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
747 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
748 substs.set('containeruidbasemin', container_uid_base_min)
749 substs.set('containeruidbasemax', container_uid_base_max)
750
751 nobody_user = get_option('nobody-user')
752 nobody_group = get_option('nobody-group')
753
754 if not meson.is_cross_build()
755 getent_result = run_command('getent', 'passwd', '65534')
756 if getent_result.returncode() == 0
757 name = getent_result.stdout().split(':')[0]
758 if name != nobody_user
759 warning('\n' +
760 '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) +
761 'Your build will result in an user table setup that is incompatible with the local system.')
762 endif
763 endif
764 id_result = run_command('id', '-u', nobody_user)
765 if id_result.returncode() == 0
766 id = id_result.stdout().to_int()
767 if id != 65534
768 warning('\n' +
769 '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) +
770 'Your build will result in an user table setup that is incompatible with the local system.')
771 endif
772 endif
773
774 getent_result = run_command('getent', 'group', '65534')
775 if getent_result.returncode() == 0
776 name = getent_result.stdout().split(':')[0]
777 if name != nobody_group
778 warning('\n' +
779 '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) +
780 'Your build will result in an group table setup that is incompatible with the local system.')
781 endif
782 endif
783 id_result = run_command('id', '-g', nobody_group)
784 if id_result.returncode() == 0
785 id = id_result.stdout().to_int()
786 if id != 65534
787 warning('\n' +
788 '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) +
789 'Your build will result in an group table setup that is incompatible with the local system.')
790 endif
791 endif
792 endif
793 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
794 warning('\n' +
795 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
796 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
797 endif
798
799 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
800 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
801 substs.set('NOBODY_USER_NAME', nobody_user)
802 substs.set('NOBODY_GROUP_NAME', nobody_group)
803
804 tty_gid = get_option('tty-gid')
805 conf.set('TTY_GID', tty_gid)
806 substs.set('TTY_GID', tty_gid)
807
808 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
809 users_gid = get_option('users-gid')
810 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
811
812 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
813 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
814
815 dev_kvm_mode = get_option('dev-kvm-mode')
816 substs.set('DEV_KVM_MODE', dev_kvm_mode)
817 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
818 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
819
820 kill_user_processes = get_option('default-kill-user-processes')
821 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
822 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
823 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
824
825 dns_servers = get_option('dns-servers')
826 conf.set_quoted('DNS_SERVERS', dns_servers)
827 substs.set('DNS_SERVERS', dns_servers)
828
829 ntp_servers = get_option('ntp-servers')
830 conf.set_quoted('NTP_SERVERS', ntp_servers)
831 substs.set('NTP_SERVERS', ntp_servers)
832
833 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
834
835 substs.set('SUSHELL', get_option('debug-shell'))
836 substs.set('DEBUGTTY', get_option('debug-tty'))
837
838 enable_debug_hashmap = false
839 enable_debug_mmap_cache = false
840 enable_debug_siphash = false
841 enable_debug_udev = false
842 foreach name : get_option('debug-extra')
843 if name == 'hashmap'
844 enable_debug_hashmap = true
845 elif name == 'mmap-cache'
846 enable_debug_mmap_cache = true
847 elif name == 'siphash'
848 enable_debug_siphash = true
849 elif name == 'udev'
850 enable_debug_udev = true
851 else
852 message('unknown debug option "@0@", ignoring'.format(name))
853 endif
854 endforeach
855 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
856 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
857 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
858 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
859
860 conf.set10('VALGRIND', get_option('valgrind'))
861 conf.set10('LOG_TRACE', get_option('log-trace'))
862
863 #####################################################################
864
865 threads = dependency('threads')
866 librt = cc.find_library('rt')
867 libm = cc.find_library('m')
868 libdl = cc.find_library('dl')
869 libcrypt = cc.find_library('crypt')
870
871 libcap = dependency('libcap', required : false)
872 if not libcap.found()
873 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
874 libcap = cc.find_library('cap')
875 endif
876
877 libmount = dependency('mount',
878 version : fuzzer_build ? '>= 0' : '>= 2.30')
879
880 want_seccomp = get_option('seccomp')
881 if want_seccomp != 'false' and not fuzzer_build
882 libseccomp = dependency('libseccomp',
883 version : '>= 2.3.1',
884 required : want_seccomp == 'true')
885 have = libseccomp.found()
886 else
887 have = false
888 libseccomp = []
889 endif
890 conf.set10('HAVE_SECCOMP', have)
891
892 want_selinux = get_option('selinux')
893 if want_selinux != 'false' and not fuzzer_build
894 libselinux = dependency('libselinux',
895 version : '>= 2.1.9',
896 required : want_selinux == 'true')
897 have = libselinux.found()
898 else
899 have = false
900 libselinux = []
901 endif
902 conf.set10('HAVE_SELINUX', have)
903
904 want_apparmor = get_option('apparmor')
905 if want_apparmor != 'false' and not fuzzer_build
906 libapparmor = dependency('libapparmor',
907 required : want_apparmor == 'true')
908 have = libapparmor.found()
909 else
910 have = false
911 libapparmor = []
912 endif
913 conf.set10('HAVE_APPARMOR', have)
914
915 smack_run_label = get_option('smack-run-label')
916 if smack_run_label != ''
917 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
918 endif
919
920 want_polkit = get_option('polkit')
921 install_polkit = false
922 install_polkit_pkla = false
923 if want_polkit != 'false' and not fuzzer_build
924 install_polkit = true
925
926 libpolkit = dependency('polkit-gobject-1',
927 required : false)
928 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
929 message('Old polkit detected, will install pkla files')
930 install_polkit_pkla = true
931 endif
932 endif
933 conf.set10('ENABLE_POLKIT', install_polkit)
934
935 want_acl = get_option('acl')
936 if want_acl != 'false' and not fuzzer_build
937 libacl = cc.find_library('acl', required : want_acl == 'true')
938 have = libacl.found()
939 else
940 have = false
941 libacl = []
942 endif
943 conf.set10('HAVE_ACL', have)
944
945 want_audit = get_option('audit')
946 if want_audit != 'false' and not fuzzer_build
947 libaudit = dependency('audit', required : want_audit == 'true')
948 have = libaudit.found()
949 else
950 have = false
951 libaudit = []
952 endif
953 conf.set10('HAVE_AUDIT', have)
954
955 want_blkid = get_option('blkid')
956 if want_blkid != 'false' and not fuzzer_build
957 libblkid = dependency('blkid', required : want_blkid == 'true')
958 have = libblkid.found()
959 else
960 have = false
961 libblkid = []
962 endif
963 conf.set10('HAVE_BLKID', have)
964
965 want_kmod = get_option('kmod')
966 if want_kmod != 'false' and not fuzzer_build
967 libkmod = dependency('libkmod',
968 version : '>= 15',
969 required : want_kmod == 'true')
970 have = libkmod.found()
971 else
972 have = false
973 libkmod = []
974 endif
975 conf.set10('HAVE_KMOD', have)
976
977 want_pam = get_option('pam')
978 if want_pam != 'false' and not fuzzer_build
979 libpam = cc.find_library('pam', required : want_pam == 'true')
980 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
981 have = libpam.found() and libpam_misc.found()
982 else
983 have = false
984 libpam = []
985 libpam_misc = []
986 endif
987 conf.set10('HAVE_PAM', have)
988
989 want_microhttpd = get_option('microhttpd')
990 if want_microhttpd != 'false' and not fuzzer_build
991 libmicrohttpd = dependency('libmicrohttpd',
992 version : '>= 0.9.33',
993 required : want_microhttpd == 'true')
994 have = libmicrohttpd.found()
995 else
996 have = false
997 libmicrohttpd = []
998 endif
999 conf.set10('HAVE_MICROHTTPD', have)
1000
1001 want_libcryptsetup = get_option('libcryptsetup')
1002 if want_libcryptsetup != 'false' and not fuzzer_build
1003 libcryptsetup = dependency('libcryptsetup',
1004 version : '>= 1.6.0',
1005 required : want_libcryptsetup == 'true')
1006 have = libcryptsetup.found()
1007 have_sector = cc.has_member(
1008 'struct crypt_params_plain',
1009 'sector_size',
1010 prefix : '#include <libcryptsetup.h>')
1011 else
1012 have = false
1013 have_sector = false
1014 libcryptsetup = []
1015 endif
1016 conf.set10('HAVE_LIBCRYPTSETUP', have)
1017 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1018
1019 want_libcurl = get_option('libcurl')
1020 if want_libcurl != 'false' and not fuzzer_build
1021 libcurl = dependency('libcurl',
1022 version : '>= 7.32.0',
1023 required : want_libcurl == 'true')
1024 have = libcurl.found()
1025 else
1026 have = false
1027 libcurl = []
1028 endif
1029 conf.set10('HAVE_LIBCURL', have)
1030
1031 want_libidn = get_option('libidn')
1032 want_libidn2 = get_option('libidn2')
1033 if want_libidn == 'true' and want_libidn2 == 'true'
1034 error('libidn and libidn2 cannot be requested simultaneously')
1035 endif
1036
1037 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1038 libidn = dependency('libidn',
1039 required : want_libidn == 'true')
1040 have = libidn.found()
1041 else
1042 have = false
1043 libidn = []
1044 endif
1045 conf.set10('HAVE_LIBIDN', have)
1046 if not have and want_libidn2 != 'false' and not fuzzer_build
1047 # libidn is used for both libidn and libidn2 objects
1048 libidn = dependency('libidn2',
1049 required : want_libidn2 == 'true')
1050 have = libidn.found()
1051 else
1052 have = false
1053 endif
1054 conf.set10('HAVE_LIBIDN2', have)
1055
1056 want_libiptc = get_option('libiptc')
1057 if want_libiptc != 'false' and not fuzzer_build
1058 libiptc = dependency('libiptc',
1059 required : want_libiptc == 'true')
1060 have = libiptc.found()
1061 else
1062 have = false
1063 libiptc = []
1064 endif
1065 conf.set10('HAVE_LIBIPTC', have)
1066
1067 want_qrencode = get_option('qrencode')
1068 if want_qrencode != 'false' and not fuzzer_build
1069 libqrencode = dependency('libqrencode',
1070 required : want_qrencode == 'true')
1071 have = libqrencode.found()
1072 else
1073 have = false
1074 libqrencode = []
1075 endif
1076 conf.set10('HAVE_QRENCODE', have)
1077
1078 want_gcrypt = get_option('gcrypt')
1079 if want_gcrypt != 'false' and not fuzzer_build
1080 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1081 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1082 have = libgcrypt.found() and libgpg_error.found()
1083 else
1084 have = false
1085 endif
1086 if not have
1087 # link to neither of the libs if one is not found
1088 libgcrypt = []
1089 libgpg_error = []
1090 endif
1091 conf.set10('HAVE_GCRYPT', have)
1092
1093 want_gnutls = get_option('gnutls')
1094 if want_gnutls != 'false' and not fuzzer_build
1095 libgnutls = dependency('gnutls',
1096 version : '>= 3.1.4',
1097 required : want_gnutls == 'true')
1098 have = libgnutls.found()
1099 else
1100 have = false
1101 libgnutls = []
1102 endif
1103 conf.set10('HAVE_GNUTLS', have)
1104
1105 want_openssl = get_option('openssl')
1106 if want_openssl != 'false' and not fuzzer_build
1107 libopenssl = dependency('openssl',
1108 version : '>= 1.1.0',
1109 required : want_openssl == 'true')
1110 have = libopenssl.found()
1111 else
1112 have = false
1113 libopenssl = []
1114 endif
1115 conf.set10('HAVE_OPENSSL', have)
1116
1117 want_elfutils = get_option('elfutils')
1118 if want_elfutils != 'false' and not fuzzer_build
1119 libdw = dependency('libdw',
1120 required : want_elfutils == 'true')
1121 have = libdw.found()
1122 else
1123 have = false
1124 libdw = []
1125 endif
1126 conf.set10('HAVE_ELFUTILS', have)
1127
1128 want_zlib = get_option('zlib')
1129 if want_zlib != 'false' and not fuzzer_build
1130 libz = dependency('zlib',
1131 required : want_zlib == 'true')
1132 have = libz.found()
1133 else
1134 have = false
1135 libz = []
1136 endif
1137 conf.set10('HAVE_ZLIB', have)
1138
1139 want_bzip2 = get_option('bzip2')
1140 if want_bzip2 != 'false' and not fuzzer_build
1141 libbzip2 = cc.find_library('bz2',
1142 required : want_bzip2 == 'true')
1143 have = libbzip2.found()
1144 else
1145 have = false
1146 libbzip2 = []
1147 endif
1148 conf.set10('HAVE_BZIP2', have)
1149
1150 want_xz = get_option('xz')
1151 if want_xz != 'false' and not fuzzer_build
1152 libxz = dependency('liblzma',
1153 required : want_xz == 'true')
1154 have = libxz.found()
1155 else
1156 have = false
1157 libxz = []
1158 endif
1159 conf.set10('HAVE_XZ', have)
1160
1161 want_lz4 = get_option('lz4')
1162 if want_lz4 != 'false' and not fuzzer_build
1163 liblz4 = dependency('liblz4',
1164 version : '>= 1.3.0',
1165 required : want_lz4 == 'true')
1166 have = liblz4.found()
1167 else
1168 have = false
1169 liblz4 = []
1170 endif
1171 conf.set10('HAVE_LZ4', have)
1172
1173 want_xkbcommon = get_option('xkbcommon')
1174 if want_xkbcommon != 'false' and not fuzzer_build
1175 libxkbcommon = dependency('xkbcommon',
1176 version : '>= 0.3.0',
1177 required : want_xkbcommon == 'true')
1178 have = libxkbcommon.found()
1179 else
1180 have = false
1181 libxkbcommon = []
1182 endif
1183 conf.set10('HAVE_XKBCOMMON', have)
1184
1185 want_pcre2 = get_option('pcre2')
1186 if want_pcre2 != 'false'
1187 libpcre2 = dependency('libpcre2-8',
1188 required : want_pcre2 == 'true')
1189 have = libpcre2.found()
1190 else
1191 have = false
1192 libpcre2 = []
1193 endif
1194 conf.set10('HAVE_PCRE2', have)
1195
1196 want_glib = get_option('glib')
1197 if want_glib != 'false' and not fuzzer_build
1198 libglib = dependency('glib-2.0',
1199 version : '>= 2.22.0',
1200 required : want_glib == 'true')
1201 libgobject = dependency('gobject-2.0',
1202 version : '>= 2.22.0',
1203 required : want_glib == 'true')
1204 libgio = dependency('gio-2.0',
1205 required : want_glib == 'true')
1206 have = libglib.found() and libgobject.found() and libgio.found()
1207 else
1208 have = false
1209 libglib = []
1210 libgobject = []
1211 libgio = []
1212 endif
1213 conf.set10('HAVE_GLIB', have)
1214
1215 want_dbus = get_option('dbus')
1216 if want_dbus != 'false' and not fuzzer_build
1217 libdbus = dependency('dbus-1',
1218 version : '>= 1.3.2',
1219 required : want_dbus == 'true')
1220 have = libdbus.found()
1221 else
1222 have = false
1223 libdbus = []
1224 endif
1225 conf.set10('HAVE_DBUS', have)
1226
1227 default_dnssec = get_option('default-dnssec')
1228 if fuzzer_build
1229 default_dnssec = 'no'
1230 endif
1231 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1232 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1233 default_dnssec = 'no'
1234 endif
1235 conf.set('DEFAULT_DNSSEC_MODE',
1236 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1237 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1238
1239 dns_over_tls = get_option('dns-over-tls')
1240 if dns_over_tls != 'false'
1241 if dns_over_tls == 'openssl'
1242 have_gnutls = false
1243 else
1244 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1245 if dns_over_tls == 'gnutls' and not have_gnutls
1246 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1247 endif
1248 endif
1249 if dns_over_tls == 'gnutls' or have_gnutls
1250 have_openssl = false
1251 else
1252 have_openssl = conf.get('HAVE_OPENSSL') == 1
1253 if dns_over_tls != 'auto' and not have_openssl
1254 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1255 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1256 endif
1257 endif
1258 have = have_gnutls or have_openssl
1259 else
1260 have = false
1261 have_gnutls = false
1262 have_openssl = false
1263 endif
1264 conf.set10('ENABLE_DNS_OVER_TLS', have)
1265 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1266 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1267
1268 default_dns_over_tls = get_option('default-dns-over-tls')
1269 if fuzzer_build
1270 default_dns_over_tls = 'no'
1271 endif
1272 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1273 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1274 default_dns_over_tls = 'no'
1275 endif
1276 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1277 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1278 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1279
1280 want_importd = get_option('importd')
1281 if want_importd != 'false'
1282 have = (conf.get('HAVE_LIBCURL') == 1 and
1283 conf.get('HAVE_ZLIB') == 1 and
1284 conf.get('HAVE_XZ') == 1 and
1285 conf.get('HAVE_GCRYPT') == 1)
1286 if want_importd == 'true' and not have
1287 error('importd support was requested, but dependencies are not available')
1288 endif
1289 else
1290 have = false
1291 endif
1292 conf.set10('ENABLE_IMPORTD', have)
1293
1294 want_remote = get_option('remote')
1295 if want_remote != 'false'
1296 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1297 conf.get('HAVE_LIBCURL') == 1]
1298 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1299 # it's possible to build one without the other. Complain only if
1300 # support was explictly requested. The auxiliary files like sysusers
1301 # config should be installed when any of the programs are built.
1302 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1303 error('remote support was requested, but dependencies are not available')
1304 endif
1305 have = have_deps[0] or have_deps[1]
1306 else
1307 have = false
1308 endif
1309 conf.set10('ENABLE_REMOTE', have)
1310
1311 foreach term : ['utmp',
1312 'hibernate',
1313 'environment-d',
1314 'binfmt',
1315 'coredump',
1316 'resolve',
1317 'logind',
1318 'hostnamed',
1319 'localed',
1320 'machined',
1321 'portabled',
1322 'networkd',
1323 'timedated',
1324 'timesyncd',
1325 'firstboot',
1326 'randomseed',
1327 'backlight',
1328 'vconsole',
1329 'quotacheck',
1330 'sysusers',
1331 'tmpfiles',
1332 'hwdb',
1333 'rfkill',
1334 'ldconfig',
1335 'efi',
1336 'tpm',
1337 'ima',
1338 'smack',
1339 'gshadow',
1340 'idn',
1341 'nss-myhostname',
1342 'nss-systemd']
1343 have = get_option(term)
1344 name = 'ENABLE_' + term.underscorify().to_upper()
1345 conf.set10(name, have)
1346 endforeach
1347
1348 foreach tuple : [['nss-mymachines', 'machined'],
1349 ['nss-resolve', 'resolve']]
1350 want = get_option(tuple[0])
1351 if want != 'false'
1352 have = get_option(tuple[1])
1353 if want == 'true' and not have
1354 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1355 endif
1356 else
1357 have = false
1358 endif
1359 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1360 conf.set10(name, have)
1361 endforeach
1362
1363 enable_nss = false
1364 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1365 'ENABLE_NSS_MYMACHINES',
1366 'ENABLE_NSS_RESOLVE',
1367 'ENABLE_NSS_SYSTEMD']
1368 if conf.get(term) == 1
1369 enable_nss = true
1370 endif
1371 endforeach
1372 conf.set10('ENABLE_NSS', enable_nss)
1373
1374 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1375
1376 tests = []
1377 fuzzers = []
1378
1379 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1380
1381 #####################################################################
1382
1383 if get_option('efi')
1384 efi_arch = host_machine.cpu_family()
1385
1386 if efi_arch == 'x86'
1387 EFI_MACHINE_TYPE_NAME = 'ia32'
1388 gnu_efi_arch = 'ia32'
1389 elif efi_arch == 'x86_64'
1390 EFI_MACHINE_TYPE_NAME = 'x64'
1391 gnu_efi_arch = 'x86_64'
1392 elif efi_arch == 'arm'
1393 EFI_MACHINE_TYPE_NAME = 'arm'
1394 gnu_efi_arch = 'arm'
1395 elif efi_arch == 'aarch64'
1396 EFI_MACHINE_TYPE_NAME = 'aa64'
1397 gnu_efi_arch = 'aarch64'
1398 else
1399 EFI_MACHINE_TYPE_NAME = ''
1400 gnu_efi_arch = ''
1401 endif
1402
1403 have = true
1404 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1405
1406 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1407 else
1408 have = false
1409 endif
1410 conf.set10('ENABLE_EFI', have)
1411
1412 #####################################################################
1413
1414 config_h = configure_file(
1415 output : 'config.h',
1416 configuration : conf)
1417
1418 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1419
1420 includes = include_directories('src/basic',
1421 'src/shared',
1422 'src/systemd',
1423 'src/journal',
1424 'src/journal-remote',
1425 'src/nspawn',
1426 'src/resolve',
1427 'src/timesync',
1428 'src/time-wait-sync',
1429 'src/login',
1430 'src/udev',
1431 'src/libudev',
1432 'src/core',
1433 'src/libsystemd/sd-bus',
1434 'src/libsystemd/sd-device',
1435 'src/libsystemd/sd-event',
1436 'src/libsystemd/sd-hwdb',
1437 'src/libsystemd/sd-id128',
1438 'src/libsystemd/sd-netlink',
1439 'src/libsystemd/sd-network',
1440 'src/libsystemd-network',
1441 '.')
1442
1443 add_project_arguments('-include', 'config.h', language : 'c')
1444
1445 generate_gperfs = find_program('tools/generate-gperfs.py')
1446
1447 subdir('po')
1448 subdir('catalog')
1449 subdir('src/systemd')
1450 subdir('src/basic')
1451 subdir('src/libsystemd')
1452 subdir('src/libsystemd-network')
1453 subdir('src/journal')
1454 subdir('src/login')
1455
1456 libjournal_core = static_library(
1457 'journal-core',
1458 libjournal_core_sources,
1459 journald_gperf_c,
1460 include_directories : includes,
1461 install : false)
1462
1463 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1464 libsystemd = shared_library(
1465 'systemd',
1466 disable_mempool_c,
1467 version : libsystemd_version,
1468 include_directories : includes,
1469 link_args : ['-shared',
1470 '-Wl,--version-script=' + libsystemd_sym_path],
1471 link_with : [libbasic,
1472 libbasic_gcrypt],
1473 link_whole : [libsystemd_static,
1474 libjournal_client],
1475 dependencies : [threads,
1476 librt,
1477 libxz,
1478 liblz4],
1479 link_depends : libsystemd_sym,
1480 install : true,
1481 install_dir : rootlibdir)
1482
1483 static_libsystemd = get_option('static-libsystemd')
1484 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1485
1486 install_libsystemd_static = static_library(
1487 'systemd',
1488 libsystemd_sources,
1489 journal_client_sources,
1490 basic_sources,
1491 basic_gcrypt_sources,
1492 disable_mempool_c,
1493 include_directories : includes,
1494 build_by_default : static_libsystemd != 'false',
1495 install : static_libsystemd != 'false',
1496 install_dir : rootlibdir,
1497 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1498 dependencies : [threads,
1499 librt,
1500 libxz,
1501 liblz4,
1502 libcap,
1503 libblkid,
1504 libmount,
1505 libselinux,
1506 libgcrypt],
1507 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1508
1509 ############################################################
1510
1511 # binaries that have --help and are intended for use by humans,
1512 # usually, but not always, installed in /bin.
1513 public_programs = []
1514
1515 subdir('src/libudev')
1516 subdir('src/shared')
1517 subdir('src/core')
1518 subdir('src/udev')
1519 subdir('src/network')
1520
1521 subdir('src/analyze')
1522 subdir('src/journal-remote')
1523 subdir('src/coredump')
1524 subdir('src/hostname')
1525 subdir('src/import')
1526 subdir('src/kernel-install')
1527 subdir('src/locale')
1528 subdir('src/machine')
1529 subdir('src/portable')
1530 subdir('src/nspawn')
1531 subdir('src/resolve')
1532 subdir('src/timedate')
1533 subdir('src/timesync')
1534 subdir('src/vconsole')
1535 subdir('src/boot/efi')
1536
1537 subdir('src/test')
1538 subdir('src/fuzz')
1539 subdir('rules')
1540 subdir('test')
1541
1542 ############################################################
1543
1544 # only static linking apart from libdl, to make sure that the
1545 # module is linked to all libraries that it uses.
1546 test_dlopen = executable(
1547 'test-dlopen',
1548 test_dlopen_c,
1549 disable_mempool_c,
1550 include_directories : includes,
1551 link_with : [libbasic],
1552 dependencies : [libdl],
1553 build_by_default : want_tests != 'false')
1554
1555 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1556 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1557 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1558 ['resolve', 'ENABLE_NSS_RESOLVE']]
1559
1560 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1561 if condition
1562 module = tuple[0]
1563
1564 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1565 version_script_arg = join_paths(meson.source_root(), sym)
1566
1567 nss = shared_library(
1568 'nss_' + module,
1569 'src/nss-@0@/nss-@0@.c'.format(module),
1570 disable_mempool_c,
1571 version : '2',
1572 include_directories : includes,
1573 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1574 link_args : ['-Wl,-z,nodelete',
1575 '-shared',
1576 '-Wl,--version-script=' + version_script_arg,
1577 '-Wl,--undefined'],
1578 link_with : [libsystemd_static,
1579 libbasic],
1580 dependencies : [threads,
1581 librt],
1582 link_depends : sym,
1583 install : true,
1584 install_dir : rootlibdir)
1585
1586 # We cannot use shared_module because it does not support version suffix.
1587 # Unfortunately shared_library insists on creating the symlink…
1588 meson.add_install_script('sh', '-c',
1589 'rm $DESTDIR@0@/libnss_@1@.so'
1590 .format(rootlibdir, module))
1591
1592 if want_tests != 'false'
1593 test('dlopen-nss_' + module,
1594 test_dlopen,
1595 # path to dlopen must include a slash
1596 args : nss.full_path())
1597 endif
1598 endif
1599 endforeach
1600
1601 ############################################################
1602
1603 executable('systemd',
1604 systemd_sources,
1605 include_directories : includes,
1606 link_with : [libcore,
1607 libshared],
1608 dependencies : [threads,
1609 librt,
1610 libseccomp,
1611 libselinux,
1612 libmount,
1613 libblkid],
1614 install_rpath : rootlibexecdir,
1615 install : true,
1616 install_dir : rootlibexecdir)
1617
1618 meson.add_install_script(meson_make_symlink,
1619 join_paths(rootlibexecdir, 'systemd'),
1620 join_paths(rootsbindir, 'init'))
1621
1622 exe = executable('systemd-analyze',
1623 systemd_analyze_sources,
1624 include_directories : includes,
1625 link_with : [libcore,
1626 libshared],
1627 dependencies : [threads,
1628 librt,
1629 libseccomp,
1630 libselinux,
1631 libmount,
1632 libblkid],
1633 install_rpath : rootlibexecdir,
1634 install : true)
1635 public_programs += exe
1636
1637 executable('systemd-journald',
1638 systemd_journald_sources,
1639 include_directories : includes,
1640 link_with : [libjournal_core,
1641 libshared],
1642 dependencies : [threads,
1643 libxz,
1644 liblz4,
1645 libselinux],
1646 install_rpath : rootlibexecdir,
1647 install : true,
1648 install_dir : rootlibexecdir)
1649
1650 exe = executable('systemd-cat',
1651 systemd_cat_sources,
1652 include_directories : includes,
1653 link_with : [libjournal_core,
1654 libshared],
1655 dependencies : [threads],
1656 install_rpath : rootlibexecdir,
1657 install : true)
1658 public_programs += exe
1659
1660 exe = executable('journalctl',
1661 journalctl_sources,
1662 include_directories : includes,
1663 link_with : [libshared],
1664 dependencies : [threads,
1665 libqrencode,
1666 libxz,
1667 liblz4,
1668 libpcre2],
1669 install_rpath : rootlibexecdir,
1670 install : true,
1671 install_dir : rootbindir)
1672 public_programs += exe
1673
1674 executable('systemd-getty-generator',
1675 'src/getty-generator/getty-generator.c',
1676 include_directories : includes,
1677 link_with : [libshared],
1678 install_rpath : rootlibexecdir,
1679 install : true,
1680 install_dir : systemgeneratordir)
1681
1682 executable('systemd-debug-generator',
1683 'src/debug-generator/debug-generator.c',
1684 include_directories : includes,
1685 link_with : [libshared],
1686 install_rpath : rootlibexecdir,
1687 install : true,
1688 install_dir : systemgeneratordir)
1689
1690 executable('systemd-run-generator',
1691 'src/run-generator/run-generator.c',
1692 include_directories : includes,
1693 link_with : [libshared],
1694 install_rpath : rootlibexecdir,
1695 install : true,
1696 install_dir : systemgeneratordir)
1697
1698 executable('systemd-fstab-generator',
1699 'src/fstab-generator/fstab-generator.c',
1700 'src/core/mount-setup.c',
1701 include_directories : includes,
1702 link_with : [libshared],
1703 install_rpath : rootlibexecdir,
1704 install : true,
1705 install_dir : systemgeneratordir)
1706
1707 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1708 executable('30-systemd-environment-d-generator',
1709 'src/environment-d-generator/environment-d-generator.c',
1710 include_directories : includes,
1711 link_with : [libshared],
1712 install_rpath : rootlibexecdir,
1713 install : true,
1714 install_dir : userenvgeneratordir)
1715
1716 meson.add_install_script(meson_make_symlink,
1717 join_paths(sysconfdir, 'environment'),
1718 join_paths(environmentdir, '99-environment.conf'))
1719 endif
1720
1721 if conf.get('ENABLE_HIBERNATE') == 1
1722 executable('systemd-hibernate-resume-generator',
1723 'src/hibernate-resume/hibernate-resume-generator.c',
1724 include_directories : includes,
1725 link_with : [libshared],
1726 install_rpath : rootlibexecdir,
1727 install : true,
1728 install_dir : systemgeneratordir)
1729
1730 executable('systemd-hibernate-resume',
1731 'src/hibernate-resume/hibernate-resume.c',
1732 include_directories : includes,
1733 link_with : [libshared],
1734 install_rpath : rootlibexecdir,
1735 install : true,
1736 install_dir : rootlibexecdir)
1737 endif
1738
1739 if conf.get('HAVE_BLKID') == 1
1740 executable('systemd-gpt-auto-generator',
1741 'src/gpt-auto-generator/gpt-auto-generator.c',
1742 'src/shared/blkid-util.h',
1743 include_directories : includes,
1744 link_with : [libshared],
1745 dependencies : libblkid,
1746 install_rpath : rootlibexecdir,
1747 install : true,
1748 install_dir : systemgeneratordir)
1749
1750 exe = executable('systemd-dissect',
1751 'src/dissect/dissect.c',
1752 include_directories : includes,
1753 link_with : [libshared],
1754 install_rpath : rootlibexecdir,
1755 install : true,
1756 install_dir : rootlibexecdir)
1757 public_programs += exe
1758 endif
1759
1760 if conf.get('ENABLE_RESOLVE') == 1
1761 executable('systemd-resolved',
1762 systemd_resolved_sources,
1763 include_directories : includes,
1764 link_with : [libshared,
1765 libbasic_gcrypt,
1766 libsystemd_resolve_core],
1767 dependencies : systemd_resolved_dependencies,
1768 install_rpath : rootlibexecdir,
1769 install : true,
1770 install_dir : rootlibexecdir)
1771
1772 exe = executable('resolvectl',
1773 resolvectl_sources,
1774 include_directories : includes,
1775 link_with : [libshared,
1776 libbasic_gcrypt,
1777 libsystemd_resolve_core],
1778 dependencies : [threads,
1779 libgpg_error,
1780 libm,
1781 libidn],
1782 install_rpath : rootlibexecdir,
1783 install : true)
1784 public_programs += exe
1785
1786 meson.add_install_script(meson_make_symlink,
1787 join_paths(bindir, 'resolvectl'),
1788 join_paths(rootsbindir, 'resolvconf'))
1789
1790 meson.add_install_script(meson_make_symlink,
1791 join_paths(bindir, 'resolvectl'),
1792 join_paths(bindir, 'systemd-resolve'))
1793 endif
1794
1795 if conf.get('ENABLE_LOGIND') == 1
1796 executable('systemd-logind',
1797 systemd_logind_sources,
1798 include_directories : includes,
1799 link_with : [liblogind_core,
1800 libshared],
1801 dependencies : [threads,
1802 libacl],
1803 install_rpath : rootlibexecdir,
1804 install : true,
1805 install_dir : rootlibexecdir)
1806
1807 exe = executable('loginctl',
1808 loginctl_sources,
1809 include_directories : includes,
1810 link_with : [libshared],
1811 dependencies : [threads,
1812 liblz4,
1813 libxz],
1814 install_rpath : rootlibexecdir,
1815 install : true,
1816 install_dir : rootbindir)
1817 public_programs += exe
1818
1819 exe = executable('systemd-inhibit',
1820 'src/login/inhibit.c',
1821 include_directories : includes,
1822 link_with : [libshared],
1823 install_rpath : rootlibexecdir,
1824 install : true,
1825 install_dir : rootbindir)
1826 public_programs += exe
1827
1828 if conf.get('HAVE_PAM') == 1
1829 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1830 pam_systemd = shared_library(
1831 'pam_systemd',
1832 pam_systemd_c,
1833 name_prefix : '',
1834 include_directories : includes,
1835 link_args : ['-shared',
1836 '-Wl,--version-script=' + version_script_arg],
1837 link_with : [libsystemd_static,
1838 libshared_static],
1839 dependencies : [threads,
1840 libpam,
1841 libpam_misc],
1842 link_depends : pam_systemd_sym,
1843 install : true,
1844 install_dir : pamlibdir)
1845
1846 if want_tests != 'false'
1847 test('dlopen-pam_systemd',
1848 test_dlopen,
1849 # path to dlopen must include a slash
1850 args : pam_systemd.full_path())
1851 endif
1852 endif
1853
1854 executable('systemd-user-runtime-dir',
1855 user_runtime_dir_sources,
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1859 install : true,
1860 install_dir : rootlibexecdir)
1861 endif
1862
1863 if conf.get('HAVE_PAM') == 1
1864 executable('systemd-user-sessions',
1865 'src/user-sessions/user-sessions.c',
1866 include_directories : includes,
1867 link_with : [libshared],
1868 install_rpath : rootlibexecdir,
1869 install : true,
1870 install_dir : rootlibexecdir)
1871 endif
1872
1873 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1874 exe = executable('bootctl',
1875 'src/boot/bootctl.c',
1876 include_directories : includes,
1877 link_with : [libshared],
1878 dependencies : [libblkid],
1879 install_rpath : rootlibexecdir,
1880 install : true)
1881 public_programs += exe
1882
1883 executable('systemd-bless-boot',
1884 'src/boot/bless-boot.c',
1885 include_directories : includes,
1886 link_with : [libshared],
1887 dependencies : [libblkid],
1888 install_rpath : rootlibexecdir,
1889 install : true,
1890 install_dir : rootlibexecdir)
1891
1892 executable('systemd-bless-boot-generator',
1893 'src/boot/bless-boot-generator.c',
1894 include_directories : includes,
1895 link_with : [libshared],
1896 install_rpath : rootlibexecdir,
1897 install : true,
1898 install_dir : systemgeneratordir)
1899 endif
1900
1901 executable('systemd-boot-check-no-failures',
1902 'src/boot/boot-check-no-failures.c',
1903 include_directories : includes,
1904 link_with : [libshared],
1905 dependencies : [libblkid],
1906 install_rpath : rootlibexecdir,
1907 install : true,
1908 install_dir : rootlibexecdir)
1909
1910 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 dependencies : [threads],
1914 install_rpath : rootlibexecdir,
1915 install : true)
1916 public_programs += exe
1917
1918
1919 if get_option('link-systemctl-shared')
1920 systemctl_link_with = [libshared]
1921 else
1922 systemctl_link_with = [libsystemd_static,
1923 libshared_static,
1924 libjournal_client,
1925 libbasic_gcrypt]
1926 endif
1927
1928 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1929 include_directories : includes,
1930 link_with : systemctl_link_with,
1931 dependencies : [threads,
1932 libcap,
1933 libselinux,
1934 libxz,
1935 liblz4],
1936 install_rpath : rootlibexecdir,
1937 install : true,
1938 install_dir : rootbindir)
1939 public_programs += exe
1940
1941 if conf.get('ENABLE_PORTABLED') == 1
1942 executable('systemd-portabled',
1943 systemd_portabled_sources,
1944 include_directories : includes,
1945 link_with : [libshared],
1946 dependencies : [threads],
1947 install_rpath : rootlibexecdir,
1948 install : true,
1949 install_dir : rootlibexecdir)
1950
1951 exe = executable('portablectl', 'src/portable/portablectl.c',
1952 include_directories : includes,
1953 link_with : [libshared],
1954 dependencies : [threads],
1955 install_rpath : rootlibexecdir,
1956 install : true,
1957 install_dir : rootbindir)
1958 public_programs += exe
1959 endif
1960
1961 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1962 meson.add_install_script(meson_make_symlink,
1963 join_paths(rootbindir, 'systemctl'),
1964 join_paths(rootsbindir, alias))
1965 endforeach
1966
1967 if conf.get('ENABLE_BACKLIGHT') == 1
1968 executable('systemd-backlight',
1969 'src/backlight/backlight.c',
1970 include_directories : includes,
1971 link_with : [libshared],
1972 install_rpath : rootlibexecdir,
1973 install : true,
1974 install_dir : rootlibexecdir)
1975 endif
1976
1977 if conf.get('ENABLE_RFKILL') == 1
1978 executable('systemd-rfkill',
1979 'src/rfkill/rfkill.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 install_rpath : rootlibexecdir,
1983 install : true,
1984 install_dir : rootlibexecdir)
1985 endif
1986
1987 executable('systemd-system-update-generator',
1988 'src/system-update-generator/system-update-generator.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 install_rpath : rootlibexecdir,
1992 install : true,
1993 install_dir : systemgeneratordir)
1994
1995 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1996 executable('systemd-cryptsetup',
1997 'src/cryptsetup/cryptsetup.c',
1998 include_directories : includes,
1999 link_with : [libshared],
2000 dependencies : [libcryptsetup],
2001 install_rpath : rootlibexecdir,
2002 install : true,
2003 install_dir : rootlibexecdir)
2004
2005 executable('systemd-cryptsetup-generator',
2006 'src/cryptsetup/cryptsetup-generator.c',
2007 include_directories : includes,
2008 link_with : [libshared],
2009 dependencies : [libcryptsetup],
2010 install_rpath : rootlibexecdir,
2011 install : true,
2012 install_dir : systemgeneratordir)
2013
2014 executable('systemd-veritysetup',
2015 'src/veritysetup/veritysetup.c',
2016 include_directories : includes,
2017 link_with : [libshared],
2018 dependencies : [libcryptsetup],
2019 install_rpath : rootlibexecdir,
2020 install : true,
2021 install_dir : rootlibexecdir)
2022
2023 executable('systemd-veritysetup-generator',
2024 'src/veritysetup/veritysetup-generator.c',
2025 include_directories : includes,
2026 link_with : [libshared],
2027 dependencies : [libcryptsetup],
2028 install_rpath : rootlibexecdir,
2029 install : true,
2030 install_dir : systemgeneratordir)
2031 endif
2032
2033 if conf.get('HAVE_SYSV_COMPAT') == 1
2034 executable('systemd-sysv-generator',
2035 'src/sysv-generator/sysv-generator.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 install_rpath : rootlibexecdir,
2039 install : true,
2040 install_dir : systemgeneratordir)
2041
2042 executable('systemd-rc-local-generator',
2043 'src/rc-local-generator/rc-local-generator.c',
2044 include_directories : includes,
2045 link_with : [libshared],
2046 install_rpath : rootlibexecdir,
2047 install : true,
2048 install_dir : systemgeneratordir)
2049 endif
2050
2051 if conf.get('ENABLE_HOSTNAMED') == 1
2052 executable('systemd-hostnamed',
2053 'src/hostname/hostnamed.c',
2054 include_directories : includes,
2055 link_with : [libshared],
2056 install_rpath : rootlibexecdir,
2057 install : true,
2058 install_dir : rootlibexecdir)
2059
2060 exe = executable('hostnamectl',
2061 'src/hostname/hostnamectl.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 install_rpath : rootlibexecdir,
2065 install : true)
2066 public_programs += exe
2067 endif
2068
2069 if conf.get('ENABLE_LOCALED') == 1
2070 if conf.get('HAVE_XKBCOMMON') == 1
2071 # logind will load libxkbcommon.so dynamically on its own
2072 deps = [libdl]
2073 else
2074 deps = []
2075 endif
2076
2077 executable('systemd-localed',
2078 systemd_localed_sources,
2079 include_directories : includes,
2080 link_with : [libshared],
2081 dependencies : deps,
2082 install_rpath : rootlibexecdir,
2083 install : true,
2084 install_dir : rootlibexecdir)
2085
2086 exe = executable('localectl',
2087 localectl_sources,
2088 include_directories : includes,
2089 link_with : [libshared],
2090 install_rpath : rootlibexecdir,
2091 install : true)
2092 public_programs += exe
2093 endif
2094
2095 if conf.get('ENABLE_TIMEDATED') == 1
2096 executable('systemd-timedated',
2097 'src/timedate/timedated.c',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2101 install : true,
2102 install_dir : rootlibexecdir)
2103 endif
2104
2105 if conf.get('ENABLE_TIMEDATECTL') == 1
2106 exe = executable('timedatectl',
2107 'src/timedate/timedatectl.c',
2108 include_directories : includes,
2109 install_rpath : rootlibexecdir,
2110 link_with : [libshared],
2111 dependencies : [libm],
2112 install : true)
2113 public_programs += exe
2114 endif
2115
2116 if conf.get('ENABLE_TIMESYNCD') == 1
2117 executable('systemd-timesyncd',
2118 systemd_timesyncd_sources,
2119 include_directories : includes,
2120 link_with : [libshared],
2121 dependencies : [threads,
2122 libm],
2123 install_rpath : rootlibexecdir,
2124 install : true,
2125 install_dir : rootlibexecdir)
2126
2127 executable('systemd-time-wait-sync',
2128 'src/time-wait-sync/time-wait-sync.c',
2129 include_directories : includes,
2130 link_with : [libshared],
2131 install_rpath : rootlibexecdir,
2132 install : true,
2133 install_dir : rootlibexecdir)
2134 endif
2135
2136 if conf.get('ENABLE_MACHINED') == 1
2137 executable('systemd-machined',
2138 systemd_machined_sources,
2139 include_directories : includes,
2140 link_with : [libmachine_core,
2141 libshared],
2142 install_rpath : rootlibexecdir,
2143 install : true,
2144 install_dir : rootlibexecdir)
2145
2146 exe = executable('machinectl',
2147 'src/machine/machinectl.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 dependencies : [threads,
2151 libxz,
2152 liblz4],
2153 install_rpath : rootlibexecdir,
2154 install : true,
2155 install_dir : rootbindir)
2156 public_programs += exe
2157 endif
2158
2159 if conf.get('ENABLE_IMPORTD') == 1
2160 executable('systemd-importd',
2161 systemd_importd_sources,
2162 include_directories : includes,
2163 link_with : [libshared],
2164 dependencies : [threads],
2165 install_rpath : rootlibexecdir,
2166 install : true,
2167 install_dir : rootlibexecdir)
2168
2169 systemd_pull = executable('systemd-pull',
2170 systemd_pull_sources,
2171 include_directories : includes,
2172 link_with : [libshared],
2173 dependencies : [libcurl,
2174 libz,
2175 libbzip2,
2176 libxz,
2177 libgcrypt],
2178 install_rpath : rootlibexecdir,
2179 install : true,
2180 install_dir : rootlibexecdir)
2181
2182 systemd_import = executable('systemd-import',
2183 systemd_import_sources,
2184 include_directories : includes,
2185 link_with : [libshared],
2186 dependencies : [libcurl,
2187 libz,
2188 libbzip2,
2189 libxz],
2190 install_rpath : rootlibexecdir,
2191 install : true,
2192 install_dir : rootlibexecdir)
2193
2194 systemd_import_fs = executable('systemd-import-fs',
2195 systemd_import_fs_sources,
2196 include_directories : includes,
2197 link_with : [libshared],
2198 install_rpath : rootlibexecdir,
2199 install : true,
2200 install_dir : rootlibexecdir)
2201
2202 systemd_export = executable('systemd-export',
2203 systemd_export_sources,
2204 include_directories : includes,
2205 link_with : [libshared],
2206 dependencies : [libcurl,
2207 libz,
2208 libbzip2,
2209 libxz],
2210 install_rpath : rootlibexecdir,
2211 install : true,
2212 install_dir : rootlibexecdir)
2213
2214 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2215 endif
2216
2217 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2218 exe = executable('systemd-journal-upload',
2219 systemd_journal_upload_sources,
2220 include_directories : includes,
2221 link_with : [libshared],
2222 dependencies : [threads,
2223 libcurl,
2224 libgnutls,
2225 libxz,
2226 liblz4],
2227 install_rpath : rootlibexecdir,
2228 install : true,
2229 install_dir : rootlibexecdir)
2230 public_programs += exe
2231 endif
2232
2233 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2234 s_j_remote = executable('systemd-journal-remote',
2235 systemd_journal_remote_sources,
2236 include_directories : includes,
2237 link_with : [libshared,
2238 libsystemd_journal_remote],
2239 dependencies : [threads,
2240 libmicrohttpd,
2241 libgnutls,
2242 libxz,
2243 liblz4],
2244 install_rpath : rootlibexecdir,
2245 install : true,
2246 install_dir : rootlibexecdir)
2247
2248 s_j_gatewayd = executable('systemd-journal-gatewayd',
2249 systemd_journal_gatewayd_sources,
2250 include_directories : includes,
2251 link_with : [libshared],
2252 dependencies : [threads,
2253 libmicrohttpd,
2254 libgnutls,
2255 libxz,
2256 liblz4],
2257 install_rpath : rootlibexecdir,
2258 install : true,
2259 install_dir : rootlibexecdir)
2260 public_programs += [s_j_remote, s_j_gatewayd]
2261 endif
2262
2263 if conf.get('ENABLE_COREDUMP') == 1
2264 executable('systemd-coredump',
2265 systemd_coredump_sources,
2266 include_directories : includes,
2267 link_with : [libshared],
2268 dependencies : [threads,
2269 libacl,
2270 libdw,
2271 libxz,
2272 liblz4],
2273 install_rpath : rootlibexecdir,
2274 install : true,
2275 install_dir : rootlibexecdir)
2276
2277 exe = executable('coredumpctl',
2278 coredumpctl_sources,
2279 include_directories : includes,
2280 link_with : [libshared],
2281 dependencies : [threads,
2282 libxz,
2283 liblz4],
2284 install_rpath : rootlibexecdir,
2285 install : true)
2286 public_programs += exe
2287 endif
2288
2289 if conf.get('ENABLE_BINFMT') == 1
2290 exe = executable('systemd-binfmt',
2291 'src/binfmt/binfmt.c',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 install_rpath : rootlibexecdir,
2295 install : true,
2296 install_dir : rootlibexecdir)
2297 public_programs += exe
2298
2299 meson.add_install_script('sh', '-c',
2300 mkdir_p.format(binfmtdir))
2301 meson.add_install_script('sh', '-c',
2302 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2303 endif
2304
2305 if conf.get('ENABLE_VCONSOLE') == 1
2306 executable('systemd-vconsole-setup',
2307 'src/vconsole/vconsole-setup.c',
2308 include_directories : includes,
2309 link_with : [libshared],
2310 install_rpath : rootlibexecdir,
2311 install : true,
2312 install_dir : rootlibexecdir)
2313 endif
2314
2315 if conf.get('ENABLE_RANDOMSEED') == 1
2316 executable('systemd-random-seed',
2317 'src/random-seed/random-seed.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 install_rpath : rootlibexecdir,
2321 install : true,
2322 install_dir : rootlibexecdir)
2323 endif
2324
2325 if conf.get('ENABLE_FIRSTBOOT') == 1
2326 executable('systemd-firstboot',
2327 'src/firstboot/firstboot.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 dependencies : [libcrypt],
2331 install_rpath : rootlibexecdir,
2332 install : true,
2333 install_dir : rootbindir)
2334 endif
2335
2336 executable('systemd-remount-fs',
2337 'src/remount-fs/remount-fs.c',
2338 'src/core/mount-setup.c',
2339 'src/core/mount-setup.h',
2340 include_directories : includes,
2341 link_with : [libshared],
2342 install_rpath : rootlibexecdir,
2343 install : true,
2344 install_dir : rootlibexecdir)
2345
2346 executable('systemd-machine-id-setup',
2347 'src/machine-id-setup/machine-id-setup-main.c',
2348 'src/core/machine-id-setup.c',
2349 'src/core/machine-id-setup.h',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 install_rpath : rootlibexecdir,
2353 install : true,
2354 install_dir : rootbindir)
2355
2356 executable('systemd-fsck',
2357 'src/fsck/fsck.c',
2358 include_directories : includes,
2359 link_with : [libshared],
2360 install_rpath : rootlibexecdir,
2361 install : true,
2362 install_dir : rootlibexecdir)
2363
2364 executable('systemd-growfs',
2365 'src/partition/growfs.c',
2366 include_directories : includes,
2367 link_with : [libshared],
2368 dependencies : [libcryptsetup],
2369 install_rpath : rootlibexecdir,
2370 install : true,
2371 install_dir : rootlibexecdir)
2372
2373 executable('systemd-makefs',
2374 'src/partition/makefs.c',
2375 include_directories : includes,
2376 link_with : [libshared],
2377 install_rpath : rootlibexecdir,
2378 install : true,
2379 install_dir : rootlibexecdir)
2380
2381 executable('systemd-sleep',
2382 'src/sleep/sleep.c',
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2386 install : true,
2387 install_dir : rootlibexecdir)
2388
2389 exe = executable('systemd-sysctl',
2390 'src/sysctl/sysctl.c',
2391 include_directories : includes,
2392 link_with : [libshared],
2393 install_rpath : rootlibexecdir,
2394 install : true,
2395 install_dir : rootlibexecdir)
2396 public_programs += exe
2397
2398 executable('systemd-ac-power',
2399 'src/ac-power/ac-power.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2403 install : true,
2404 install_dir : rootlibexecdir)
2405
2406 exe = executable('systemd-detect-virt',
2407 'src/detect-virt/detect-virt.c',
2408 include_directories : includes,
2409 link_with : [libshared],
2410 install_rpath : rootlibexecdir,
2411 install : true)
2412 public_programs += exe
2413
2414 exe = executable('systemd-delta',
2415 'src/delta/delta.c',
2416 include_directories : includes,
2417 link_with : [libshared],
2418 install_rpath : rootlibexecdir,
2419 install : true)
2420 public_programs += exe
2421
2422 exe = executable('systemd-escape',
2423 'src/escape/escape.c',
2424 include_directories : includes,
2425 link_with : [libshared],
2426 install_rpath : rootlibexecdir,
2427 install : true,
2428 install_dir : rootbindir)
2429 public_programs += exe
2430
2431 exe = executable('systemd-notify',
2432 'src/notify/notify.c',
2433 include_directories : includes,
2434 link_with : [libshared],
2435 install_rpath : rootlibexecdir,
2436 install : true,
2437 install_dir : rootbindir)
2438 public_programs += exe
2439
2440 executable('systemd-volatile-root',
2441 'src/volatile-root/volatile-root.c',
2442 include_directories : includes,
2443 link_with : [libshared],
2444 install_rpath : rootlibexecdir,
2445 install : true,
2446 install_dir : rootlibexecdir)
2447
2448 executable('systemd-cgroups-agent',
2449 'src/cgroups-agent/cgroups-agent.c',
2450 include_directories : includes,
2451 link_with : [libshared],
2452 install_rpath : rootlibexecdir,
2453 install : true,
2454 install_dir : rootlibexecdir)
2455
2456 exe = executable('systemd-id128',
2457 'src/id128/id128.c',
2458 include_directories : includes,
2459 link_with : [libshared],
2460 install_rpath : rootlibexecdir,
2461 install : true)
2462 public_programs += exe
2463
2464 exe = executable('systemd-path',
2465 'src/path/path.c',
2466 include_directories : includes,
2467 link_with : [libshared],
2468 install_rpath : rootlibexecdir,
2469 install : true)
2470 public_programs += exe
2471
2472 exe = executable('systemd-ask-password',
2473 'src/ask-password/ask-password.c',
2474 include_directories : includes,
2475 link_with : [libshared],
2476 install_rpath : rootlibexecdir,
2477 install : true,
2478 install_dir : rootbindir)
2479 public_programs += exe
2480
2481 executable('systemd-reply-password',
2482 'src/reply-password/reply-password.c',
2483 include_directories : includes,
2484 link_with : [libshared],
2485 install_rpath : rootlibexecdir,
2486 install : true,
2487 install_dir : rootlibexecdir)
2488
2489 exe = executable('systemd-tty-ask-password-agent',
2490 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2494 install : true,
2495 install_dir : rootbindir)
2496 public_programs += exe
2497
2498 exe = executable('systemd-cgls',
2499 'src/cgls/cgls.c',
2500 include_directories : includes,
2501 link_with : [libshared],
2502 install_rpath : rootlibexecdir,
2503 install : true)
2504 public_programs += exe
2505
2506 exe = executable('systemd-cgtop',
2507 'src/cgtop/cgtop.c',
2508 include_directories : includes,
2509 link_with : [libshared],
2510 install_rpath : rootlibexecdir,
2511 install : true)
2512 public_programs += exe
2513
2514 executable('systemd-initctl',
2515 'src/initctl/initctl.c',
2516 include_directories : includes,
2517 link_with : [libshared],
2518 install_rpath : rootlibexecdir,
2519 install : true,
2520 install_dir : rootlibexecdir)
2521
2522 exe = executable('systemd-mount',
2523 'src/mount/mount-tool.c',
2524 include_directories : includes,
2525 link_with : [libshared],
2526 install_rpath : rootlibexecdir,
2527 install : true)
2528 public_programs += exe
2529
2530 meson.add_install_script(meson_make_symlink,
2531 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2532
2533 exe = executable('systemd-run',
2534 'src/run/run.c',
2535 include_directories : includes,
2536 link_with : [libshared],
2537 install_rpath : rootlibexecdir,
2538 install : true)
2539 public_programs += exe
2540
2541 exe = executable('systemd-stdio-bridge',
2542 'src/stdio-bridge/stdio-bridge.c',
2543 include_directories : includes,
2544 link_with : [libshared],
2545 install_rpath : rootlibexecdir,
2546 install : true)
2547 public_programs += exe
2548
2549 exe = executable('busctl',
2550 'src/busctl/busctl.c',
2551 'src/busctl/busctl-introspect.c',
2552 'src/busctl/busctl-introspect.h',
2553 include_directories : includes,
2554 link_with : [libshared],
2555 install_rpath : rootlibexecdir,
2556 install : true)
2557 public_programs += exe
2558
2559 if conf.get('ENABLE_SYSUSERS') == 1
2560 exe = executable('systemd-sysusers',
2561 'src/sysusers/sysusers.c',
2562 include_directories : includes,
2563 link_with : [libshared],
2564 install_rpath : rootlibexecdir,
2565 install : true,
2566 install_dir : rootbindir)
2567 public_programs += exe
2568 endif
2569
2570 if conf.get('ENABLE_TMPFILES') == 1
2571 exe = executable('systemd-tmpfiles',
2572 'src/tmpfiles/tmpfiles.c',
2573 include_directories : includes,
2574 link_with : [libshared],
2575 dependencies : [libacl],
2576 install_rpath : rootlibexecdir,
2577 install : true,
2578 install_dir : rootbindir)
2579 public_programs += exe
2580
2581 if want_tests != 'false'
2582 test('test-systemd-tmpfiles',
2583 test_systemd_tmpfiles_py,
2584 # https://github.com/mesonbuild/meson/issues/2681
2585 args : exe.full_path())
2586 endif
2587 endif
2588
2589 if conf.get('ENABLE_HWDB') == 1
2590 exe = executable('systemd-hwdb',
2591 'src/hwdb/hwdb.c',
2592 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2593 include_directories : includes,
2594 link_with : [libudev_static],
2595 install_rpath : udev_rpath,
2596 install : true,
2597 install_dir : rootbindir)
2598 public_programs += exe
2599 endif
2600
2601 if conf.get('ENABLE_QUOTACHECK') == 1
2602 executable('systemd-quotacheck',
2603 'src/quotacheck/quotacheck.c',
2604 include_directories : includes,
2605 link_with : [libshared],
2606 install_rpath : rootlibexecdir,
2607 install : true,
2608 install_dir : rootlibexecdir)
2609 endif
2610
2611 exe = executable('systemd-socket-proxyd',
2612 'src/socket-proxy/socket-proxyd.c',
2613 include_directories : includes,
2614 link_with : [libshared],
2615 dependencies : [threads],
2616 install_rpath : rootlibexecdir,
2617 install : true,
2618 install_dir : rootlibexecdir)
2619 public_programs += exe
2620
2621 exe = executable('systemd-udevd',
2622 systemd_udevd_sources,
2623 include_directories : includes,
2624 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2625 link_with : [libudev_core,
2626 libsystemd_network,
2627 libudev_static],
2628 dependencies : [threads,
2629 libkmod,
2630 libidn,
2631 libacl,
2632 libblkid],
2633 install_rpath : udev_rpath,
2634 install : true,
2635 install_dir : rootlibexecdir)
2636 public_programs += exe
2637
2638 exe = executable('udevadm',
2639 udevadm_sources,
2640 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2641 include_directories : includes,
2642 link_with : [libudev_core,
2643 libsystemd_network,
2644 libudev_static],
2645 dependencies : [threads,
2646 libkmod,
2647 libidn,
2648 libacl,
2649 libblkid],
2650 install_rpath : udev_rpath,
2651 install : true,
2652 install_dir : rootbindir)
2653 public_programs += exe
2654
2655 executable('systemd-shutdown',
2656 systemd_shutdown_sources,
2657 include_directories : includes,
2658 link_with : [libshared],
2659 dependencies : [libmount],
2660 install_rpath : rootlibexecdir,
2661 install : true,
2662 install_dir : rootlibexecdir)
2663
2664 executable('systemd-update-done',
2665 'src/update-done/update-done.c',
2666 include_directories : includes,
2667 link_with : [libshared],
2668 install_rpath : rootlibexecdir,
2669 install : true,
2670 install_dir : rootlibexecdir)
2671
2672 executable('systemd-update-utmp',
2673 'src/update-utmp/update-utmp.c',
2674 include_directories : includes,
2675 link_with : [libshared],
2676 dependencies : [libaudit],
2677 install_rpath : rootlibexecdir,
2678 install : true,
2679 install_dir : rootlibexecdir)
2680
2681 if conf.get('HAVE_KMOD') == 1
2682 executable('systemd-modules-load',
2683 'src/modules-load/modules-load.c',
2684 include_directories : includes,
2685 link_with : [libshared],
2686 dependencies : [libkmod],
2687 install_rpath : rootlibexecdir,
2688 install : true,
2689 install_dir : rootlibexecdir)
2690
2691 meson.add_install_script('sh', '-c',
2692 mkdir_p.format(modulesloaddir))
2693 meson.add_install_script('sh', '-c',
2694 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2695 endif
2696
2697 exe = executable('systemd-nspawn',
2698 systemd_nspawn_sources,
2699 'src/core/mount-setup.c', # FIXME: use a variable?
2700 'src/core/mount-setup.h',
2701 'src/core/loopback-setup.c',
2702 'src/core/loopback-setup.h',
2703 include_directories : includes,
2704 link_with : [libnspawn_core,
2705 libshared],
2706 dependencies : [libblkid],
2707 install_rpath : rootlibexecdir,
2708 install : true)
2709 public_programs += exe
2710
2711 if conf.get('ENABLE_NETWORKD') == 1
2712 executable('systemd-networkd',
2713 systemd_networkd_sources,
2714 include_directories : includes,
2715 link_with : [libnetworkd_core,
2716 libsystemd_network,
2717 libudev_static,
2718 libshared],
2719 dependencies : [threads],
2720 install_rpath : rootlibexecdir,
2721 install : true,
2722 install_dir : rootlibexecdir)
2723
2724 executable('systemd-networkd-wait-online',
2725 systemd_networkd_wait_online_sources,
2726 include_directories : includes,
2727 link_with : [libnetworkd_core,
2728 libshared],
2729 install_rpath : rootlibexecdir,
2730 install : true,
2731 install_dir : rootlibexecdir)
2732
2733 exe = executable('networkctl',
2734 networkctl_sources,
2735 include_directories : includes,
2736 link_with : [libsystemd_network,
2737 libshared],
2738 install_rpath : rootlibexecdir,
2739 install : true,
2740 install_dir : rootbindir)
2741 public_programs += exe
2742 endif
2743
2744 executable('systemd-sulogin-shell',
2745 ['src/sulogin-shell/sulogin-shell.c'],
2746 include_directories : includes,
2747 link_with : [libshared],
2748 install_rpath : rootlibexecdir,
2749 install : true,
2750 install_dir : rootlibexecdir)
2751
2752 ############################################################
2753
2754 custom_target(
2755 'systemd-runtest.env',
2756 output : 'systemd-runtest.env',
2757 command : ['sh', '-c', '{ ' +
2758 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2759 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2760 '} >@OUTPUT@'],
2761 build_by_default : true)
2762
2763 foreach tuple : tests
2764 sources = tuple[0]
2765 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2766 dependencies = tuple[2]
2767 condition = tuple.length() >= 4 ? tuple[3] : ''
2768 type = tuple.length() >= 5 ? tuple[4] : ''
2769 defs = tuple.length() >= 6 ? tuple[5] : []
2770 incs = tuple.length() >= 7 ? tuple[6] : includes
2771 timeout = 30
2772
2773 name = sources[0].split('/')[-1].split('.')[0]
2774 if type.startswith('timeout=')
2775 timeout = type.split('=')[1].to_int()
2776 type = ''
2777 endif
2778
2779 if condition == '' or conf.get(condition) == 1
2780 exe = executable(
2781 name,
2782 sources,
2783 include_directories : incs,
2784 link_with : link_with,
2785 dependencies : dependencies,
2786 c_args : defs,
2787 build_by_default : want_tests != 'false',
2788 install_rpath : rootlibexecdir,
2789 install : install_tests,
2790 install_dir : join_paths(testsdir, type))
2791
2792 if type == 'manual'
2793 message('@0@ is a manual test'.format(name))
2794 elif type == 'unsafe' and want_tests != 'unsafe'
2795 message('@0@ is an unsafe test'.format(name))
2796 elif want_tests != 'false'
2797 test(name, exe,
2798 env : test_env,
2799 timeout : timeout)
2800 endif
2801 else
2802 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2803 endif
2804 endforeach
2805
2806 exe = executable(
2807 'test-libsystemd-sym',
2808 test_libsystemd_sym_c,
2809 include_directories : includes,
2810 link_with : [libsystemd],
2811 build_by_default : want_tests != 'false',
2812 install : install_tests,
2813 install_dir : testsdir)
2814 if want_tests != 'false'
2815 test('test-libsystemd-sym', exe)
2816 endif
2817
2818 exe = executable(
2819 'test-libsystemd-static-sym',
2820 test_libsystemd_sym_c,
2821 include_directories : includes,
2822 link_with : [install_libsystemd_static],
2823 dependencies : [threads], # threads is already included in dependencies on the library,
2824 # but does not seem to get propagated. Add here as a work-around.
2825 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2826 install : install_tests and static_libsystemd_pic,
2827 install_dir : testsdir)
2828 if want_tests != 'false' and static_libsystemd_pic
2829 test('test-libsystemd-static-sym', exe)
2830 endif
2831
2832 exe = executable(
2833 'test-libudev-sym',
2834 test_libudev_sym_c,
2835 include_directories : includes,
2836 c_args : '-Wno-deprecated-declarations',
2837 link_with : [libudev],
2838 build_by_default : want_tests != 'false',
2839 install : install_tests,
2840 install_dir : testsdir)
2841 if want_tests != 'false'
2842 test('test-libudev-sym', exe)
2843 endif
2844
2845 exe = executable(
2846 'test-libudev-static-sym',
2847 test_libudev_sym_c,
2848 include_directories : includes,
2849 c_args : '-Wno-deprecated-declarations',
2850 link_with : [install_libudev_static],
2851 build_by_default : want_tests != 'false' and static_libudev_pic,
2852 install : install_tests and static_libudev_pic,
2853 install_dir : testsdir)
2854 if want_tests != 'false' and static_libudev_pic
2855 test('test-libudev-static-sym', exe)
2856 endif
2857
2858 ############################################################
2859
2860 fuzzer_exes = []
2861
2862 if get_option('tests') != 'false'
2863 foreach tuple : fuzzers
2864 sources = tuple[0]
2865 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2866 dependencies = tuple[2]
2867 defs = tuple.length() >= 4 ? tuple[3] : []
2868 incs = tuple.length() >= 5 ? tuple[4] : includes
2869
2870 if fuzzer_build
2871 dependencies += fuzzing_engine
2872 else
2873 sources += 'src/fuzz/fuzz-main.c'
2874 endif
2875
2876 name = sources[0].split('/')[-1].split('.')[0]
2877
2878 fuzzer_exes += executable(
2879 name,
2880 sources,
2881 include_directories : [incs, include_directories('src/fuzz')],
2882 link_with : link_with,
2883 dependencies : dependencies,
2884 c_args : defs,
2885 install : false)
2886 endforeach
2887 endif
2888
2889 run_target('fuzzers',
2890 depends : fuzzer_exes,
2891 command : ['true'])
2892
2893 ############################################################
2894
2895 make_directive_index_py = find_program('tools/make-directive-index.py')
2896 make_man_index_py = find_program('tools/make-man-index.py')
2897 xml_helper_py = find_program('tools/xml_helper.py')
2898 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2899
2900 subdir('units')
2901 subdir('sysctl.d')
2902 subdir('sysusers.d')
2903 subdir('tmpfiles.d')
2904 subdir('presets')
2905 subdir('hwdb')
2906 subdir('network')
2907 subdir('man')
2908 subdir('shell-completion/bash')
2909 subdir('shell-completion/zsh')
2910 subdir('docs/sysvinit')
2911 subdir('docs/var-log')
2912
2913 install_subdir('factory/etc',
2914 install_dir : factorydir)
2915
2916 install_data('xorg/50-systemd-user.sh',
2917 install_dir : xinitrcdir)
2918 install_data('modprobe.d/systemd.conf',
2919 install_dir : modprobedir)
2920 install_data('LICENSE.GPL2',
2921 'LICENSE.LGPL2.1',
2922 'NEWS',
2923 'README',
2924 'docs/CODING_STYLE.md',
2925 'docs/DISTRO_PORTING.md',
2926 'docs/ENVIRONMENT.md',
2927 'docs/HACKING.md',
2928 'docs/TRANSIENT-SETTINGS.md',
2929 'docs/TRANSLATORS.md',
2930 'docs/UIDS-GIDS.md',
2931 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2932 install_dir : docdir)
2933
2934 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2935 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2936
2937 ############################################################
2938
2939 meson_check_help = find_program('tools/meson-check-help.sh')
2940
2941 foreach exec : public_programs
2942 name = exec.full_path().split('/')[-1]
2943 if want_tests != 'false'
2944 test('check-help-' + name,
2945 meson_check_help,
2946 args : exec.full_path())
2947 endif
2948 endforeach
2949
2950 ############################################################
2951
2952 # Enable tests for all supported sanitizers
2953 foreach tuple : sanitizers
2954 sanitizer = tuple[0]
2955 build = tuple[1]
2956
2957 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2958 prev = ''
2959 foreach p : fuzz_regression_tests
2960 b = p.split('/')[-2]
2961 c = p.split('/')[-1]
2962
2963 name = '@0@:@1@'.format(b, sanitizer)
2964
2965 if name != prev
2966 if want_tests == 'false'
2967 message('Not compiling @0@ because tests is set to false'.format(name))
2968 elif slow_tests
2969 exe = custom_target(
2970 name,
2971 output : name,
2972 depends : build,
2973 command : [env, 'ln', '-fs',
2974 join_paths(build.full_path(), b),
2975 '@OUTPUT@'],
2976 build_by_default : true)
2977 else
2978 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2979 endif
2980 endif
2981 prev = name
2982
2983 if want_tests != 'false' and slow_tests
2984 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2985 env,
2986 args : [exe.full_path(),
2987 join_paths(meson.source_root(), p)])
2988 endif
2989 endforeach
2990 endif
2991 endforeach
2992
2993
2994 ############################################################
2995
2996 if git.found()
2997 all_files = run_command(
2998 git,
2999 ['--git-dir=@0@/.git'.format(meson.source_root()),
3000 'ls-files',
3001 ':/*.[ch]'])
3002 all_files = files(all_files.stdout().split())
3003
3004 custom_target(
3005 'tags',
3006 output : 'tags',
3007 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3008 run_target(
3009 'ctags',
3010 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3011 endif
3012
3013 if git.found()
3014 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3015 run_target(
3016 'git-contrib',
3017 command : [meson_git_contrib_sh])
3018 endif
3019
3020 if git.found()
3021 git_head = run_command(
3022 git,
3023 ['--git-dir=@0@/.git'.format(meson.source_root()),
3024 'rev-parse', 'HEAD']).stdout().strip()
3025 git_head_short = run_command(
3026 git,
3027 ['--git-dir=@0@/.git'.format(meson.source_root()),
3028 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3029
3030 run_target(
3031 'git-snapshot',
3032 command : ['git', 'archive',
3033 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3034 git_head_short),
3035 '--prefix', 'systemd-@0@/'.format(git_head),
3036 'HEAD'])
3037 endif
3038
3039 ############################################################
3040
3041 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3042 run_target(
3043 'check-api-docs',
3044 depends : [man, libsystemd, libudev],
3045 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3046
3047 run_target(
3048 'make-index-md',
3049 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
3050
3051 ############################################################
3052
3053 status = [
3054 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3055
3056 'split /usr: @0@'.format(split_usr),
3057 'split bin-sbin: @0@'.format(split_bin),
3058 'prefix directory: @0@'.format(prefixdir),
3059 'rootprefix directory: @0@'.format(rootprefixdir),
3060 'sysconf directory: @0@'.format(sysconfdir),
3061 'include directory: @0@'.format(includedir),
3062 'lib directory: @0@'.format(libdir),
3063 'rootlib directory: @0@'.format(rootlibdir),
3064 'SysV init scripts: @0@'.format(sysvinit_path),
3065 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3066 'PAM modules directory: @0@'.format(pamlibdir),
3067 'PAM configuration directory: @0@'.format(pamconfdir),
3068 'RPM macros directory: @0@'.format(rpmmacrosdir),
3069 'modprobe.d directory: @0@'.format(modprobedir),
3070 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3071 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3072 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3073 'bash completions directory: @0@'.format(bashcompletiondir),
3074 'zsh completions directory: @0@'.format(zshcompletiondir),
3075 'extra start script: @0@'.format(get_option('rc-local')),
3076 'extra stop script: @0@'.format(get_option('halt-local')),
3077 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3078 get_option('debug-tty')),
3079 'TTY GID: @0@'.format(tty_gid),
3080 'users GID: @0@'.format(substs.get('USERS_GID')),
3081 'maximum system UID: @0@'.format(system_uid_max),
3082 'maximum system GID: @0@'.format(system_gid_max),
3083 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3084 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3085 'minimum container UID base: @0@'.format(container_uid_base_min),
3086 'maximum container UID base: @0@'.format(container_uid_base_max),
3087 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3088 'render group access mode: @0@'.format(get_option('group-render-mode')),
3089 'certificate root directory: @0@'.format(get_option('certificate-root')),
3090 'support URL: @0@'.format(support_url),
3091 'nobody user name: @0@'.format(nobody_user),
3092 'nobody group name: @0@'.format(nobody_group),
3093 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3094 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3095
3096 'default DNSSEC mode: @0@'.format(default_dnssec),
3097 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3098 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3099 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3100 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3101
3102 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3103 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3104 status += [
3105 'default DNS servers: @0@'.format(alt_dns_servers),
3106 'default NTP servers: @0@'.format(alt_ntp_servers)]
3107
3108 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3109 '@@0@'.format(time_epoch)).stdout().strip()
3110 status += [
3111 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3112
3113 status += [
3114 'static libsystemd: @0@'.format(static_libsystemd),
3115 'static libudev: @0@'.format(static_libudev)]
3116
3117 # TODO:
3118 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3119 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3120 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3121
3122 if conf.get('ENABLE_EFI') == 1
3123 status += 'efi arch: @0@'.format(efi_arch)
3124
3125 if have_gnu_efi
3126 status += [
3127 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3128 'EFI CC @0@'.format(efi_cc),
3129 'EFI lib directory: @0@'.format(efi_libdir),
3130 'EFI lds directory: @0@'.format(efi_ldsdir),
3131 'EFI include directory: @0@'.format(efi_incdir)]
3132 endif
3133 endif
3134
3135 found = []
3136 missing = []
3137
3138 foreach tuple : [
3139 ['libcryptsetup'],
3140 ['PAM'],
3141 ['AUDIT'],
3142 ['IMA'],
3143 ['AppArmor'],
3144 ['SELinux'],
3145 ['SECCOMP'],
3146 ['SMACK'],
3147 ['zlib'],
3148 ['xz'],
3149 ['lz4'],
3150 ['bzip2'],
3151 ['ACL'],
3152 ['gcrypt'],
3153 ['qrencode'],
3154 ['microhttpd'],
3155 ['gnutls'],
3156 ['openssl'],
3157 ['libcurl'],
3158 ['idn'],
3159 ['libidn2'],
3160 ['libidn'],
3161 ['libiptc'],
3162 ['elfutils'],
3163 ['binfmt'],
3164 ['vconsole'],
3165 ['quotacheck'],
3166 ['tmpfiles'],
3167 ['environment.d'],
3168 ['sysusers'],
3169 ['firstboot'],
3170 ['randomseed'],
3171 ['backlight'],
3172 ['rfkill'],
3173 ['logind'],
3174 ['machined'],
3175 ['portabled'],
3176 ['importd'],
3177 ['hostnamed'],
3178 ['timedated'],
3179 ['timesyncd'],
3180 ['localed'],
3181 ['networkd'],
3182 ['resolve'],
3183 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3184 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3185 ['coredump'],
3186 ['polkit'],
3187 ['legacy pkla', install_polkit_pkla],
3188 ['efi'],
3189 ['gnu-efi', have_gnu_efi],
3190 ['kmod'],
3191 ['xkbcommon'],
3192 ['pcre2'],
3193 ['blkid'],
3194 ['dbus'],
3195 ['glib'],
3196 ['nss-myhostname'],
3197 ['nss-mymachines'],
3198 ['nss-resolve'],
3199 ['nss-systemd'],
3200 ['hwdb'],
3201 ['tpm'],
3202 ['man pages', want_man],
3203 ['html pages', want_html],
3204 ['man page indices', want_man and have_lxml],
3205 ['SysV compat'],
3206 ['utmp'],
3207 ['ldconfig'],
3208 ['hibernate'],
3209 ['adm group', get_option('adm-group')],
3210 ['wheel group', get_option('wheel-group')],
3211 ['gshadow'],
3212 ['debug hashmap'],
3213 ['debug mmap cache'],
3214 ['debug siphash'],
3215 ['debug udev'],
3216 ['valgrind', conf.get('VALGRIND') == 1],
3217 ['trace logging', conf.get('LOG_TRACE') == 1],
3218 ['link-udev-shared', get_option('link-udev-shared')],
3219 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3220 ]
3221
3222 if tuple.length() >= 2
3223 cond = tuple[1]
3224 else
3225 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3226 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3227 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3228 endif
3229 if cond
3230 found += tuple[0]
3231 else
3232 missing += tuple[0]
3233 endif
3234 endforeach
3235
3236 status += [
3237 '',
3238 'enabled features: @0@'.format(', '.join(found)),
3239 '',
3240 'disabled features: @0@'.format(', '.join(missing)),
3241 '']
3242 message('\n '.join(status))
3243
3244 if rootprefixdir != rootprefix_default
3245 warning('\n' +
3246 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3247 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3248 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3249 endif