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