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