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