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