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