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