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