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