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