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