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