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