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