]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
Merge pull request #11918 from keszybz/clang-8
[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 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
70
71 sysvinit_path = get_option('sysvinit-path')
72 sysvrcnd_path = get_option('sysvrcnd-path')
73 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
74 description : 'SysV init scripts and rcN.d links are supported')
75
76 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
77 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
78 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
79
80 # join_paths ignores the preceding arguments if an absolute component is
81 # encountered, so this should canonicalize various paths when they are
82 # absolute or relative.
83 prefixdir = get_option('prefix')
84 if not prefixdir.startswith('/')
85 error('Prefix is not absolute: "@0@"'.format(prefixdir))
86 endif
87 bindir = join_paths(prefixdir, get_option('bindir'))
88 libdir = join_paths(prefixdir, get_option('libdir'))
89 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
90 includedir = join_paths(prefixdir, get_option('includedir'))
91 datadir = join_paths(prefixdir, get_option('datadir'))
92 localstatedir = join_paths('/', get_option('localstatedir'))
93
94 rootbindir = join_paths(rootprefixdir, 'bin')
95 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
96 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
97
98 rootlibdir = get_option('rootlibdir')
99 if rootlibdir == ''
100 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
101 endif
102
103 # Dirs of external packages
104 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
105 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
106 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
107 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
108 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
109 varlogdir = join_paths(localstatedir, 'log')
110 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
111 rpmmacrosdir = get_option('rpmmacrosdir')
112 if rpmmacrosdir != 'no'
113 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
114 endif
115 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
116
117 # Our own paths
118 pkgdatadir = join_paths(datadir, 'systemd')
119 environmentdir = join_paths(prefixdir, 'lib/environment.d')
120 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
121 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
122 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
123 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
124 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
125 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
126 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
127 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
128 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
129 pkgincludedir = join_paths(includedir, 'systemd')
130 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
131 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
132 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
133 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
134 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
135 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
136 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
137 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
138 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
139 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('rootprefix', rootprefixdir)
239 substs.set('rootprefix_noslash', rootprefixdir_noslash)
240 substs.set('exec_prefix', prefixdir)
241 substs.set('libdir', libdir)
242 substs.set('rootlibdir', rootlibdir)
243 substs.set('includedir', includedir)
244 substs.set('sysconfdir', sysconfdir)
245 substs.set('bindir', bindir)
246 substs.set('rootbindir', rootbindir)
247 substs.set('rootlibexecdir', rootlibexecdir)
248 substs.set('systemunitdir', systemunitdir)
249 substs.set('userunitdir', userunitdir)
250 substs.set('systempresetdir', systempresetdir)
251 substs.set('userpresetdir', userpresetdir)
252 substs.set('udevhwdbdir', udevhwdbdir)
253 substs.set('udevrulesdir', udevrulesdir)
254 substs.set('udevlibexecdir', udevlibexecdir)
255 substs.set('environmentdir', environmentdir)
256 substs.set('catalogdir', catalogdir)
257 substs.set('tmpfilesdir', tmpfilesdir)
258 substs.set('sysusersdir', sysusersdir)
259 substs.set('sysctldir', sysctldir)
260 substs.set('binfmtdir', binfmtdir)
261 substs.set('modulesloaddir', modulesloaddir)
262 substs.set('modprobedir', modprobedir)
263 substs.set('systemgeneratordir', systemgeneratordir)
264 substs.set('usergeneratordir', usergeneratordir)
265 substs.set('systemenvgeneratordir', systemenvgeneratordir)
266 substs.set('userenvgeneratordir', userenvgeneratordir)
267 substs.set('systemshutdowndir', systemshutdowndir)
268 substs.set('systemsleepdir', systemsleepdir)
269 substs.set('VARLOGDIR', varlogdir)
270 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
271 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
272 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
273 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
274 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
275 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
276 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
277 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
278 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
279
280 #####################################################################
281
282 cc = meson.get_compiler('c')
283 pkgconfig = import('pkgconfig')
284 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
285 meson_build_sh = find_program('tools/meson-build.sh')
286
287 want_tests = get_option('tests')
288 slow_tests = want_tests != 'false' and get_option('slow-tests')
289 install_tests = get_option('install-tests')
290
291 if add_languages('cpp', required : fuzzer_build)
292 # Used only for tests
293 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
294 else
295 cxx_cmd = ''
296 endif
297
298 if want_libfuzzer
299 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
300 elif want_ossfuzz
301 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
302 endif
303
304 possible_cc_flags = [
305 '-Wextra',
306 '-Werror=undef',
307 '-Wlogical-op',
308 '-Wmissing-include-dirs',
309 '-Wold-style-definition',
310 '-Wpointer-arith',
311 '-Winit-self',
312 '-Wfloat-equal',
313 '-Wsuggest-attribute=noreturn',
314 '-Werror=missing-prototypes',
315 '-Werror=implicit-function-declaration',
316 '-Werror=missing-declarations',
317 '-Werror=return-type',
318 '-Werror=incompatible-pointer-types',
319 '-Werror=format=2',
320 '-Wstrict-prototypes',
321 '-Wredundant-decls',
322 '-Wmissing-noreturn',
323 '-Wimplicit-fallthrough=5',
324 '-Wshadow',
325 '-Wendif-labels',
326 '-Wstrict-aliasing=2',
327 '-Wwrite-strings',
328 '-Werror=overflow',
329 '-Werror=shift-count-overflow',
330 '-Werror=shift-overflow=2',
331 '-Wdate-time',
332 '-Wnested-externs',
333
334 # negative arguments are correctly detected starting with meson 0.46.
335 '-Wno-unused-parameter',
336 '-Wno-missing-field-initializers',
337 '-Wno-unused-result',
338 '-Wno-format-signedness',
339 '-Wno-error=#warnings', # clang
340 '-Wno-string-plus-int', # clang
341
342 # work-around for gcc 7.1 turning this on on its own.
343 '-Wno-error=nonnull',
344
345 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
346 # optimizations enabled, producing essentially false positives.
347 '-Wno-maybe-uninitialized',
348
349 '-ffast-math',
350 '-fno-common',
351 '-fdiagnostics-show-option',
352 '-fno-strict-aliasing',
353 '-fvisibility=hidden',
354 '-fstack-protector',
355 '-fstack-protector-strong',
356 '--param=ssp-buffer-size=4',
357 ]
358
359 # --as-needed and --no-undefined are provided by meson by default,
360 # run mesonconf to see what is enabled
361 possible_link_flags = [
362 '-Wl,-z,relro',
363 '-Wl,-z,now',
364 ]
365
366 if cc.get_id() == 'clang'
367 possible_cc_flags += [
368 '-Wno-typedef-redefinition',
369 '-Wno-gnu-variable-sized-type-not-at-end',
370 ]
371 endif
372
373 if get_option('buildtype') != 'debug'
374 possible_cc_flags += [
375 '-ffunction-sections',
376 '-fdata-sections',
377 ]
378
379 possible_link_flags += '-Wl,--gc-sections'
380 endif
381
382 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
383 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
384
385 if cc.compiles('''
386 #include <time.h>
387 #include <inttypes.h>
388 typedef uint64_t usec_t;
389 usec_t now(clockid_t clock);
390 int main(void) {
391 struct timespec now;
392 return 0;
393 }
394 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
395 add_project_arguments('-Werror=shadow', language : 'c')
396 endif
397
398 cpp = ' '.join(cc.cmd_array()) + ' -E'
399
400 #####################################################################
401 # compilation result tests
402
403 conf.set('_GNU_SOURCE', true)
404 conf.set('__SANE_USERSPACE_TYPES__', true)
405
406 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
407 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
408 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
409 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
410 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
411 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
412 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
413
414 decl_headers = '''
415 #include <uchar.h>
416 #include <sys/stat.h>
417 '''
418
419 foreach decl : ['char16_t',
420 'char32_t',
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/shutdown',
1448 'src/libsystemd/sd-bus',
1449 'src/libsystemd/sd-device',
1450 'src/libsystemd/sd-event',
1451 'src/libsystemd/sd-hwdb',
1452 'src/libsystemd/sd-id128',
1453 'src/libsystemd/sd-netlink',
1454 'src/libsystemd/sd-network',
1455 'src/libsystemd/sd-resolve',
1456 'src/libsystemd-network',
1457 '.')
1458
1459 add_project_arguments('-include', 'config.h', language : 'c')
1460
1461 generate_gperfs = find_program('tools/generate-gperfs.py')
1462
1463 subdir('po')
1464 subdir('catalog')
1465 subdir('src/systemd')
1466 subdir('src/basic')
1467 subdir('src/libsystemd')
1468 subdir('src/libsystemd-network')
1469 subdir('src/journal')
1470 subdir('src/login')
1471
1472 libjournal_core = static_library(
1473 'journal-core',
1474 libjournal_core_sources,
1475 journald_gperf_c,
1476 include_directories : includes,
1477 install : false)
1478
1479 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1480 libsystemd = shared_library(
1481 'systemd',
1482 disable_mempool_c,
1483 version : libsystemd_version,
1484 include_directories : includes,
1485 link_args : ['-shared',
1486 '-Wl,--version-script=' + libsystemd_sym_path],
1487 link_with : [libbasic,
1488 libbasic_gcrypt],
1489 link_whole : [libsystemd_static,
1490 libjournal_client],
1491 dependencies : [threads,
1492 librt,
1493 libxz,
1494 liblz4],
1495 link_depends : libsystemd_sym,
1496 install : true,
1497 install_dir : rootlibdir)
1498
1499 static_libsystemd = get_option('static-libsystemd')
1500 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1501
1502 install_libsystemd_static = static_library(
1503 'systemd',
1504 libsystemd_sources,
1505 journal_client_sources,
1506 basic_sources,
1507 basic_gcrypt_sources,
1508 disable_mempool_c,
1509 include_directories : includes,
1510 build_by_default : static_libsystemd != 'false',
1511 install : static_libsystemd != 'false',
1512 install_dir : rootlibdir,
1513 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1514 dependencies : [threads,
1515 librt,
1516 libxz,
1517 liblz4,
1518 libcap,
1519 libblkid,
1520 libmount,
1521 libselinux,
1522 libgcrypt],
1523 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1524
1525 ############################################################
1526
1527 # binaries that have --help and are intended for use by humans,
1528 # usually, but not always, installed in /bin.
1529 public_programs = []
1530
1531 subdir('src/libudev')
1532 subdir('src/shared')
1533 subdir('src/core')
1534 subdir('src/shutdown')
1535 subdir('src/udev')
1536 subdir('src/network')
1537
1538 subdir('src/analyze')
1539 subdir('src/journal-remote')
1540 subdir('src/coredump')
1541 subdir('src/hostname')
1542 subdir('src/import')
1543 subdir('src/kernel-install')
1544 subdir('src/locale')
1545 subdir('src/machine')
1546 subdir('src/portable')
1547 subdir('src/nspawn')
1548 subdir('src/resolve')
1549 subdir('src/timedate')
1550 subdir('src/timesync')
1551 subdir('src/vconsole')
1552 subdir('src/boot/efi')
1553
1554 subdir('src/test')
1555 subdir('src/fuzz')
1556 subdir('rules')
1557 subdir('test')
1558
1559 ############################################################
1560
1561 # only static linking apart from libdl, to make sure that the
1562 # module is linked to all libraries that it uses.
1563 test_dlopen = executable(
1564 'test-dlopen',
1565 test_dlopen_c,
1566 disable_mempool_c,
1567 include_directories : includes,
1568 link_with : [libbasic],
1569 dependencies : [libdl],
1570 build_by_default : want_tests != 'false')
1571
1572 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1573 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1574 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1575 ['resolve', 'ENABLE_NSS_RESOLVE']]
1576
1577 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1578 if condition
1579 module = tuple[0]
1580
1581 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1582 version_script_arg = join_paths(meson.source_root(), sym)
1583
1584 nss = shared_library(
1585 'nss_' + module,
1586 'src/nss-@0@/nss-@0@.c'.format(module),
1587 disable_mempool_c,
1588 version : '2',
1589 include_directories : includes,
1590 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1591 link_args : ['-Wl,-z,nodelete',
1592 '-shared',
1593 '-Wl,--version-script=' + version_script_arg,
1594 '-Wl,--undefined'],
1595 link_with : [libsystemd_static,
1596 libbasic],
1597 dependencies : [threads,
1598 librt],
1599 link_depends : sym,
1600 install : true,
1601 install_dir : rootlibdir)
1602
1603 # We cannot use shared_module because it does not support version suffix.
1604 # Unfortunately shared_library insists on creating the symlink…
1605 meson.add_install_script('sh', '-c',
1606 'rm $DESTDIR@0@/libnss_@1@.so'
1607 .format(rootlibdir, module))
1608
1609 if want_tests != 'false'
1610 test('dlopen-nss_' + module,
1611 test_dlopen,
1612 # path to dlopen must include a slash
1613 args : nss.full_path())
1614 endif
1615 endif
1616 endforeach
1617
1618 ############################################################
1619
1620 executable('systemd',
1621 systemd_sources,
1622 include_directories : includes,
1623 link_with : [libcore,
1624 libshared],
1625 dependencies : [versiondep,
1626 threads,
1627 librt,
1628 libseccomp,
1629 libselinux,
1630 libmount,
1631 libblkid],
1632 install_rpath : rootlibexecdir,
1633 install : true,
1634 install_dir : rootlibexecdir)
1635
1636 meson.add_install_script(meson_make_symlink,
1637 join_paths(rootlibexecdir, 'systemd'),
1638 join_paths(rootsbindir, 'init'))
1639
1640 exe = executable('systemd-analyze',
1641 systemd_analyze_sources,
1642 include_directories : includes,
1643 link_with : [libcore,
1644 libshared],
1645 dependencies : [versiondep,
1646 threads,
1647 librt,
1648 libseccomp,
1649 libselinux,
1650 libmount,
1651 libblkid],
1652 install_rpath : rootlibexecdir,
1653 install : true)
1654 public_programs += exe
1655
1656 executable('systemd-journald',
1657 systemd_journald_sources,
1658 include_directories : includes,
1659 link_with : [libjournal_core,
1660 libshared],
1661 dependencies : [threads,
1662 libxz,
1663 liblz4,
1664 libselinux],
1665 install_rpath : rootlibexecdir,
1666 install : true,
1667 install_dir : rootlibexecdir)
1668
1669 exe = executable('systemd-cat',
1670 systemd_cat_sources,
1671 include_directories : includes,
1672 link_with : [libjournal_core,
1673 libshared],
1674 dependencies : [threads],
1675 install_rpath : rootlibexecdir,
1676 install : true)
1677 public_programs += exe
1678
1679 exe = executable('journalctl',
1680 journalctl_sources,
1681 include_directories : includes,
1682 link_with : [libshared],
1683 dependencies : [threads,
1684 libqrencode,
1685 libxz,
1686 liblz4,
1687 libpcre2],
1688 install_rpath : rootlibexecdir,
1689 install : true,
1690 install_dir : rootbindir)
1691 public_programs += exe
1692
1693 executable('systemd-getty-generator',
1694 'src/getty-generator/getty-generator.c',
1695 include_directories : includes,
1696 link_with : [libshared],
1697 install_rpath : rootlibexecdir,
1698 install : true,
1699 install_dir : systemgeneratordir)
1700
1701 executable('systemd-debug-generator',
1702 'src/debug-generator/debug-generator.c',
1703 include_directories : includes,
1704 link_with : [libshared],
1705 install_rpath : rootlibexecdir,
1706 install : true,
1707 install_dir : systemgeneratordir)
1708
1709 executable('systemd-run-generator',
1710 'src/run-generator/run-generator.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 install_rpath : rootlibexecdir,
1714 install : true,
1715 install_dir : systemgeneratordir)
1716
1717 executable('systemd-fstab-generator',
1718 'src/fstab-generator/fstab-generator.c',
1719 include_directories : includes,
1720 link_with : [libcore_shared,
1721 libshared],
1722 install_rpath : rootlibexecdir,
1723 install : true,
1724 install_dir : systemgeneratordir)
1725
1726 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1727 executable('30-systemd-environment-d-generator',
1728 'src/environment-d-generator/environment-d-generator.c',
1729 include_directories : includes,
1730 link_with : [libshared],
1731 install_rpath : rootlibexecdir,
1732 install : true,
1733 install_dir : userenvgeneratordir)
1734
1735 meson.add_install_script(meson_make_symlink,
1736 join_paths(sysconfdir, 'environment'),
1737 join_paths(environmentdir, '99-environment.conf'))
1738 endif
1739
1740 if conf.get('ENABLE_HIBERNATE') == 1
1741 executable('systemd-hibernate-resume-generator',
1742 'src/hibernate-resume/hibernate-resume-generator.c',
1743 include_directories : includes,
1744 link_with : [libshared],
1745 install_rpath : rootlibexecdir,
1746 install : true,
1747 install_dir : systemgeneratordir)
1748
1749 executable('systemd-hibernate-resume',
1750 'src/hibernate-resume/hibernate-resume.c',
1751 include_directories : includes,
1752 link_with : [libshared],
1753 install_rpath : rootlibexecdir,
1754 install : true,
1755 install_dir : rootlibexecdir)
1756 endif
1757
1758 if conf.get('HAVE_BLKID') == 1
1759 executable('systemd-gpt-auto-generator',
1760 'src/gpt-auto-generator/gpt-auto-generator.c',
1761 'src/shared/blkid-util.h',
1762 include_directories : includes,
1763 link_with : [libshared],
1764 dependencies : libblkid,
1765 install_rpath : rootlibexecdir,
1766 install : true,
1767 install_dir : systemgeneratordir)
1768
1769 exe = executable('systemd-dissect',
1770 'src/dissect/dissect.c',
1771 include_directories : includes,
1772 link_with : [libshared],
1773 install_rpath : rootlibexecdir,
1774 install : true,
1775 install_dir : rootlibexecdir)
1776 public_programs += exe
1777 endif
1778
1779 if conf.get('ENABLE_RESOLVE') == 1
1780 executable('systemd-resolved',
1781 systemd_resolved_sources,
1782 include_directories : includes,
1783 link_with : [libshared,
1784 libbasic_gcrypt,
1785 libsystemd_resolve_core],
1786 dependencies : systemd_resolved_dependencies,
1787 install_rpath : rootlibexecdir,
1788 install : true,
1789 install_dir : rootlibexecdir)
1790
1791 exe = executable('resolvectl',
1792 resolvectl_sources,
1793 include_directories : includes,
1794 link_with : [libshared,
1795 libbasic_gcrypt,
1796 libsystemd_resolve_core],
1797 dependencies : [threads,
1798 libgpg_error,
1799 libm,
1800 libidn],
1801 install_rpath : rootlibexecdir,
1802 install : true)
1803 public_programs += exe
1804
1805 meson.add_install_script(meson_make_symlink,
1806 join_paths(bindir, 'resolvectl'),
1807 join_paths(rootsbindir, 'resolvconf'))
1808
1809 meson.add_install_script(meson_make_symlink,
1810 join_paths(bindir, 'resolvectl'),
1811 join_paths(bindir, 'systemd-resolve'))
1812 endif
1813
1814 if conf.get('ENABLE_LOGIND') == 1
1815 executable('systemd-logind',
1816 systemd_logind_sources,
1817 include_directories : includes,
1818 link_with : [liblogind_core,
1819 libshared],
1820 dependencies : [threads,
1821 libacl],
1822 install_rpath : rootlibexecdir,
1823 install : true,
1824 install_dir : rootlibexecdir)
1825
1826 exe = executable('loginctl',
1827 loginctl_sources,
1828 include_directories : includes,
1829 link_with : [libshared],
1830 dependencies : [threads,
1831 liblz4,
1832 libxz],
1833 install_rpath : rootlibexecdir,
1834 install : true,
1835 install_dir : rootbindir)
1836 public_programs += exe
1837
1838 exe = executable('systemd-inhibit',
1839 'src/login/inhibit.c',
1840 include_directories : includes,
1841 link_with : [libshared],
1842 install_rpath : rootlibexecdir,
1843 install : true,
1844 install_dir : rootbindir)
1845 public_programs += exe
1846
1847 if conf.get('HAVE_PAM') == 1
1848 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1849 pam_systemd = shared_library(
1850 'pam_systemd',
1851 pam_systemd_c,
1852 name_prefix : '',
1853 include_directories : includes,
1854 link_args : ['-shared',
1855 '-Wl,--version-script=' + version_script_arg],
1856 link_with : [libsystemd_static,
1857 libshared_static],
1858 dependencies : [threads,
1859 libpam,
1860 libpam_misc],
1861 link_depends : pam_systemd_sym,
1862 install : true,
1863 install_dir : pamlibdir)
1864
1865 if want_tests != 'false'
1866 test('dlopen-pam_systemd',
1867 test_dlopen,
1868 # path to dlopen must include a slash
1869 args : pam_systemd.full_path())
1870 endif
1871 endif
1872
1873 executable('systemd-user-runtime-dir',
1874 user_runtime_dir_sources,
1875 include_directories : includes,
1876 link_with : [libshared],
1877 install_rpath : rootlibexecdir,
1878 install : true,
1879 install_dir : rootlibexecdir)
1880 endif
1881
1882 if conf.get('HAVE_PAM') == 1
1883 executable('systemd-user-sessions',
1884 'src/user-sessions/user-sessions.c',
1885 include_directories : includes,
1886 link_with : [libshared],
1887 install_rpath : rootlibexecdir,
1888 install : true,
1889 install_dir : rootlibexecdir)
1890 endif
1891
1892 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1893 exe = executable('bootctl',
1894 'src/boot/bootctl.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 dependencies : [libblkid],
1898 install_rpath : rootlibexecdir,
1899 install : true)
1900 public_programs += exe
1901
1902 executable('systemd-bless-boot',
1903 'src/boot/bless-boot.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 dependencies : [libblkid],
1907 install_rpath : rootlibexecdir,
1908 install : true,
1909 install_dir : rootlibexecdir)
1910
1911 executable('systemd-bless-boot-generator',
1912 'src/boot/bless-boot-generator.c',
1913 include_directories : includes,
1914 link_with : [libshared],
1915 install_rpath : rootlibexecdir,
1916 install : true,
1917 install_dir : systemgeneratordir)
1918 endif
1919
1920 executable('systemd-boot-check-no-failures',
1921 'src/boot/boot-check-no-failures.c',
1922 include_directories : includes,
1923 link_with : [libshared],
1924 dependencies : [libblkid],
1925 install_rpath : rootlibexecdir,
1926 install : true,
1927 install_dir : rootlibexecdir)
1928
1929 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1930 include_directories : includes,
1931 link_with : [libshared],
1932 dependencies : [threads],
1933 install_rpath : rootlibexecdir,
1934 install : true)
1935 public_programs += exe
1936
1937
1938 if get_option('link-systemctl-shared')
1939 systemctl_link_with = [libshared]
1940 else
1941 systemctl_link_with = [libsystemd_static,
1942 libshared_static,
1943 libjournal_client,
1944 libbasic_gcrypt]
1945 endif
1946
1947 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1948 include_directories : includes,
1949 link_with : systemctl_link_with,
1950 dependencies : [threads,
1951 libcap,
1952 libselinux,
1953 libxz,
1954 liblz4],
1955 install_rpath : rootlibexecdir,
1956 install : true,
1957 install_dir : rootbindir)
1958 public_programs += exe
1959
1960 if conf.get('ENABLE_PORTABLED') == 1
1961 executable('systemd-portabled',
1962 systemd_portabled_sources,
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [threads],
1966 install_rpath : rootlibexecdir,
1967 install : true,
1968 install_dir : rootlibexecdir)
1969
1970 exe = executable('portablectl', 'src/portable/portablectl.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 dependencies : [threads],
1974 install_rpath : rootlibexecdir,
1975 install : true,
1976 install_dir : rootbindir)
1977 public_programs += exe
1978 endif
1979
1980 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1981 meson.add_install_script(meson_make_symlink,
1982 join_paths(rootbindir, 'systemctl'),
1983 join_paths(rootsbindir, alias))
1984 endforeach
1985
1986 if conf.get('ENABLE_BACKLIGHT') == 1
1987 executable('systemd-backlight',
1988 'src/backlight/backlight.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 install_rpath : rootlibexecdir,
1992 install : true,
1993 install_dir : rootlibexecdir)
1994 endif
1995
1996 if conf.get('ENABLE_RFKILL') == 1
1997 executable('systemd-rfkill',
1998 'src/rfkill/rfkill.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 install_rpath : rootlibexecdir,
2002 install : true,
2003 install_dir : rootlibexecdir)
2004 endif
2005
2006 executable('systemd-system-update-generator',
2007 'src/system-update-generator/system-update-generator.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2011 install : true,
2012 install_dir : systemgeneratordir)
2013
2014 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2015 executable('systemd-cryptsetup',
2016 'src/cryptsetup/cryptsetup.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : [libcryptsetup],
2020 install_rpath : rootlibexecdir,
2021 install : true,
2022 install_dir : rootlibexecdir)
2023
2024 executable('systemd-cryptsetup-generator',
2025 'src/cryptsetup/cryptsetup-generator.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [libcryptsetup],
2029 install_rpath : rootlibexecdir,
2030 install : true,
2031 install_dir : systemgeneratordir)
2032
2033 executable('systemd-veritysetup',
2034 'src/veritysetup/veritysetup.c',
2035 include_directories : includes,
2036 link_with : [libshared],
2037 dependencies : [libcryptsetup],
2038 install_rpath : rootlibexecdir,
2039 install : true,
2040 install_dir : rootlibexecdir)
2041
2042 executable('systemd-veritysetup-generator',
2043 'src/veritysetup/veritysetup-generator.c',
2044 include_directories : includes,
2045 link_with : [libshared],
2046 dependencies : [libcryptsetup],
2047 install_rpath : rootlibexecdir,
2048 install : true,
2049 install_dir : systemgeneratordir)
2050 endif
2051
2052 if conf.get('HAVE_SYSV_COMPAT') == 1
2053 executable('systemd-sysv-generator',
2054 'src/sysv-generator/sysv-generator.c',
2055 include_directories : includes,
2056 link_with : [libshared],
2057 install_rpath : rootlibexecdir,
2058 install : true,
2059 install_dir : systemgeneratordir)
2060
2061 executable('systemd-rc-local-generator',
2062 'src/rc-local-generator/rc-local-generator.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 install_rpath : rootlibexecdir,
2066 install : true,
2067 install_dir : systemgeneratordir)
2068 endif
2069
2070 if conf.get('ENABLE_HOSTNAMED') == 1
2071 executable('systemd-hostnamed',
2072 'src/hostname/hostnamed.c',
2073 include_directories : includes,
2074 link_with : [libshared],
2075 install_rpath : rootlibexecdir,
2076 install : true,
2077 install_dir : rootlibexecdir)
2078
2079 exe = executable('hostnamectl',
2080 'src/hostname/hostnamectl.c',
2081 include_directories : includes,
2082 link_with : [libshared],
2083 install_rpath : rootlibexecdir,
2084 install : true)
2085 public_programs += exe
2086 endif
2087
2088 if conf.get('ENABLE_LOCALED') == 1
2089 if conf.get('HAVE_XKBCOMMON') == 1
2090 # logind will load libxkbcommon.so dynamically on its own
2091 deps = [libdl]
2092 else
2093 deps = []
2094 endif
2095
2096 executable('systemd-localed',
2097 systemd_localed_sources,
2098 include_directories : includes,
2099 link_with : [libshared],
2100 dependencies : deps,
2101 install_rpath : rootlibexecdir,
2102 install : true,
2103 install_dir : rootlibexecdir)
2104
2105 exe = executable('localectl',
2106 localectl_sources,
2107 include_directories : includes,
2108 link_with : [libshared],
2109 install_rpath : rootlibexecdir,
2110 install : true)
2111 public_programs += exe
2112 endif
2113
2114 if conf.get('ENABLE_TIMEDATED') == 1
2115 executable('systemd-timedated',
2116 'src/timedate/timedated.c',
2117 include_directories : includes,
2118 link_with : [libshared],
2119 install_rpath : rootlibexecdir,
2120 install : true,
2121 install_dir : rootlibexecdir)
2122 endif
2123
2124 if conf.get('ENABLE_TIMEDATECTL') == 1
2125 exe = executable('timedatectl',
2126 'src/timedate/timedatectl.c',
2127 include_directories : includes,
2128 install_rpath : rootlibexecdir,
2129 link_with : [libshared],
2130 dependencies : [libm],
2131 install : true)
2132 public_programs += exe
2133 endif
2134
2135 if conf.get('ENABLE_TIMESYNCD') == 1
2136 executable('systemd-timesyncd',
2137 systemd_timesyncd_sources,
2138 include_directories : includes,
2139 link_with : [libshared],
2140 dependencies : [threads,
2141 libm],
2142 install_rpath : rootlibexecdir,
2143 install : true,
2144 install_dir : rootlibexecdir)
2145
2146 executable('systemd-time-wait-sync',
2147 'src/time-wait-sync/time-wait-sync.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2151 install : true,
2152 install_dir : rootlibexecdir)
2153 endif
2154
2155 if conf.get('ENABLE_MACHINED') == 1
2156 executable('systemd-machined',
2157 systemd_machined_sources,
2158 include_directories : includes,
2159 link_with : [libmachine_core,
2160 libshared],
2161 install_rpath : rootlibexecdir,
2162 install : true,
2163 install_dir : rootlibexecdir)
2164
2165 exe = executable('machinectl',
2166 'src/machine/machinectl.c',
2167 include_directories : includes,
2168 link_with : [libshared],
2169 dependencies : [threads,
2170 libxz,
2171 liblz4],
2172 install_rpath : rootlibexecdir,
2173 install : true,
2174 install_dir : rootbindir)
2175 public_programs += exe
2176 endif
2177
2178 if conf.get('ENABLE_IMPORTD') == 1
2179 executable('systemd-importd',
2180 systemd_importd_sources,
2181 include_directories : includes,
2182 link_with : [libshared],
2183 dependencies : [threads],
2184 install_rpath : rootlibexecdir,
2185 install : true,
2186 install_dir : rootlibexecdir)
2187
2188 systemd_pull = executable('systemd-pull',
2189 systemd_pull_sources,
2190 include_directories : includes,
2191 link_with : [libshared],
2192 dependencies : [versiondep,
2193 libcurl,
2194 libz,
2195 libbzip2,
2196 libxz,
2197 libgcrypt],
2198 install_rpath : rootlibexecdir,
2199 install : true,
2200 install_dir : rootlibexecdir)
2201
2202 systemd_import = executable('systemd-import',
2203 systemd_import_sources,
2204 include_directories : includes,
2205 link_with : [libshared],
2206 dependencies : [libcurl,
2207 libz,
2208 libbzip2,
2209 libxz],
2210 install_rpath : rootlibexecdir,
2211 install : true,
2212 install_dir : rootlibexecdir)
2213
2214 systemd_import_fs = executable('systemd-import-fs',
2215 systemd_import_fs_sources,
2216 include_directories : includes,
2217 link_with : [libshared],
2218 install_rpath : rootlibexecdir,
2219 install : true,
2220 install_dir : rootlibexecdir)
2221
2222 systemd_export = executable('systemd-export',
2223 systemd_export_sources,
2224 include_directories : includes,
2225 link_with : [libshared],
2226 dependencies : [libcurl,
2227 libz,
2228 libbzip2,
2229 libxz],
2230 install_rpath : rootlibexecdir,
2231 install : true,
2232 install_dir : rootlibexecdir)
2233
2234 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2235 endif
2236
2237 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2238 exe = executable('systemd-journal-upload',
2239 systemd_journal_upload_sources,
2240 include_directories : includes,
2241 link_with : [libshared],
2242 dependencies : [versiondep,
2243 threads,
2244 libcurl,
2245 libgnutls,
2246 libxz,
2247 liblz4],
2248 install_rpath : rootlibexecdir,
2249 install : true,
2250 install_dir : rootlibexecdir)
2251 public_programs += exe
2252 endif
2253
2254 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2255 s_j_remote = executable('systemd-journal-remote',
2256 systemd_journal_remote_sources,
2257 include_directories : includes,
2258 link_with : [libshared,
2259 libsystemd_journal_remote],
2260 dependencies : [threads,
2261 libmicrohttpd,
2262 libgnutls,
2263 libxz,
2264 liblz4],
2265 install_rpath : rootlibexecdir,
2266 install : true,
2267 install_dir : rootlibexecdir)
2268
2269 s_j_gatewayd = executable('systemd-journal-gatewayd',
2270 systemd_journal_gatewayd_sources,
2271 include_directories : includes,
2272 link_with : [libshared],
2273 dependencies : [threads,
2274 libmicrohttpd,
2275 libgnutls,
2276 libxz,
2277 liblz4],
2278 install_rpath : rootlibexecdir,
2279 install : true,
2280 install_dir : rootlibexecdir)
2281 public_programs += [s_j_remote, s_j_gatewayd]
2282 endif
2283
2284 if conf.get('ENABLE_COREDUMP') == 1
2285 executable('systemd-coredump',
2286 systemd_coredump_sources,
2287 include_directories : includes,
2288 link_with : [libshared],
2289 dependencies : [threads,
2290 libacl,
2291 libdw,
2292 libxz,
2293 liblz4],
2294 install_rpath : rootlibexecdir,
2295 install : true,
2296 install_dir : rootlibexecdir)
2297
2298 exe = executable('coredumpctl',
2299 coredumpctl_sources,
2300 include_directories : includes,
2301 link_with : [libshared],
2302 dependencies : [threads,
2303 libxz,
2304 liblz4],
2305 install_rpath : rootlibexecdir,
2306 install : true)
2307 public_programs += exe
2308 endif
2309
2310 if conf.get('ENABLE_BINFMT') == 1
2311 exe = executable('systemd-binfmt',
2312 'src/binfmt/binfmt.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 install_rpath : rootlibexecdir,
2316 install : true,
2317 install_dir : rootlibexecdir)
2318 public_programs += exe
2319
2320 meson.add_install_script('sh', '-c',
2321 mkdir_p.format(binfmtdir))
2322 meson.add_install_script('sh', '-c',
2323 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2324 endif
2325
2326 if conf.get('ENABLE_VCONSOLE') == 1
2327 executable('systemd-vconsole-setup',
2328 'src/vconsole/vconsole-setup.c',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 install_rpath : rootlibexecdir,
2332 install : true,
2333 install_dir : rootlibexecdir)
2334 endif
2335
2336 if conf.get('ENABLE_RANDOMSEED') == 1
2337 executable('systemd-random-seed',
2338 'src/random-seed/random-seed.c',
2339 include_directories : includes,
2340 link_with : [libshared],
2341 install_rpath : rootlibexecdir,
2342 install : true,
2343 install_dir : rootlibexecdir)
2344 endif
2345
2346 if conf.get('ENABLE_FIRSTBOOT') == 1
2347 executable('systemd-firstboot',
2348 'src/firstboot/firstboot.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 dependencies : [libcrypt],
2352 install_rpath : rootlibexecdir,
2353 install : true,
2354 install_dir : rootbindir)
2355 endif
2356
2357 executable('systemd-remount-fs',
2358 'src/remount-fs/remount-fs.c',
2359 include_directories : includes,
2360 link_with : [libcore_shared,
2361 libshared],
2362 install_rpath : rootlibexecdir,
2363 install : true,
2364 install_dir : rootlibexecdir)
2365
2366 executable('systemd-machine-id-setup',
2367 'src/machine-id-setup/machine-id-setup-main.c',
2368 include_directories : includes,
2369 link_with : [libcore_shared,
2370 libshared],
2371 install_rpath : rootlibexecdir,
2372 install : true,
2373 install_dir : rootbindir)
2374
2375 executable('systemd-fsck',
2376 'src/fsck/fsck.c',
2377 include_directories : includes,
2378 link_with : [libshared],
2379 install_rpath : rootlibexecdir,
2380 install : true,
2381 install_dir : rootlibexecdir)
2382
2383 executable('systemd-growfs',
2384 'src/partition/growfs.c',
2385 include_directories : includes,
2386 link_with : [libshared],
2387 dependencies : [libcryptsetup],
2388 install_rpath : rootlibexecdir,
2389 install : true,
2390 install_dir : rootlibexecdir)
2391
2392 executable('systemd-makefs',
2393 'src/partition/makefs.c',
2394 include_directories : includes,
2395 link_with : [libshared],
2396 install_rpath : rootlibexecdir,
2397 install : true,
2398 install_dir : rootlibexecdir)
2399
2400 executable('systemd-sleep',
2401 'src/sleep/sleep.c',
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2405 install : true,
2406 install_dir : rootlibexecdir)
2407
2408 install_data('src/sleep/sleep.conf',
2409 install_dir : pkgsysconfdir)
2410
2411 exe = executable('systemd-sysctl',
2412 'src/sysctl/sysctl.c',
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2416 install : true,
2417 install_dir : rootlibexecdir)
2418 public_programs += exe
2419
2420 executable('systemd-ac-power',
2421 'src/ac-power/ac-power.c',
2422 include_directories : includes,
2423 link_with : [libshared],
2424 install_rpath : rootlibexecdir,
2425 install : true,
2426 install_dir : rootlibexecdir)
2427
2428 exe = executable('systemd-detect-virt',
2429 'src/detect-virt/detect-virt.c',
2430 include_directories : includes,
2431 link_with : [libshared],
2432 install_rpath : rootlibexecdir,
2433 install : true)
2434 public_programs += exe
2435
2436 exe = executable('systemd-delta',
2437 'src/delta/delta.c',
2438 include_directories : includes,
2439 link_with : [libshared],
2440 install_rpath : rootlibexecdir,
2441 install : true)
2442 public_programs += exe
2443
2444 exe = executable('systemd-escape',
2445 'src/escape/escape.c',
2446 include_directories : includes,
2447 link_with : [libshared],
2448 install_rpath : rootlibexecdir,
2449 install : true,
2450 install_dir : rootbindir)
2451 public_programs += exe
2452
2453 exe = executable('systemd-notify',
2454 'src/notify/notify.c',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2458 install : true,
2459 install_dir : rootbindir)
2460 public_programs += exe
2461
2462 executable('systemd-volatile-root',
2463 'src/volatile-root/volatile-root.c',
2464 include_directories : includes,
2465 link_with : [libshared],
2466 install_rpath : rootlibexecdir,
2467 install : true,
2468 install_dir : rootlibexecdir)
2469
2470 executable('systemd-cgroups-agent',
2471 'src/cgroups-agent/cgroups-agent.c',
2472 include_directories : includes,
2473 link_with : [libshared],
2474 install_rpath : rootlibexecdir,
2475 install : true,
2476 install_dir : rootlibexecdir)
2477
2478 exe = executable('systemd-id128',
2479 'src/id128/id128.c',
2480 include_directories : includes,
2481 link_with : [libshared],
2482 install_rpath : rootlibexecdir,
2483 install : true)
2484 public_programs += exe
2485
2486 exe = executable('systemd-path',
2487 'src/path/path.c',
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2491 install : true)
2492 public_programs += exe
2493
2494 exe = executable('systemd-ask-password',
2495 'src/ask-password/ask-password.c',
2496 include_directories : includes,
2497 link_with : [libshared],
2498 install_rpath : rootlibexecdir,
2499 install : true,
2500 install_dir : rootbindir)
2501 public_programs += exe
2502
2503 executable('systemd-reply-password',
2504 'src/reply-password/reply-password.c',
2505 include_directories : includes,
2506 link_with : [libshared],
2507 install_rpath : rootlibexecdir,
2508 install : true,
2509 install_dir : rootlibexecdir)
2510
2511 exe = executable('systemd-tty-ask-password-agent',
2512 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2513 include_directories : includes,
2514 link_with : [libshared],
2515 install_rpath : rootlibexecdir,
2516 install : true,
2517 install_dir : rootbindir)
2518 public_programs += exe
2519
2520 exe = executable('systemd-cgls',
2521 'src/cgls/cgls.c',
2522 include_directories : includes,
2523 link_with : [libshared],
2524 install_rpath : rootlibexecdir,
2525 install : true)
2526 public_programs += exe
2527
2528 exe = executable('systemd-cgtop',
2529 'src/cgtop/cgtop.c',
2530 include_directories : includes,
2531 link_with : [libshared],
2532 install_rpath : rootlibexecdir,
2533 install : true)
2534 public_programs += exe
2535
2536 executable('systemd-initctl',
2537 'src/initctl/initctl.c',
2538 include_directories : includes,
2539 link_with : [libshared],
2540 install_rpath : rootlibexecdir,
2541 install : true,
2542 install_dir : rootlibexecdir)
2543
2544 exe = executable('systemd-mount',
2545 'src/mount/mount-tool.c',
2546 include_directories : includes,
2547 link_with : [libshared],
2548 install_rpath : rootlibexecdir,
2549 install : true)
2550 public_programs += exe
2551
2552 meson.add_install_script(meson_make_symlink,
2553 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2554
2555 exe = executable('systemd-run',
2556 'src/run/run.c',
2557 include_directories : includes,
2558 link_with : [libshared],
2559 install_rpath : rootlibexecdir,
2560 install : true)
2561 public_programs += exe
2562
2563 exe = executable('systemd-stdio-bridge',
2564 'src/stdio-bridge/stdio-bridge.c',
2565 include_directories : includes,
2566 link_with : [libshared],
2567 dependencies : [versiondep],
2568 install_rpath : rootlibexecdir,
2569 install : true)
2570 public_programs += exe
2571
2572 exe = executable('busctl',
2573 'src/busctl/busctl.c',
2574 'src/busctl/busctl-introspect.c',
2575 'src/busctl/busctl-introspect.h',
2576 include_directories : includes,
2577 link_with : [libshared],
2578 install_rpath : rootlibexecdir,
2579 install : true)
2580 public_programs += exe
2581
2582 if conf.get('ENABLE_SYSUSERS') == 1
2583 exe = executable('systemd-sysusers',
2584 'src/sysusers/sysusers.c',
2585 include_directories : includes,
2586 link_with : [libshared],
2587 install_rpath : rootlibexecdir,
2588 install : true,
2589 install_dir : rootbindir)
2590 public_programs += exe
2591 endif
2592
2593 if conf.get('ENABLE_TMPFILES') == 1
2594 exe = executable('systemd-tmpfiles',
2595 'src/tmpfiles/tmpfiles.c',
2596 include_directories : includes,
2597 link_with : [libshared],
2598 dependencies : [libacl],
2599 install_rpath : rootlibexecdir,
2600 install : true,
2601 install_dir : rootbindir)
2602 public_programs += exe
2603
2604 if want_tests != 'false'
2605 test('test-systemd-tmpfiles',
2606 test_systemd_tmpfiles_py,
2607 # https://github.com/mesonbuild/meson/issues/2681
2608 args : exe.full_path())
2609 endif
2610 endif
2611
2612 if conf.get('ENABLE_HWDB') == 1
2613 exe = executable('systemd-hwdb',
2614 'src/hwdb/hwdb.c',
2615 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2616 include_directories : includes,
2617 link_with : [libudev_static],
2618 install_rpath : udev_rpath,
2619 install : true,
2620 install_dir : rootbindir)
2621 public_programs += exe
2622 endif
2623
2624 if conf.get('ENABLE_QUOTACHECK') == 1
2625 executable('systemd-quotacheck',
2626 'src/quotacheck/quotacheck.c',
2627 include_directories : includes,
2628 link_with : [libshared],
2629 install_rpath : rootlibexecdir,
2630 install : true,
2631 install_dir : rootlibexecdir)
2632 endif
2633
2634 exe = executable('systemd-socket-proxyd',
2635 'src/socket-proxy/socket-proxyd.c',
2636 include_directories : includes,
2637 link_with : [libshared],
2638 dependencies : [threads],
2639 install_rpath : rootlibexecdir,
2640 install : true,
2641 install_dir : rootlibexecdir)
2642 public_programs += exe
2643
2644 exe = executable('systemd-udevd',
2645 systemd_udevd_sources,
2646 include_directories : includes,
2647 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2648 link_with : [libudev_core,
2649 libsystemd_network,
2650 libudev_static],
2651 dependencies : [versiondep,
2652 threads,
2653 libkmod,
2654 libidn,
2655 libacl,
2656 libblkid],
2657 install_rpath : udev_rpath,
2658 install : true,
2659 install_dir : rootlibexecdir)
2660 public_programs += exe
2661
2662 exe = executable('udevadm',
2663 udevadm_sources,
2664 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2665 include_directories : includes,
2666 link_with : [libudev_core,
2667 libsystemd_network,
2668 libudev_static],
2669 dependencies : [versiondep,
2670 threads,
2671 libkmod,
2672 libidn,
2673 libacl,
2674 libblkid],
2675 install_rpath : udev_rpath,
2676 install : true,
2677 install_dir : rootbindir)
2678 public_programs += exe
2679
2680 executable('systemd-shutdown',
2681 systemd_shutdown_sources,
2682 include_directories : includes,
2683 link_with : [libcore_shared,
2684 libshared],
2685 dependencies : [libmount],
2686 install_rpath : rootlibexecdir,
2687 install : true,
2688 install_dir : rootlibexecdir)
2689
2690 executable('systemd-update-done',
2691 'src/update-done/update-done.c',
2692 include_directories : includes,
2693 link_with : [libshared],
2694 install_rpath : rootlibexecdir,
2695 install : true,
2696 install_dir : rootlibexecdir)
2697
2698 executable('systemd-update-utmp',
2699 'src/update-utmp/update-utmp.c',
2700 include_directories : includes,
2701 link_with : [libshared],
2702 dependencies : [libaudit],
2703 install_rpath : rootlibexecdir,
2704 install : true,
2705 install_dir : rootlibexecdir)
2706
2707 if conf.get('HAVE_KMOD') == 1
2708 executable('systemd-modules-load',
2709 'src/modules-load/modules-load.c',
2710 include_directories : includes,
2711 link_with : [libshared],
2712 dependencies : [libkmod],
2713 install_rpath : rootlibexecdir,
2714 install : true,
2715 install_dir : rootlibexecdir)
2716
2717 meson.add_install_script('sh', '-c',
2718 mkdir_p.format(modulesloaddir))
2719 meson.add_install_script('sh', '-c',
2720 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2721 endif
2722
2723 exe = executable('systemd-nspawn',
2724 systemd_nspawn_sources,
2725 include_directories : includes,
2726 link_with : [libcore_shared,
2727 libnspawn_core,
2728 libshared],
2729 dependencies : [libblkid],
2730 install_rpath : rootlibexecdir,
2731 install : true)
2732 public_programs += exe
2733
2734 if conf.get('ENABLE_NETWORKD') == 1
2735 executable('systemd-networkd',
2736 systemd_networkd_sources,
2737 include_directories : includes,
2738 link_with : [libnetworkd_core,
2739 libsystemd_network,
2740 libudev_static,
2741 libshared],
2742 dependencies : [threads],
2743 install_rpath : rootlibexecdir,
2744 install : true,
2745 install_dir : rootlibexecdir)
2746
2747 executable('systemd-networkd-wait-online',
2748 systemd_networkd_wait_online_sources,
2749 include_directories : includes,
2750 link_with : [libnetworkd_core,
2751 libshared],
2752 install_rpath : rootlibexecdir,
2753 install : true,
2754 install_dir : rootlibexecdir)
2755
2756 exe = executable('networkctl',
2757 networkctl_sources,
2758 include_directories : includes,
2759 link_with : [libsystemd_network,
2760 libshared],
2761 install_rpath : rootlibexecdir,
2762 install : true,
2763 install_dir : rootbindir)
2764 public_programs += exe
2765 endif
2766
2767 executable('systemd-sulogin-shell',
2768 ['src/sulogin-shell/sulogin-shell.c'],
2769 include_directories : includes,
2770 link_with : [libshared],
2771 install_rpath : rootlibexecdir,
2772 install : true,
2773 install_dir : rootlibexecdir)
2774
2775 ############################################################
2776
2777 custom_target(
2778 'systemd-runtest.env',
2779 output : 'systemd-runtest.env',
2780 command : ['sh', '-c', '{ ' +
2781 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2782 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2783 '} >@OUTPUT@'],
2784 build_by_default : true)
2785
2786 foreach tuple : tests
2787 sources = tuple[0]
2788 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2789 dependencies = tuple[2]
2790 condition = tuple.length() >= 4 ? tuple[3] : ''
2791 type = tuple.length() >= 5 ? tuple[4] : ''
2792 defs = tuple.length() >= 6 ? tuple[5] : []
2793 incs = tuple.length() >= 7 ? tuple[6] : includes
2794 timeout = 30
2795
2796 name = sources[0].split('/')[-1].split('.')[0]
2797 if type.startswith('timeout=')
2798 timeout = type.split('=')[1].to_int()
2799 type = ''
2800 endif
2801
2802 if condition == '' or conf.get(condition) == 1
2803 exe = executable(
2804 name,
2805 sources,
2806 include_directories : incs,
2807 link_with : link_with,
2808 dependencies : [versiondep,
2809 dependencies],
2810 c_args : defs,
2811 build_by_default : want_tests != 'false',
2812 install_rpath : rootlibexecdir,
2813 install : install_tests,
2814 install_dir : join_paths(testsdir, type))
2815
2816 if type == 'manual'
2817 message('@0@ is a manual test'.format(name))
2818 elif type == 'unsafe' and want_tests != 'unsafe'
2819 message('@0@ is an unsafe test'.format(name))
2820 elif want_tests != 'false'
2821 test(name, exe,
2822 env : test_env,
2823 timeout : timeout)
2824 endif
2825 else
2826 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2827 endif
2828 endforeach
2829
2830 exe = executable(
2831 'test-libsystemd-sym',
2832 test_libsystemd_sym_c,
2833 include_directories : includes,
2834 link_with : [libsystemd],
2835 build_by_default : want_tests != 'false',
2836 install : install_tests,
2837 install_dir : testsdir)
2838 if want_tests != 'false'
2839 test('test-libsystemd-sym', exe)
2840 endif
2841
2842 exe = executable(
2843 'test-libsystemd-static-sym',
2844 test_libsystemd_sym_c,
2845 include_directories : includes,
2846 link_with : [install_libsystemd_static],
2847 dependencies : [threads], # threads is already included in dependencies on the library,
2848 # but does not seem to get propagated. Add here as a work-around.
2849 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2850 install : install_tests and static_libsystemd_pic,
2851 install_dir : testsdir)
2852 if want_tests != 'false' and static_libsystemd_pic
2853 test('test-libsystemd-static-sym', exe)
2854 endif
2855
2856 exe = executable(
2857 'test-libudev-sym',
2858 test_libudev_sym_c,
2859 include_directories : includes,
2860 c_args : '-Wno-deprecated-declarations',
2861 link_with : [libudev],
2862 build_by_default : want_tests != 'false',
2863 install : install_tests,
2864 install_dir : testsdir)
2865 if want_tests != 'false'
2866 test('test-libudev-sym', exe)
2867 endif
2868
2869 exe = executable(
2870 'test-libudev-static-sym',
2871 test_libudev_sym_c,
2872 include_directories : includes,
2873 c_args : '-Wno-deprecated-declarations',
2874 link_with : [install_libudev_static],
2875 build_by_default : want_tests != 'false' and static_libudev_pic,
2876 install : install_tests and static_libudev_pic,
2877 install_dir : testsdir)
2878 if want_tests != 'false' and static_libudev_pic
2879 test('test-libudev-static-sym', exe)
2880 endif
2881
2882 ############################################################
2883
2884 fuzzer_exes = []
2885
2886 if get_option('tests') != 'false'
2887 foreach tuple : fuzzers
2888 sources = tuple[0]
2889 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2890 dependencies = tuple[2]
2891 defs = tuple.length() >= 4 ? tuple[3] : []
2892 incs = tuple.length() >= 5 ? tuple[4] : includes
2893
2894 if fuzzer_build
2895 dependencies += fuzzing_engine
2896 else
2897 sources += 'src/fuzz/fuzz-main.c'
2898 endif
2899
2900 name = sources[0].split('/')[-1].split('.')[0]
2901
2902 fuzzer_exes += executable(
2903 name,
2904 sources,
2905 include_directories : [incs, include_directories('src/fuzz')],
2906 link_with : link_with,
2907 dependencies : dependencies,
2908 c_args : defs,
2909 install : false)
2910 endforeach
2911 endif
2912
2913 run_target('fuzzers',
2914 depends : fuzzer_exes,
2915 command : ['true'])
2916
2917 ############################################################
2918
2919 make_directive_index_py = find_program('tools/make-directive-index.py')
2920 make_man_index_py = find_program('tools/make-man-index.py')
2921 xml_helper_py = find_program('tools/xml_helper.py')
2922 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2923
2924 subdir('units')
2925 subdir('sysctl.d')
2926 subdir('sysusers.d')
2927 subdir('tmpfiles.d')
2928 subdir('presets')
2929 subdir('hwdb')
2930 subdir('network')
2931 subdir('man')
2932 subdir('shell-completion/bash')
2933 subdir('shell-completion/zsh')
2934 subdir('docs/sysvinit')
2935 subdir('docs/var-log')
2936
2937 install_subdir('factory/etc',
2938 install_dir : factorydir)
2939
2940 install_data('xorg/50-systemd-user.sh',
2941 install_dir : xinitrcdir)
2942 install_data('modprobe.d/systemd.conf',
2943 install_dir : modprobedir)
2944 install_data('LICENSE.GPL2',
2945 'LICENSE.LGPL2.1',
2946 'NEWS',
2947 'README',
2948 'docs/CODING_STYLE.md',
2949 'docs/DISTRO_PORTING.md',
2950 'docs/ENVIRONMENT.md',
2951 'docs/HACKING.md',
2952 'docs/TRANSIENT-SETTINGS.md',
2953 'docs/TRANSLATORS.md',
2954 'docs/UIDS-GIDS.md',
2955 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2956 install_dir : docdir)
2957
2958 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2959 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2960
2961 ############################################################
2962
2963 meson_check_help = find_program('tools/meson-check-help.sh')
2964
2965 foreach exec : public_programs
2966 name = exec.full_path().split('/')[-1]
2967 if want_tests != 'false'
2968 test('check-help-' + name,
2969 meson_check_help,
2970 args : exec.full_path())
2971 endif
2972 endforeach
2973
2974 ############################################################
2975
2976 # Enable tests for all supported sanitizers
2977 foreach tuple : sanitizers
2978 sanitizer = tuple[0]
2979 build = tuple[1]
2980
2981 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2982 prev = ''
2983 foreach p : fuzz_regression_tests
2984 b = p.split('/')[-2]
2985 c = p.split('/')[-1]
2986
2987 name = '@0@:@1@'.format(b, sanitizer)
2988
2989 if name != prev
2990 if want_tests == 'false'
2991 message('Not compiling @0@ because tests is set to false'.format(name))
2992 elif slow_tests
2993 exe = custom_target(
2994 name,
2995 output : name,
2996 depends : build,
2997 command : [env, 'ln', '-fs',
2998 join_paths(build.full_path(), b),
2999 '@OUTPUT@'],
3000 build_by_default : true)
3001 else
3002 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3003 endif
3004 endif
3005 prev = name
3006
3007 if want_tests != 'false' and slow_tests
3008 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3009 env,
3010 args : [exe.full_path(),
3011 join_paths(meson.source_root(), p)])
3012 endif
3013 endforeach
3014 endif
3015 endforeach
3016
3017
3018 ############################################################
3019
3020 if git.found()
3021 all_files = run_command(
3022 git,
3023 ['--git-dir=@0@/.git'.format(meson.source_root()),
3024 'ls-files',
3025 ':/*.[ch]'])
3026 all_files = files(all_files.stdout().split())
3027
3028 custom_target(
3029 'tags',
3030 output : 'tags',
3031 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3032 run_target(
3033 'ctags',
3034 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3035 endif
3036
3037 if git.found()
3038 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3039 run_target(
3040 'git-contrib',
3041 command : [meson_git_contrib_sh])
3042 endif
3043
3044 if git.found()
3045 git_head = run_command(
3046 git,
3047 ['--git-dir=@0@/.git'.format(meson.source_root()),
3048 'rev-parse', 'HEAD']).stdout().strip()
3049 git_head_short = run_command(
3050 git,
3051 ['--git-dir=@0@/.git'.format(meson.source_root()),
3052 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3053
3054 run_target(
3055 'git-snapshot',
3056 command : ['git', 'archive',
3057 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3058 git_head_short),
3059 '--prefix', 'systemd-@0@/'.format(git_head),
3060 'HEAD'])
3061 endif
3062
3063 ############################################################
3064
3065 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3066 run_target(
3067 'check-api-docs',
3068 depends : [man, libsystemd, libudev],
3069 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3070
3071 ############################################################
3072
3073 status = [
3074 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3075
3076 'split /usr: @0@'.format(split_usr),
3077 'split bin-sbin: @0@'.format(split_bin),
3078 'prefix directory: @0@'.format(prefixdir),
3079 'rootprefix directory: @0@'.format(rootprefixdir),
3080 'sysconf directory: @0@'.format(sysconfdir),
3081 'include directory: @0@'.format(includedir),
3082 'lib directory: @0@'.format(libdir),
3083 'rootlib directory: @0@'.format(rootlibdir),
3084 'SysV init scripts: @0@'.format(sysvinit_path),
3085 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3086 'PAM modules directory: @0@'.format(pamlibdir),
3087 'PAM configuration directory: @0@'.format(pamconfdir),
3088 'RPM macros directory: @0@'.format(rpmmacrosdir),
3089 'modprobe.d directory: @0@'.format(modprobedir),
3090 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3091 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3092 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3093 'bash completions directory: @0@'.format(bashcompletiondir),
3094 'zsh completions directory: @0@'.format(zshcompletiondir),
3095 'extra start script: @0@'.format(get_option('rc-local')),
3096 'extra stop script: @0@'.format(get_option('halt-local')),
3097 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3098 get_option('debug-tty')),
3099 'TTY GID: @0@'.format(tty_gid),
3100 'users GID: @0@'.format(substs.get('USERS_GID')),
3101 'maximum system UID: @0@'.format(system_uid_max),
3102 'maximum system GID: @0@'.format(system_gid_max),
3103 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3104 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3105 'minimum container UID base: @0@'.format(container_uid_base_min),
3106 'maximum container UID base: @0@'.format(container_uid_base_max),
3107 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3108 'render group access mode: @0@'.format(get_option('group-render-mode')),
3109 'certificate root directory: @0@'.format(get_option('certificate-root')),
3110 'support URL: @0@'.format(support_url),
3111 'nobody user name: @0@'.format(nobody_user),
3112 'nobody group name: @0@'.format(nobody_group),
3113 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3114 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3115
3116 'default DNSSEC mode: @0@'.format(default_dnssec),
3117 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3118 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3119 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3120 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3121 'default locale: @0@'.format(default_locale)]
3122
3123 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3124 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3125 status += [
3126 'default DNS servers: @0@'.format(alt_dns_servers),
3127 'default NTP servers: @0@'.format(alt_ntp_servers)]
3128
3129 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3130 '@@0@'.format(time_epoch)).stdout().strip()
3131 status += [
3132 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3133
3134 status += [
3135 'static libsystemd: @0@'.format(static_libsystemd),
3136 'static libudev: @0@'.format(static_libudev)]
3137
3138 # TODO:
3139 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3140 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3141 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3142
3143 if conf.get('ENABLE_EFI') == 1
3144 status += 'efi arch: @0@'.format(efi_arch)
3145
3146 if have_gnu_efi
3147 status += [
3148 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3149 'EFI CC @0@'.format(' '.join(efi_cc)),
3150 'EFI lib directory: @0@'.format(efi_libdir),
3151 'EFI lds directory: @0@'.format(efi_ldsdir),
3152 'EFI include directory: @0@'.format(efi_incdir)]
3153 endif
3154 endif
3155
3156 found = []
3157 missing = []
3158
3159 foreach tuple : [
3160 ['libcryptsetup'],
3161 ['PAM'],
3162 ['AUDIT'],
3163 ['IMA'],
3164 ['AppArmor'],
3165 ['SELinux'],
3166 ['SECCOMP'],
3167 ['SMACK'],
3168 ['zlib'],
3169 ['xz'],
3170 ['lz4'],
3171 ['bzip2'],
3172 ['ACL'],
3173 ['gcrypt'],
3174 ['qrencode'],
3175 ['microhttpd'],
3176 ['gnutls'],
3177 ['openssl'],
3178 ['libcurl'],
3179 ['idn'],
3180 ['libidn2'],
3181 ['libidn'],
3182 ['libiptc'],
3183 ['elfutils'],
3184 ['binfmt'],
3185 ['vconsole'],
3186 ['quotacheck'],
3187 ['tmpfiles'],
3188 ['environment.d'],
3189 ['sysusers'],
3190 ['firstboot'],
3191 ['randomseed'],
3192 ['backlight'],
3193 ['rfkill'],
3194 ['logind'],
3195 ['machined'],
3196 ['portabled'],
3197 ['importd'],
3198 ['hostnamed'],
3199 ['timedated'],
3200 ['timesyncd'],
3201 ['localed'],
3202 ['networkd'],
3203 ['resolve'],
3204 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3205 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3206 ['coredump'],
3207 ['polkit'],
3208 ['legacy pkla', install_polkit_pkla],
3209 ['efi'],
3210 ['gnu-efi', have_gnu_efi],
3211 ['kmod'],
3212 ['xkbcommon'],
3213 ['pcre2'],
3214 ['blkid'],
3215 ['dbus'],
3216 ['glib'],
3217 ['nss-myhostname'],
3218 ['nss-mymachines'],
3219 ['nss-resolve'],
3220 ['nss-systemd'],
3221 ['hwdb'],
3222 ['tpm'],
3223 ['man pages', want_man],
3224 ['html pages', want_html],
3225 ['man page indices', want_man and have_lxml],
3226 ['SysV compat'],
3227 ['utmp'],
3228 ['ldconfig'],
3229 ['hibernate'],
3230 ['adm group', get_option('adm-group')],
3231 ['wheel group', get_option('wheel-group')],
3232 ['gshadow'],
3233 ['debug hashmap'],
3234 ['debug mmap cache'],
3235 ['debug siphash'],
3236 ['debug udev'],
3237 ['valgrind', conf.get('VALGRIND') == 1],
3238 ['trace logging', conf.get('LOG_TRACE') == 1],
3239 ['link-udev-shared', get_option('link-udev-shared')],
3240 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3241 ]
3242
3243 if tuple.length() >= 2
3244 cond = tuple[1]
3245 else
3246 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3247 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3248 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3249 endif
3250 if cond
3251 found += tuple[0]
3252 else
3253 missing += tuple[0]
3254 endif
3255 endforeach
3256
3257 status += [
3258 '',
3259 'enabled features: @0@'.format(', '.join(found)),
3260 '',
3261 'disabled features: @0@'.format(', '.join(missing)),
3262 '']
3263 message('\n '.join(status))
3264
3265 if rootprefixdir != rootprefix_default
3266 warning('\n' +
3267 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3268 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3269 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3270 endif