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