]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
hwdb: Add accelerometer orientation quirk for the PoV TAB-P1006W-232-3G
[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/sd-resolve',
1441 'src/libsystemd-network',
1442 '.')
1443
1444 add_project_arguments('-include', 'config.h', language : 'c')
1445
1446 generate_gperfs = find_program('tools/generate-gperfs.py')
1447
1448 subdir('po')
1449 subdir('catalog')
1450 subdir('src/systemd')
1451 subdir('src/basic')
1452 subdir('src/libsystemd')
1453 subdir('src/libsystemd-network')
1454 subdir('src/journal')
1455 subdir('src/login')
1456
1457 libjournal_core = static_library(
1458 'journal-core',
1459 libjournal_core_sources,
1460 journald_gperf_c,
1461 include_directories : includes,
1462 install : false)
1463
1464 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1465 libsystemd = shared_library(
1466 'systemd',
1467 disable_mempool_c,
1468 version : libsystemd_version,
1469 include_directories : includes,
1470 link_args : ['-shared',
1471 '-Wl,--version-script=' + libsystemd_sym_path],
1472 link_with : [libbasic,
1473 libbasic_gcrypt],
1474 link_whole : [libsystemd_static,
1475 libjournal_client],
1476 dependencies : [threads,
1477 librt,
1478 libxz,
1479 liblz4],
1480 link_depends : libsystemd_sym,
1481 install : true,
1482 install_dir : rootlibdir)
1483
1484 static_libsystemd = get_option('static-libsystemd')
1485 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1486
1487 install_libsystemd_static = static_library(
1488 'systemd',
1489 libsystemd_sources,
1490 journal_client_sources,
1491 basic_sources,
1492 basic_gcrypt_sources,
1493 disable_mempool_c,
1494 include_directories : includes,
1495 build_by_default : static_libsystemd != 'false',
1496 install : static_libsystemd != 'false',
1497 install_dir : rootlibdir,
1498 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1499 dependencies : [threads,
1500 librt,
1501 libxz,
1502 liblz4,
1503 libcap,
1504 libblkid,
1505 libmount,
1506 libselinux,
1507 libgcrypt],
1508 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1509
1510 ############################################################
1511
1512 # binaries that have --help and are intended for use by humans,
1513 # usually, but not always, installed in /bin.
1514 public_programs = []
1515
1516 subdir('src/libudev')
1517 subdir('src/shared')
1518 subdir('src/core')
1519 subdir('src/udev')
1520 subdir('src/network')
1521
1522 subdir('src/analyze')
1523 subdir('src/journal-remote')
1524 subdir('src/coredump')
1525 subdir('src/hostname')
1526 subdir('src/import')
1527 subdir('src/kernel-install')
1528 subdir('src/locale')
1529 subdir('src/machine')
1530 subdir('src/portable')
1531 subdir('src/nspawn')
1532 subdir('src/resolve')
1533 subdir('src/timedate')
1534 subdir('src/timesync')
1535 subdir('src/vconsole')
1536 subdir('src/boot/efi')
1537
1538 subdir('src/test')
1539 subdir('src/fuzz')
1540 subdir('rules')
1541 subdir('test')
1542
1543 ############################################################
1544
1545 # only static linking apart from libdl, to make sure that the
1546 # module is linked to all libraries that it uses.
1547 test_dlopen = executable(
1548 'test-dlopen',
1549 test_dlopen_c,
1550 disable_mempool_c,
1551 include_directories : includes,
1552 link_with : [libbasic],
1553 dependencies : [libdl],
1554 build_by_default : want_tests != 'false')
1555
1556 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1557 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1558 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1559 ['resolve', 'ENABLE_NSS_RESOLVE']]
1560
1561 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1562 if condition
1563 module = tuple[0]
1564
1565 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1566 version_script_arg = join_paths(meson.source_root(), sym)
1567
1568 nss = shared_library(
1569 'nss_' + module,
1570 'src/nss-@0@/nss-@0@.c'.format(module),
1571 disable_mempool_c,
1572 version : '2',
1573 include_directories : includes,
1574 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1575 link_args : ['-Wl,-z,nodelete',
1576 '-shared',
1577 '-Wl,--version-script=' + version_script_arg,
1578 '-Wl,--undefined'],
1579 link_with : [libsystemd_static,
1580 libbasic],
1581 dependencies : [threads,
1582 librt],
1583 link_depends : sym,
1584 install : true,
1585 install_dir : rootlibdir)
1586
1587 # We cannot use shared_module because it does not support version suffix.
1588 # Unfortunately shared_library insists on creating the symlink…
1589 meson.add_install_script('sh', '-c',
1590 'rm $DESTDIR@0@/libnss_@1@.so'
1591 .format(rootlibdir, module))
1592
1593 if want_tests != 'false'
1594 test('dlopen-nss_' + module,
1595 test_dlopen,
1596 # path to dlopen must include a slash
1597 args : nss.full_path())
1598 endif
1599 endif
1600 endforeach
1601
1602 ############################################################
1603
1604 executable('systemd',
1605 systemd_sources,
1606 include_directories : includes,
1607 link_with : [libcore,
1608 libshared],
1609 dependencies : [threads,
1610 librt,
1611 libseccomp,
1612 libselinux,
1613 libmount,
1614 libblkid],
1615 install_rpath : rootlibexecdir,
1616 install : true,
1617 install_dir : rootlibexecdir)
1618
1619 meson.add_install_script(meson_make_symlink,
1620 join_paths(rootlibexecdir, 'systemd'),
1621 join_paths(rootsbindir, 'init'))
1622
1623 exe = executable('systemd-analyze',
1624 systemd_analyze_sources,
1625 include_directories : includes,
1626 link_with : [libcore,
1627 libshared],
1628 dependencies : [threads,
1629 librt,
1630 libseccomp,
1631 libselinux,
1632 libmount,
1633 libblkid],
1634 install_rpath : rootlibexecdir,
1635 install : true)
1636 public_programs += exe
1637
1638 executable('systemd-journald',
1639 systemd_journald_sources,
1640 include_directories : includes,
1641 link_with : [libjournal_core,
1642 libshared],
1643 dependencies : [threads,
1644 libxz,
1645 liblz4,
1646 libselinux],
1647 install_rpath : rootlibexecdir,
1648 install : true,
1649 install_dir : rootlibexecdir)
1650
1651 exe = executable('systemd-cat',
1652 systemd_cat_sources,
1653 include_directories : includes,
1654 link_with : [libjournal_core,
1655 libshared],
1656 dependencies : [threads],
1657 install_rpath : rootlibexecdir,
1658 install : true)
1659 public_programs += exe
1660
1661 exe = executable('journalctl',
1662 journalctl_sources,
1663 include_directories : includes,
1664 link_with : [libshared],
1665 dependencies : [threads,
1666 libqrencode,
1667 libxz,
1668 liblz4,
1669 libpcre2],
1670 install_rpath : rootlibexecdir,
1671 install : true,
1672 install_dir : rootbindir)
1673 public_programs += exe
1674
1675 executable('systemd-getty-generator',
1676 'src/getty-generator/getty-generator.c',
1677 include_directories : includes,
1678 link_with : [libshared],
1679 install_rpath : rootlibexecdir,
1680 install : true,
1681 install_dir : systemgeneratordir)
1682
1683 executable('systemd-debug-generator',
1684 'src/debug-generator/debug-generator.c',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 install_rpath : rootlibexecdir,
1688 install : true,
1689 install_dir : systemgeneratordir)
1690
1691 executable('systemd-run-generator',
1692 'src/run-generator/run-generator.c',
1693 include_directories : includes,
1694 link_with : [libshared],
1695 install_rpath : rootlibexecdir,
1696 install : true,
1697 install_dir : systemgeneratordir)
1698
1699 executable('systemd-fstab-generator',
1700 'src/fstab-generator/fstab-generator.c',
1701 'src/core/mount-setup.c',
1702 include_directories : includes,
1703 link_with : [libshared],
1704 install_rpath : rootlibexecdir,
1705 install : true,
1706 install_dir : systemgeneratordir)
1707
1708 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1709 executable('30-systemd-environment-d-generator',
1710 'src/environment-d-generator/environment-d-generator.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 install_rpath : rootlibexecdir,
1714 install : true,
1715 install_dir : userenvgeneratordir)
1716
1717 meson.add_install_script(meson_make_symlink,
1718 join_paths(sysconfdir, 'environment'),
1719 join_paths(environmentdir, '99-environment.conf'))
1720 endif
1721
1722 if conf.get('ENABLE_HIBERNATE') == 1
1723 executable('systemd-hibernate-resume-generator',
1724 'src/hibernate-resume/hibernate-resume-generator.c',
1725 include_directories : includes,
1726 link_with : [libshared],
1727 install_rpath : rootlibexecdir,
1728 install : true,
1729 install_dir : systemgeneratordir)
1730
1731 executable('systemd-hibernate-resume',
1732 'src/hibernate-resume/hibernate-resume.c',
1733 include_directories : includes,
1734 link_with : [libshared],
1735 install_rpath : rootlibexecdir,
1736 install : true,
1737 install_dir : rootlibexecdir)
1738 endif
1739
1740 if conf.get('HAVE_BLKID') == 1
1741 executable('systemd-gpt-auto-generator',
1742 'src/gpt-auto-generator/gpt-auto-generator.c',
1743 'src/shared/blkid-util.h',
1744 include_directories : includes,
1745 link_with : [libshared],
1746 dependencies : libblkid,
1747 install_rpath : rootlibexecdir,
1748 install : true,
1749 install_dir : systemgeneratordir)
1750
1751 exe = executable('systemd-dissect',
1752 'src/dissect/dissect.c',
1753 include_directories : includes,
1754 link_with : [libshared],
1755 install_rpath : rootlibexecdir,
1756 install : true,
1757 install_dir : rootlibexecdir)
1758 public_programs += exe
1759 endif
1760
1761 if conf.get('ENABLE_RESOLVE') == 1
1762 executable('systemd-resolved',
1763 systemd_resolved_sources,
1764 include_directories : includes,
1765 link_with : [libshared,
1766 libbasic_gcrypt,
1767 libsystemd_resolve_core],
1768 dependencies : systemd_resolved_dependencies,
1769 install_rpath : rootlibexecdir,
1770 install : true,
1771 install_dir : rootlibexecdir)
1772
1773 exe = executable('resolvectl',
1774 resolvectl_sources,
1775 include_directories : includes,
1776 link_with : [libshared,
1777 libbasic_gcrypt,
1778 libsystemd_resolve_core],
1779 dependencies : [threads,
1780 libgpg_error,
1781 libm,
1782 libidn],
1783 install_rpath : rootlibexecdir,
1784 install : true)
1785 public_programs += exe
1786
1787 meson.add_install_script(meson_make_symlink,
1788 join_paths(bindir, 'resolvectl'),
1789 join_paths(rootsbindir, 'resolvconf'))
1790
1791 meson.add_install_script(meson_make_symlink,
1792 join_paths(bindir, 'resolvectl'),
1793 join_paths(bindir, 'systemd-resolve'))
1794 endif
1795
1796 if conf.get('ENABLE_LOGIND') == 1
1797 executable('systemd-logind',
1798 systemd_logind_sources,
1799 include_directories : includes,
1800 link_with : [liblogind_core,
1801 libshared],
1802 dependencies : [threads,
1803 libacl],
1804 install_rpath : rootlibexecdir,
1805 install : true,
1806 install_dir : rootlibexecdir)
1807
1808 exe = executable('loginctl',
1809 loginctl_sources,
1810 include_directories : includes,
1811 link_with : [libshared],
1812 dependencies : [threads,
1813 liblz4,
1814 libxz],
1815 install_rpath : rootlibexecdir,
1816 install : true,
1817 install_dir : rootbindir)
1818 public_programs += exe
1819
1820 exe = executable('systemd-inhibit',
1821 'src/login/inhibit.c',
1822 include_directories : includes,
1823 link_with : [libshared],
1824 install_rpath : rootlibexecdir,
1825 install : true,
1826 install_dir : rootbindir)
1827 public_programs += exe
1828
1829 if conf.get('HAVE_PAM') == 1
1830 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1831 pam_systemd = shared_library(
1832 'pam_systemd',
1833 pam_systemd_c,
1834 name_prefix : '',
1835 include_directories : includes,
1836 link_args : ['-shared',
1837 '-Wl,--version-script=' + version_script_arg],
1838 link_with : [libsystemd_static,
1839 libshared_static],
1840 dependencies : [threads,
1841 libpam,
1842 libpam_misc],
1843 link_depends : pam_systemd_sym,
1844 install : true,
1845 install_dir : pamlibdir)
1846
1847 if want_tests != 'false'
1848 test('dlopen-pam_systemd',
1849 test_dlopen,
1850 # path to dlopen must include a slash
1851 args : pam_systemd.full_path())
1852 endif
1853 endif
1854
1855 executable('systemd-user-runtime-dir',
1856 user_runtime_dir_sources,
1857 include_directories : includes,
1858 link_with : [libshared],
1859 install_rpath : rootlibexecdir,
1860 install : true,
1861 install_dir : rootlibexecdir)
1862 endif
1863
1864 if conf.get('HAVE_PAM') == 1
1865 executable('systemd-user-sessions',
1866 'src/user-sessions/user-sessions.c',
1867 include_directories : includes,
1868 link_with : [libshared],
1869 install_rpath : rootlibexecdir,
1870 install : true,
1871 install_dir : rootlibexecdir)
1872 endif
1873
1874 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1875 exe = executable('bootctl',
1876 'src/boot/bootctl.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 dependencies : [libblkid],
1880 install_rpath : rootlibexecdir,
1881 install : true)
1882 public_programs += exe
1883
1884 executable('systemd-bless-boot',
1885 'src/boot/bless-boot.c',
1886 include_directories : includes,
1887 link_with : [libshared],
1888 dependencies : [libblkid],
1889 install_rpath : rootlibexecdir,
1890 install : true,
1891 install_dir : rootlibexecdir)
1892
1893 executable('systemd-bless-boot-generator',
1894 'src/boot/bless-boot-generator.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 install_rpath : rootlibexecdir,
1898 install : true,
1899 install_dir : systemgeneratordir)
1900 endif
1901
1902 executable('systemd-boot-check-no-failures',
1903 'src/boot/boot-check-no-failures.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 dependencies : [libblkid],
1907 install_rpath : rootlibexecdir,
1908 install : true,
1909 install_dir : rootlibexecdir)
1910
1911 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 dependencies : [threads],
1915 install_rpath : rootlibexecdir,
1916 install : true)
1917 public_programs += exe
1918
1919
1920 if get_option('link-systemctl-shared')
1921 systemctl_link_with = [libshared]
1922 else
1923 systemctl_link_with = [libsystemd_static,
1924 libshared_static,
1925 libjournal_client,
1926 libbasic_gcrypt]
1927 endif
1928
1929 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1930 include_directories : includes,
1931 link_with : systemctl_link_with,
1932 dependencies : [threads,
1933 libcap,
1934 libselinux,
1935 libxz,
1936 liblz4],
1937 install_rpath : rootlibexecdir,
1938 install : true,
1939 install_dir : rootbindir)
1940 public_programs += exe
1941
1942 if conf.get('ENABLE_PORTABLED') == 1
1943 executable('systemd-portabled',
1944 systemd_portabled_sources,
1945 include_directories : includes,
1946 link_with : [libshared],
1947 dependencies : [threads],
1948 install_rpath : rootlibexecdir,
1949 install : true,
1950 install_dir : rootlibexecdir)
1951
1952 exe = executable('portablectl', 'src/portable/portablectl.c',
1953 include_directories : includes,
1954 link_with : [libshared],
1955 dependencies : [threads],
1956 install_rpath : rootlibexecdir,
1957 install : true,
1958 install_dir : rootbindir)
1959 public_programs += exe
1960 endif
1961
1962 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1963 meson.add_install_script(meson_make_symlink,
1964 join_paths(rootbindir, 'systemctl'),
1965 join_paths(rootsbindir, alias))
1966 endforeach
1967
1968 if conf.get('ENABLE_BACKLIGHT') == 1
1969 executable('systemd-backlight',
1970 'src/backlight/backlight.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 install_rpath : rootlibexecdir,
1974 install : true,
1975 install_dir : rootlibexecdir)
1976 endif
1977
1978 if conf.get('ENABLE_RFKILL') == 1
1979 executable('systemd-rfkill',
1980 'src/rfkill/rfkill.c',
1981 include_directories : includes,
1982 link_with : [libshared],
1983 install_rpath : rootlibexecdir,
1984 install : true,
1985 install_dir : rootlibexecdir)
1986 endif
1987
1988 executable('systemd-system-update-generator',
1989 'src/system-update-generator/system-update-generator.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1993 install : true,
1994 install_dir : systemgeneratordir)
1995
1996 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1997 executable('systemd-cryptsetup',
1998 'src/cryptsetup/cryptsetup.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 dependencies : [libcryptsetup],
2002 install_rpath : rootlibexecdir,
2003 install : true,
2004 install_dir : rootlibexecdir)
2005
2006 executable('systemd-cryptsetup-generator',
2007 'src/cryptsetup/cryptsetup-generator.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 dependencies : [libcryptsetup],
2011 install_rpath : rootlibexecdir,
2012 install : true,
2013 install_dir : systemgeneratordir)
2014
2015 executable('systemd-veritysetup',
2016 'src/veritysetup/veritysetup.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : [libcryptsetup],
2020 install_rpath : rootlibexecdir,
2021 install : true,
2022 install_dir : rootlibexecdir)
2023
2024 executable('systemd-veritysetup-generator',
2025 'src/veritysetup/veritysetup-generator.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [libcryptsetup],
2029 install_rpath : rootlibexecdir,
2030 install : true,
2031 install_dir : systemgeneratordir)
2032 endif
2033
2034 if conf.get('HAVE_SYSV_COMPAT') == 1
2035 executable('systemd-sysv-generator',
2036 'src/sysv-generator/sysv-generator.c',
2037 include_directories : includes,
2038 link_with : [libshared],
2039 install_rpath : rootlibexecdir,
2040 install : true,
2041 install_dir : systemgeneratordir)
2042
2043 executable('systemd-rc-local-generator',
2044 'src/rc-local-generator/rc-local-generator.c',
2045 include_directories : includes,
2046 link_with : [libshared],
2047 install_rpath : rootlibexecdir,
2048 install : true,
2049 install_dir : systemgeneratordir)
2050 endif
2051
2052 if conf.get('ENABLE_HOSTNAMED') == 1
2053 executable('systemd-hostnamed',
2054 'src/hostname/hostnamed.c',
2055 include_directories : includes,
2056 link_with : [libshared],
2057 install_rpath : rootlibexecdir,
2058 install : true,
2059 install_dir : rootlibexecdir)
2060
2061 exe = executable('hostnamectl',
2062 'src/hostname/hostnamectl.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 install_rpath : rootlibexecdir,
2066 install : true)
2067 public_programs += exe
2068 endif
2069
2070 if conf.get('ENABLE_LOCALED') == 1
2071 if conf.get('HAVE_XKBCOMMON') == 1
2072 # logind will load libxkbcommon.so dynamically on its own
2073 deps = [libdl]
2074 else
2075 deps = []
2076 endif
2077
2078 executable('systemd-localed',
2079 systemd_localed_sources,
2080 include_directories : includes,
2081 link_with : [libshared],
2082 dependencies : deps,
2083 install_rpath : rootlibexecdir,
2084 install : true,
2085 install_dir : rootlibexecdir)
2086
2087 exe = executable('localectl',
2088 localectl_sources,
2089 include_directories : includes,
2090 link_with : [libshared],
2091 install_rpath : rootlibexecdir,
2092 install : true)
2093 public_programs += exe
2094 endif
2095
2096 if conf.get('ENABLE_TIMEDATED') == 1
2097 executable('systemd-timedated',
2098 'src/timedate/timedated.c',
2099 include_directories : includes,
2100 link_with : [libshared],
2101 install_rpath : rootlibexecdir,
2102 install : true,
2103 install_dir : rootlibexecdir)
2104 endif
2105
2106 if conf.get('ENABLE_TIMEDATECTL') == 1
2107 exe = executable('timedatectl',
2108 'src/timedate/timedatectl.c',
2109 include_directories : includes,
2110 install_rpath : rootlibexecdir,
2111 link_with : [libshared],
2112 dependencies : [libm],
2113 install : true)
2114 public_programs += exe
2115 endif
2116
2117 if conf.get('ENABLE_TIMESYNCD') == 1
2118 executable('systemd-timesyncd',
2119 systemd_timesyncd_sources,
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [threads,
2123 libm],
2124 install_rpath : rootlibexecdir,
2125 install : true,
2126 install_dir : rootlibexecdir)
2127
2128 executable('systemd-time-wait-sync',
2129 'src/time-wait-sync/time-wait-sync.c',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 install_rpath : rootlibexecdir,
2133 install : true,
2134 install_dir : rootlibexecdir)
2135 endif
2136
2137 if conf.get('ENABLE_MACHINED') == 1
2138 executable('systemd-machined',
2139 systemd_machined_sources,
2140 include_directories : includes,
2141 link_with : [libmachine_core,
2142 libshared],
2143 install_rpath : rootlibexecdir,
2144 install : true,
2145 install_dir : rootlibexecdir)
2146
2147 exe = executable('machinectl',
2148 'src/machine/machinectl.c',
2149 include_directories : includes,
2150 link_with : [libshared],
2151 dependencies : [threads,
2152 libxz,
2153 liblz4],
2154 install_rpath : rootlibexecdir,
2155 install : true,
2156 install_dir : rootbindir)
2157 public_programs += exe
2158 endif
2159
2160 if conf.get('ENABLE_IMPORTD') == 1
2161 executable('systemd-importd',
2162 systemd_importd_sources,
2163 include_directories : includes,
2164 link_with : [libshared],
2165 dependencies : [threads],
2166 install_rpath : rootlibexecdir,
2167 install : true,
2168 install_dir : rootlibexecdir)
2169
2170 systemd_pull = executable('systemd-pull',
2171 systemd_pull_sources,
2172 include_directories : includes,
2173 link_with : [libshared],
2174 dependencies : [libcurl,
2175 libz,
2176 libbzip2,
2177 libxz,
2178 libgcrypt],
2179 install_rpath : rootlibexecdir,
2180 install : true,
2181 install_dir : rootlibexecdir)
2182
2183 systemd_import = executable('systemd-import',
2184 systemd_import_sources,
2185 include_directories : includes,
2186 link_with : [libshared],
2187 dependencies : [libcurl,
2188 libz,
2189 libbzip2,
2190 libxz],
2191 install_rpath : rootlibexecdir,
2192 install : true,
2193 install_dir : rootlibexecdir)
2194
2195 systemd_import_fs = executable('systemd-import-fs',
2196 systemd_import_fs_sources,
2197 include_directories : includes,
2198 link_with : [libshared],
2199 install_rpath : rootlibexecdir,
2200 install : true,
2201 install_dir : rootlibexecdir)
2202
2203 systemd_export = executable('systemd-export',
2204 systemd_export_sources,
2205 include_directories : includes,
2206 link_with : [libshared],
2207 dependencies : [libcurl,
2208 libz,
2209 libbzip2,
2210 libxz],
2211 install_rpath : rootlibexecdir,
2212 install : true,
2213 install_dir : rootlibexecdir)
2214
2215 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2216 endif
2217
2218 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2219 exe = executable('systemd-journal-upload',
2220 systemd_journal_upload_sources,
2221 include_directories : includes,
2222 link_with : [libshared],
2223 dependencies : [threads,
2224 libcurl,
2225 libgnutls,
2226 libxz,
2227 liblz4],
2228 install_rpath : rootlibexecdir,
2229 install : true,
2230 install_dir : rootlibexecdir)
2231 public_programs += exe
2232 endif
2233
2234 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2235 s_j_remote = executable('systemd-journal-remote',
2236 systemd_journal_remote_sources,
2237 include_directories : includes,
2238 link_with : [libshared,
2239 libsystemd_journal_remote],
2240 dependencies : [threads,
2241 libmicrohttpd,
2242 libgnutls,
2243 libxz,
2244 liblz4],
2245 install_rpath : rootlibexecdir,
2246 install : true,
2247 install_dir : rootlibexecdir)
2248
2249 s_j_gatewayd = executable('systemd-journal-gatewayd',
2250 systemd_journal_gatewayd_sources,
2251 include_directories : includes,
2252 link_with : [libshared],
2253 dependencies : [threads,
2254 libmicrohttpd,
2255 libgnutls,
2256 libxz,
2257 liblz4],
2258 install_rpath : rootlibexecdir,
2259 install : true,
2260 install_dir : rootlibexecdir)
2261 public_programs += [s_j_remote, s_j_gatewayd]
2262 endif
2263
2264 if conf.get('ENABLE_COREDUMP') == 1
2265 executable('systemd-coredump',
2266 systemd_coredump_sources,
2267 include_directories : includes,
2268 link_with : [libshared],
2269 dependencies : [threads,
2270 libacl,
2271 libdw,
2272 libxz,
2273 liblz4],
2274 install_rpath : rootlibexecdir,
2275 install : true,
2276 install_dir : rootlibexecdir)
2277
2278 exe = executable('coredumpctl',
2279 coredumpctl_sources,
2280 include_directories : includes,
2281 link_with : [libshared],
2282 dependencies : [threads,
2283 libxz,
2284 liblz4],
2285 install_rpath : rootlibexecdir,
2286 install : true)
2287 public_programs += exe
2288 endif
2289
2290 if conf.get('ENABLE_BINFMT') == 1
2291 exe = executable('systemd-binfmt',
2292 'src/binfmt/binfmt.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2296 install : true,
2297 install_dir : rootlibexecdir)
2298 public_programs += exe
2299
2300 meson.add_install_script('sh', '-c',
2301 mkdir_p.format(binfmtdir))
2302 meson.add_install_script('sh', '-c',
2303 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2304 endif
2305
2306 if conf.get('ENABLE_VCONSOLE') == 1
2307 executable('systemd-vconsole-setup',
2308 'src/vconsole/vconsole-setup.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2312 install : true,
2313 install_dir : rootlibexecdir)
2314 endif
2315
2316 if conf.get('ENABLE_RANDOMSEED') == 1
2317 executable('systemd-random-seed',
2318 'src/random-seed/random-seed.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 install_rpath : rootlibexecdir,
2322 install : true,
2323 install_dir : rootlibexecdir)
2324 endif
2325
2326 if conf.get('ENABLE_FIRSTBOOT') == 1
2327 executable('systemd-firstboot',
2328 'src/firstboot/firstboot.c',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 dependencies : [libcrypt],
2332 install_rpath : rootlibexecdir,
2333 install : true,
2334 install_dir : rootbindir)
2335 endif
2336
2337 executable('systemd-remount-fs',
2338 'src/remount-fs/remount-fs.c',
2339 'src/core/mount-setup.c',
2340 'src/core/mount-setup.h',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2344 install : true,
2345 install_dir : rootlibexecdir)
2346
2347 executable('systemd-machine-id-setup',
2348 'src/machine-id-setup/machine-id-setup-main.c',
2349 'src/core/machine-id-setup.c',
2350 'src/core/machine-id-setup.h',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 install_rpath : rootlibexecdir,
2354 install : true,
2355 install_dir : rootbindir)
2356
2357 executable('systemd-fsck',
2358 'src/fsck/fsck.c',
2359 include_directories : includes,
2360 link_with : [libshared],
2361 install_rpath : rootlibexecdir,
2362 install : true,
2363 install_dir : rootlibexecdir)
2364
2365 executable('systemd-growfs',
2366 'src/partition/growfs.c',
2367 include_directories : includes,
2368 link_with : [libshared],
2369 dependencies : [libcryptsetup],
2370 install_rpath : rootlibexecdir,
2371 install : true,
2372 install_dir : rootlibexecdir)
2373
2374 executable('systemd-makefs',
2375 'src/partition/makefs.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 install_rpath : rootlibexecdir,
2379 install : true,
2380 install_dir : rootlibexecdir)
2381
2382 executable('systemd-sleep',
2383 'src/sleep/sleep.c',
2384 include_directories : includes,
2385 link_with : [libshared],
2386 install_rpath : rootlibexecdir,
2387 install : true,
2388 install_dir : rootlibexecdir)
2389
2390 exe = executable('systemd-sysctl',
2391 'src/sysctl/sysctl.c',
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2395 install : true,
2396 install_dir : rootlibexecdir)
2397 public_programs += exe
2398
2399 executable('systemd-ac-power',
2400 'src/ac-power/ac-power.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2404 install : true,
2405 install_dir : rootlibexecdir)
2406
2407 exe = executable('systemd-detect-virt',
2408 'src/detect-virt/detect-virt.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2412 install : true)
2413 public_programs += exe
2414
2415 exe = executable('systemd-delta',
2416 'src/delta/delta.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 install_rpath : rootlibexecdir,
2420 install : true)
2421 public_programs += exe
2422
2423 exe = executable('systemd-escape',
2424 'src/escape/escape.c',
2425 include_directories : includes,
2426 link_with : [libshared],
2427 install_rpath : rootlibexecdir,
2428 install : true,
2429 install_dir : rootbindir)
2430 public_programs += exe
2431
2432 exe = executable('systemd-notify',
2433 'src/notify/notify.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2437 install : true,
2438 install_dir : rootbindir)
2439 public_programs += exe
2440
2441 executable('systemd-volatile-root',
2442 'src/volatile-root/volatile-root.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 install_rpath : rootlibexecdir,
2446 install : true,
2447 install_dir : rootlibexecdir)
2448
2449 executable('systemd-cgroups-agent',
2450 'src/cgroups-agent/cgroups-agent.c',
2451 include_directories : includes,
2452 link_with : [libshared],
2453 install_rpath : rootlibexecdir,
2454 install : true,
2455 install_dir : rootlibexecdir)
2456
2457 exe = executable('systemd-id128',
2458 'src/id128/id128.c',
2459 include_directories : includes,
2460 link_with : [libshared],
2461 install_rpath : rootlibexecdir,
2462 install : true)
2463 public_programs += exe
2464
2465 exe = executable('systemd-path',
2466 'src/path/path.c',
2467 include_directories : includes,
2468 link_with : [libshared],
2469 install_rpath : rootlibexecdir,
2470 install : true)
2471 public_programs += exe
2472
2473 exe = executable('systemd-ask-password',
2474 'src/ask-password/ask-password.c',
2475 include_directories : includes,
2476 link_with : [libshared],
2477 install_rpath : rootlibexecdir,
2478 install : true,
2479 install_dir : rootbindir)
2480 public_programs += exe
2481
2482 executable('systemd-reply-password',
2483 'src/reply-password/reply-password.c',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 install_rpath : rootlibexecdir,
2487 install : true,
2488 install_dir : rootlibexecdir)
2489
2490 exe = executable('systemd-tty-ask-password-agent',
2491 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2492 include_directories : includes,
2493 link_with : [libshared],
2494 install_rpath : rootlibexecdir,
2495 install : true,
2496 install_dir : rootbindir)
2497 public_programs += exe
2498
2499 exe = executable('systemd-cgls',
2500 'src/cgls/cgls.c',
2501 include_directories : includes,
2502 link_with : [libshared],
2503 install_rpath : rootlibexecdir,
2504 install : true)
2505 public_programs += exe
2506
2507 exe = executable('systemd-cgtop',
2508 'src/cgtop/cgtop.c',
2509 include_directories : includes,
2510 link_with : [libshared],
2511 install_rpath : rootlibexecdir,
2512 install : true)
2513 public_programs += exe
2514
2515 executable('systemd-initctl',
2516 'src/initctl/initctl.c',
2517 include_directories : includes,
2518 link_with : [libshared],
2519 install_rpath : rootlibexecdir,
2520 install : true,
2521 install_dir : rootlibexecdir)
2522
2523 exe = executable('systemd-mount',
2524 'src/mount/mount-tool.c',
2525 include_directories : includes,
2526 link_with : [libshared],
2527 install_rpath : rootlibexecdir,
2528 install : true)
2529 public_programs += exe
2530
2531 meson.add_install_script(meson_make_symlink,
2532 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2533
2534 exe = executable('systemd-run',
2535 'src/run/run.c',
2536 include_directories : includes,
2537 link_with : [libshared],
2538 install_rpath : rootlibexecdir,
2539 install : true)
2540 public_programs += exe
2541
2542 exe = executable('systemd-stdio-bridge',
2543 'src/stdio-bridge/stdio-bridge.c',
2544 include_directories : includes,
2545 link_with : [libshared],
2546 install_rpath : rootlibexecdir,
2547 install : true)
2548 public_programs += exe
2549
2550 exe = executable('busctl',
2551 'src/busctl/busctl.c',
2552 'src/busctl/busctl-introspect.c',
2553 'src/busctl/busctl-introspect.h',
2554 include_directories : includes,
2555 link_with : [libshared],
2556 install_rpath : rootlibexecdir,
2557 install : true)
2558 public_programs += exe
2559
2560 if conf.get('ENABLE_SYSUSERS') == 1
2561 exe = executable('systemd-sysusers',
2562 'src/sysusers/sysusers.c',
2563 include_directories : includes,
2564 link_with : [libshared],
2565 install_rpath : rootlibexecdir,
2566 install : true,
2567 install_dir : rootbindir)
2568 public_programs += exe
2569 endif
2570
2571 if conf.get('ENABLE_TMPFILES') == 1
2572 exe = executable('systemd-tmpfiles',
2573 'src/tmpfiles/tmpfiles.c',
2574 include_directories : includes,
2575 link_with : [libshared],
2576 dependencies : [libacl],
2577 install_rpath : rootlibexecdir,
2578 install : true,
2579 install_dir : rootbindir)
2580 public_programs += exe
2581
2582 if want_tests != 'false'
2583 test('test-systemd-tmpfiles',
2584 test_systemd_tmpfiles_py,
2585 # https://github.com/mesonbuild/meson/issues/2681
2586 args : exe.full_path())
2587 endif
2588 endif
2589
2590 if conf.get('ENABLE_HWDB') == 1
2591 exe = executable('systemd-hwdb',
2592 'src/hwdb/hwdb.c',
2593 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2594 include_directories : includes,
2595 link_with : [libudev_static],
2596 install_rpath : udev_rpath,
2597 install : true,
2598 install_dir : rootbindir)
2599 public_programs += exe
2600 endif
2601
2602 if conf.get('ENABLE_QUOTACHECK') == 1
2603 executable('systemd-quotacheck',
2604 'src/quotacheck/quotacheck.c',
2605 include_directories : includes,
2606 link_with : [libshared],
2607 install_rpath : rootlibexecdir,
2608 install : true,
2609 install_dir : rootlibexecdir)
2610 endif
2611
2612 exe = executable('systemd-socket-proxyd',
2613 'src/socket-proxy/socket-proxyd.c',
2614 include_directories : includes,
2615 link_with : [libshared],
2616 dependencies : [threads],
2617 install_rpath : rootlibexecdir,
2618 install : true,
2619 install_dir : rootlibexecdir)
2620 public_programs += exe
2621
2622 exe = executable('systemd-udevd',
2623 systemd_udevd_sources,
2624 include_directories : includes,
2625 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2626 link_with : [libudev_core,
2627 libsystemd_network,
2628 libudev_static],
2629 dependencies : [threads,
2630 libkmod,
2631 libidn,
2632 libacl,
2633 libblkid],
2634 install_rpath : udev_rpath,
2635 install : true,
2636 install_dir : rootlibexecdir)
2637 public_programs += exe
2638
2639 exe = executable('udevadm',
2640 udevadm_sources,
2641 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2642 include_directories : includes,
2643 link_with : [libudev_core,
2644 libsystemd_network,
2645 libudev_static],
2646 dependencies : [threads,
2647 libkmod,
2648 libidn,
2649 libacl,
2650 libblkid],
2651 install_rpath : udev_rpath,
2652 install : true,
2653 install_dir : rootbindir)
2654 public_programs += exe
2655
2656 executable('systemd-shutdown',
2657 systemd_shutdown_sources,
2658 include_directories : includes,
2659 link_with : [libshared],
2660 dependencies : [libmount],
2661 install_rpath : rootlibexecdir,
2662 install : true,
2663 install_dir : rootlibexecdir)
2664
2665 executable('systemd-update-done',
2666 'src/update-done/update-done.c',
2667 include_directories : includes,
2668 link_with : [libshared],
2669 install_rpath : rootlibexecdir,
2670 install : true,
2671 install_dir : rootlibexecdir)
2672
2673 executable('systemd-update-utmp',
2674 'src/update-utmp/update-utmp.c',
2675 include_directories : includes,
2676 link_with : [libshared],
2677 dependencies : [libaudit],
2678 install_rpath : rootlibexecdir,
2679 install : true,
2680 install_dir : rootlibexecdir)
2681
2682 if conf.get('HAVE_KMOD') == 1
2683 executable('systemd-modules-load',
2684 'src/modules-load/modules-load.c',
2685 include_directories : includes,
2686 link_with : [libshared],
2687 dependencies : [libkmod],
2688 install_rpath : rootlibexecdir,
2689 install : true,
2690 install_dir : rootlibexecdir)
2691
2692 meson.add_install_script('sh', '-c',
2693 mkdir_p.format(modulesloaddir))
2694 meson.add_install_script('sh', '-c',
2695 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2696 endif
2697
2698 exe = executable('systemd-nspawn',
2699 systemd_nspawn_sources,
2700 'src/core/mount-setup.c', # FIXME: use a variable?
2701 'src/core/mount-setup.h',
2702 'src/core/loopback-setup.c',
2703 'src/core/loopback-setup.h',
2704 include_directories : includes,
2705 link_with : [libnspawn_core,
2706 libshared],
2707 dependencies : [libblkid],
2708 install_rpath : rootlibexecdir,
2709 install : true)
2710 public_programs += exe
2711
2712 if conf.get('ENABLE_NETWORKD') == 1
2713 executable('systemd-networkd',
2714 systemd_networkd_sources,
2715 include_directories : includes,
2716 link_with : [libnetworkd_core,
2717 libsystemd_network,
2718 libudev_static,
2719 libshared],
2720 dependencies : [threads],
2721 install_rpath : rootlibexecdir,
2722 install : true,
2723 install_dir : rootlibexecdir)
2724
2725 executable('systemd-networkd-wait-online',
2726 systemd_networkd_wait_online_sources,
2727 include_directories : includes,
2728 link_with : [libnetworkd_core,
2729 libshared],
2730 install_rpath : rootlibexecdir,
2731 install : true,
2732 install_dir : rootlibexecdir)
2733
2734 exe = executable('networkctl',
2735 networkctl_sources,
2736 include_directories : includes,
2737 link_with : [libsystemd_network,
2738 libshared],
2739 install_rpath : rootlibexecdir,
2740 install : true,
2741 install_dir : rootbindir)
2742 public_programs += exe
2743 endif
2744
2745 executable('systemd-sulogin-shell',
2746 ['src/sulogin-shell/sulogin-shell.c'],
2747 include_directories : includes,
2748 link_with : [libshared],
2749 install_rpath : rootlibexecdir,
2750 install : true,
2751 install_dir : rootlibexecdir)
2752
2753 ############################################################
2754
2755 custom_target(
2756 'systemd-runtest.env',
2757 output : 'systemd-runtest.env',
2758 command : ['sh', '-c', '{ ' +
2759 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2760 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2761 '} >@OUTPUT@'],
2762 build_by_default : true)
2763
2764 foreach tuple : tests
2765 sources = tuple[0]
2766 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2767 dependencies = tuple[2]
2768 condition = tuple.length() >= 4 ? tuple[3] : ''
2769 type = tuple.length() >= 5 ? tuple[4] : ''
2770 defs = tuple.length() >= 6 ? tuple[5] : []
2771 incs = tuple.length() >= 7 ? tuple[6] : includes
2772 timeout = 30
2773
2774 name = sources[0].split('/')[-1].split('.')[0]
2775 if type.startswith('timeout=')
2776 timeout = type.split('=')[1].to_int()
2777 type = ''
2778 endif
2779
2780 if condition == '' or conf.get(condition) == 1
2781 exe = executable(
2782 name,
2783 sources,
2784 include_directories : incs,
2785 link_with : link_with,
2786 dependencies : dependencies,
2787 c_args : defs,
2788 build_by_default : want_tests != 'false',
2789 install_rpath : rootlibexecdir,
2790 install : install_tests,
2791 install_dir : join_paths(testsdir, type))
2792
2793 if type == 'manual'
2794 message('@0@ is a manual test'.format(name))
2795 elif type == 'unsafe' and want_tests != 'unsafe'
2796 message('@0@ is an unsafe test'.format(name))
2797 elif want_tests != 'false'
2798 test(name, exe,
2799 env : test_env,
2800 timeout : timeout)
2801 endif
2802 else
2803 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2804 endif
2805 endforeach
2806
2807 exe = executable(
2808 'test-libsystemd-sym',
2809 test_libsystemd_sym_c,
2810 include_directories : includes,
2811 link_with : [libsystemd],
2812 build_by_default : want_tests != 'false',
2813 install : install_tests,
2814 install_dir : testsdir)
2815 if want_tests != 'false'
2816 test('test-libsystemd-sym', exe)
2817 endif
2818
2819 exe = executable(
2820 'test-libsystemd-static-sym',
2821 test_libsystemd_sym_c,
2822 include_directories : includes,
2823 link_with : [install_libsystemd_static],
2824 dependencies : [threads], # threads is already included in dependencies on the library,
2825 # but does not seem to get propagated. Add here as a work-around.
2826 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2827 install : install_tests and static_libsystemd_pic,
2828 install_dir : testsdir)
2829 if want_tests != 'false' and static_libsystemd_pic
2830 test('test-libsystemd-static-sym', exe)
2831 endif
2832
2833 exe = executable(
2834 'test-libudev-sym',
2835 test_libudev_sym_c,
2836 include_directories : includes,
2837 c_args : '-Wno-deprecated-declarations',
2838 link_with : [libudev],
2839 build_by_default : want_tests != 'false',
2840 install : install_tests,
2841 install_dir : testsdir)
2842 if want_tests != 'false'
2843 test('test-libudev-sym', exe)
2844 endif
2845
2846 exe = executable(
2847 'test-libudev-static-sym',
2848 test_libudev_sym_c,
2849 include_directories : includes,
2850 c_args : '-Wno-deprecated-declarations',
2851 link_with : [install_libudev_static],
2852 build_by_default : want_tests != 'false' and static_libudev_pic,
2853 install : install_tests and static_libudev_pic,
2854 install_dir : testsdir)
2855 if want_tests != 'false' and static_libudev_pic
2856 test('test-libudev-static-sym', exe)
2857 endif
2858
2859 ############################################################
2860
2861 fuzzer_exes = []
2862
2863 if get_option('tests') != 'false'
2864 foreach tuple : fuzzers
2865 sources = tuple[0]
2866 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2867 dependencies = tuple[2]
2868 defs = tuple.length() >= 4 ? tuple[3] : []
2869 incs = tuple.length() >= 5 ? tuple[4] : includes
2870
2871 if fuzzer_build
2872 dependencies += fuzzing_engine
2873 else
2874 sources += 'src/fuzz/fuzz-main.c'
2875 endif
2876
2877 name = sources[0].split('/')[-1].split('.')[0]
2878
2879 fuzzer_exes += executable(
2880 name,
2881 sources,
2882 include_directories : [incs, include_directories('src/fuzz')],
2883 link_with : link_with,
2884 dependencies : dependencies,
2885 c_args : defs,
2886 install : false)
2887 endforeach
2888 endif
2889
2890 run_target('fuzzers',
2891 depends : fuzzer_exes,
2892 command : ['true'])
2893
2894 ############################################################
2895
2896 make_directive_index_py = find_program('tools/make-directive-index.py')
2897 make_man_index_py = find_program('tools/make-man-index.py')
2898 xml_helper_py = find_program('tools/xml_helper.py')
2899 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2900
2901 subdir('units')
2902 subdir('sysctl.d')
2903 subdir('sysusers.d')
2904 subdir('tmpfiles.d')
2905 subdir('presets')
2906 subdir('hwdb')
2907 subdir('network')
2908 subdir('man')
2909 subdir('shell-completion/bash')
2910 subdir('shell-completion/zsh')
2911 subdir('docs/sysvinit')
2912 subdir('docs/var-log')
2913
2914 install_subdir('factory/etc',
2915 install_dir : factorydir)
2916
2917 install_data('xorg/50-systemd-user.sh',
2918 install_dir : xinitrcdir)
2919 install_data('modprobe.d/systemd.conf',
2920 install_dir : modprobedir)
2921 install_data('LICENSE.GPL2',
2922 'LICENSE.LGPL2.1',
2923 'NEWS',
2924 'README',
2925 'docs/CODING_STYLE.md',
2926 'docs/DISTRO_PORTING.md',
2927 'docs/ENVIRONMENT.md',
2928 'docs/HACKING.md',
2929 'docs/TRANSIENT-SETTINGS.md',
2930 'docs/TRANSLATORS.md',
2931 'docs/UIDS-GIDS.md',
2932 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2933 install_dir : docdir)
2934
2935 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2936 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2937
2938 ############################################################
2939
2940 meson_check_help = find_program('tools/meson-check-help.sh')
2941
2942 foreach exec : public_programs
2943 name = exec.full_path().split('/')[-1]
2944 if want_tests != 'false'
2945 test('check-help-' + name,
2946 meson_check_help,
2947 args : exec.full_path())
2948 endif
2949 endforeach
2950
2951 ############################################################
2952
2953 # Enable tests for all supported sanitizers
2954 foreach tuple : sanitizers
2955 sanitizer = tuple[0]
2956 build = tuple[1]
2957
2958 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2959 prev = ''
2960 foreach p : fuzz_regression_tests
2961 b = p.split('/')[-2]
2962 c = p.split('/')[-1]
2963
2964 name = '@0@:@1@'.format(b, sanitizer)
2965
2966 if name != prev
2967 if want_tests == 'false'
2968 message('Not compiling @0@ because tests is set to false'.format(name))
2969 elif slow_tests
2970 exe = custom_target(
2971 name,
2972 output : name,
2973 depends : build,
2974 command : [env, 'ln', '-fs',
2975 join_paths(build.full_path(), b),
2976 '@OUTPUT@'],
2977 build_by_default : true)
2978 else
2979 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2980 endif
2981 endif
2982 prev = name
2983
2984 if want_tests != 'false' and slow_tests
2985 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2986 env,
2987 args : [exe.full_path(),
2988 join_paths(meson.source_root(), p)])
2989 endif
2990 endforeach
2991 endif
2992 endforeach
2993
2994
2995 ############################################################
2996
2997 if git.found()
2998 all_files = run_command(
2999 git,
3000 ['--git-dir=@0@/.git'.format(meson.source_root()),
3001 'ls-files',
3002 ':/*.[ch]'])
3003 all_files = files(all_files.stdout().split())
3004
3005 custom_target(
3006 'tags',
3007 output : 'tags',
3008 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3009 run_target(
3010 'ctags',
3011 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3012 endif
3013
3014 if git.found()
3015 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3016 run_target(
3017 'git-contrib',
3018 command : [meson_git_contrib_sh])
3019 endif
3020
3021 if git.found()
3022 git_head = run_command(
3023 git,
3024 ['--git-dir=@0@/.git'.format(meson.source_root()),
3025 'rev-parse', 'HEAD']).stdout().strip()
3026 git_head_short = run_command(
3027 git,
3028 ['--git-dir=@0@/.git'.format(meson.source_root()),
3029 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3030
3031 run_target(
3032 'git-snapshot',
3033 command : ['git', 'archive',
3034 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3035 git_head_short),
3036 '--prefix', 'systemd-@0@/'.format(git_head),
3037 'HEAD'])
3038 endif
3039
3040 ############################################################
3041
3042 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3043 run_target(
3044 'check-api-docs',
3045 depends : [man, libsystemd, libudev],
3046 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3047
3048 run_target(
3049 'make-index-md',
3050 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
3051
3052 ############################################################
3053
3054 status = [
3055 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3056
3057 'split /usr: @0@'.format(split_usr),
3058 'split bin-sbin: @0@'.format(split_bin),
3059 'prefix directory: @0@'.format(prefixdir),
3060 'rootprefix directory: @0@'.format(rootprefixdir),
3061 'sysconf directory: @0@'.format(sysconfdir),
3062 'include directory: @0@'.format(includedir),
3063 'lib directory: @0@'.format(libdir),
3064 'rootlib directory: @0@'.format(rootlibdir),
3065 'SysV init scripts: @0@'.format(sysvinit_path),
3066 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3067 'PAM modules directory: @0@'.format(pamlibdir),
3068 'PAM configuration directory: @0@'.format(pamconfdir),
3069 'RPM macros directory: @0@'.format(rpmmacrosdir),
3070 'modprobe.d directory: @0@'.format(modprobedir),
3071 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3072 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3073 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3074 'bash completions directory: @0@'.format(bashcompletiondir),
3075 'zsh completions directory: @0@'.format(zshcompletiondir),
3076 'extra start script: @0@'.format(get_option('rc-local')),
3077 'extra stop script: @0@'.format(get_option('halt-local')),
3078 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3079 get_option('debug-tty')),
3080 'TTY GID: @0@'.format(tty_gid),
3081 'users GID: @0@'.format(substs.get('USERS_GID')),
3082 'maximum system UID: @0@'.format(system_uid_max),
3083 'maximum system GID: @0@'.format(system_gid_max),
3084 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3085 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3086 'minimum container UID base: @0@'.format(container_uid_base_min),
3087 'maximum container UID base: @0@'.format(container_uid_base_max),
3088 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3089 'render group access mode: @0@'.format(get_option('group-render-mode')),
3090 'certificate root directory: @0@'.format(get_option('certificate-root')),
3091 'support URL: @0@'.format(support_url),
3092 'nobody user name: @0@'.format(nobody_user),
3093 'nobody group name: @0@'.format(nobody_group),
3094 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3095 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3096
3097 'default DNSSEC mode: @0@'.format(default_dnssec),
3098 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3099 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3100 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3101 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3102
3103 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3104 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3105 status += [
3106 'default DNS servers: @0@'.format(alt_dns_servers),
3107 'default NTP servers: @0@'.format(alt_ntp_servers)]
3108
3109 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3110 '@@0@'.format(time_epoch)).stdout().strip()
3111 status += [
3112 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3113
3114 status += [
3115 'static libsystemd: @0@'.format(static_libsystemd),
3116 'static libudev: @0@'.format(static_libudev)]
3117
3118 # TODO:
3119 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3120 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3121 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3122
3123 if conf.get('ENABLE_EFI') == 1
3124 status += 'efi arch: @0@'.format(efi_arch)
3125
3126 if have_gnu_efi
3127 status += [
3128 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3129 'EFI CC @0@'.format(' '.join(efi_cc)),
3130 'EFI lib directory: @0@'.format(efi_libdir),
3131 'EFI lds directory: @0@'.format(efi_ldsdir),
3132 'EFI include directory: @0@'.format(efi_incdir)]
3133 endif
3134 endif
3135
3136 found = []
3137 missing = []
3138
3139 foreach tuple : [
3140 ['libcryptsetup'],
3141 ['PAM'],
3142 ['AUDIT'],
3143 ['IMA'],
3144 ['AppArmor'],
3145 ['SELinux'],
3146 ['SECCOMP'],
3147 ['SMACK'],
3148 ['zlib'],
3149 ['xz'],
3150 ['lz4'],
3151 ['bzip2'],
3152 ['ACL'],
3153 ['gcrypt'],
3154 ['qrencode'],
3155 ['microhttpd'],
3156 ['gnutls'],
3157 ['openssl'],
3158 ['libcurl'],
3159 ['idn'],
3160 ['libidn2'],
3161 ['libidn'],
3162 ['libiptc'],
3163 ['elfutils'],
3164 ['binfmt'],
3165 ['vconsole'],
3166 ['quotacheck'],
3167 ['tmpfiles'],
3168 ['environment.d'],
3169 ['sysusers'],
3170 ['firstboot'],
3171 ['randomseed'],
3172 ['backlight'],
3173 ['rfkill'],
3174 ['logind'],
3175 ['machined'],
3176 ['portabled'],
3177 ['importd'],
3178 ['hostnamed'],
3179 ['timedated'],
3180 ['timesyncd'],
3181 ['localed'],
3182 ['networkd'],
3183 ['resolve'],
3184 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3185 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3186 ['coredump'],
3187 ['polkit'],
3188 ['legacy pkla', install_polkit_pkla],
3189 ['efi'],
3190 ['gnu-efi', have_gnu_efi],
3191 ['kmod'],
3192 ['xkbcommon'],
3193 ['pcre2'],
3194 ['blkid'],
3195 ['dbus'],
3196 ['glib'],
3197 ['nss-myhostname'],
3198 ['nss-mymachines'],
3199 ['nss-resolve'],
3200 ['nss-systemd'],
3201 ['hwdb'],
3202 ['tpm'],
3203 ['man pages', want_man],
3204 ['html pages', want_html],
3205 ['man page indices', want_man and have_lxml],
3206 ['SysV compat'],
3207 ['utmp'],
3208 ['ldconfig'],
3209 ['hibernate'],
3210 ['adm group', get_option('adm-group')],
3211 ['wheel group', get_option('wheel-group')],
3212 ['gshadow'],
3213 ['debug hashmap'],
3214 ['debug mmap cache'],
3215 ['debug siphash'],
3216 ['debug udev'],
3217 ['valgrind', conf.get('VALGRIND') == 1],
3218 ['trace logging', conf.get('LOG_TRACE') == 1],
3219 ['link-udev-shared', get_option('link-udev-shared')],
3220 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3221 ]
3222
3223 if tuple.length() >= 2
3224 cond = tuple[1]
3225 else
3226 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3227 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3228 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3229 endif
3230 if cond
3231 found += tuple[0]
3232 else
3233 missing += tuple[0]
3234 endif
3235 endforeach
3236
3237 status += [
3238 '',
3239 'enabled features: @0@'.format(', '.join(found)),
3240 '',
3241 'disabled features: @0@'.format(', '.join(missing)),
3242 '']
3243 message('\n '.join(status))
3244
3245 if rootprefixdir != rootprefix_default
3246 warning('\n' +
3247 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3248 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3249 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3250 endif