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