summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-01-03 18:38:23 +0100
committerLuca Boccassi <luca.boccassi@gmail.com>2022-01-04 00:18:47 +0000
commite897b07f97cf25e092a4cc8e1144e06564b45d53 (patch)
tree82ecfe1aabe5d81e519ae93b1f4f02ca9e4aa106
parentc9b1efdf146bef4e1aace1f3ff9076583e8fa709 (diff)
downloadsystemd-e897b07f97cf25e092a4cc8e1144e06564b45d53.tar.gz
meson: generate better arch defines for clang bpf compilation
The code assume that meson's cpu_family can be mapped directly to '-D__<cpu_family>__'. This works in a surprising number of cases, but not for a few architectures. PPC uses "powerpc", and RISC-V omits the trailing underscores. ARM and RISC-V require a second define too. Fixes #21900. (I don't think this matters too much: we need *something* so that gnu/stubs.h can be successfully included. But we don't actually call syscalls or depend too much on the host environment, so things should be fine as long as we don't get a compilation error.)
-rw-r--r--src/core/bpf/meson.build22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/core/bpf/meson.build b/src/core/bpf/meson.build
index cd0cd3230b..c2465a845f 100644
--- a/src/core/bpf/meson.build
+++ b/src/core/bpf/meson.build
@@ -13,7 +13,25 @@ clang_flags = [
'-c',
]
-clang_arch_flag = '-D__@0@__'.format(host_machine.cpu_family())
+# Generate defines that are appropriate to tell the compiler what architecture
+# we're compiling for. By default we just map meson's cpu_family to __<cpu_family>__.
+# This dictionary contains the exceptions where this doesn't work.
+#
+# C.f. https://mesonbuild.com/Reference-tables.html#cpu-families
+# and src/basic/missing_syscall_def.h.
+cpu_arch_defines = {
+ 'ppc' : ['-D__powerpc__'],
+ 'ppc64' : ['-D__powerpc64__', '-D_CALL_ELF=2'],
+ 'riscv32' : ['-D__riscv', '-D__riscv_xlen=32'],
+ 'riscv64' : ['-D__riscv', '-D__riscv_xlen=64'],
+ 'x86' : ['-D__i386__'],
+
+ # For arm, assume hardware fp is available.
+ 'arm' : ['-D__arm__', '-D__ARM_PCS_VFP'],
+}
+
+clang_arch_flags = cpu_arch_defines.get(host_machine.cpu_family(),
+ ['-D__@0@__'.format(host_machine.cpu_family())])
if meson.version().version_compare('>= 0.58')
libbpf_include_dir = libbpf.get_variable('includedir')
@@ -24,7 +42,7 @@ endif
bpf_o_unstripped_cmd = [
clang,
clang_flags,
- clang_arch_flag,
+ clang_arch_flags,
'-I.'
]