From: Thomas Weißschuh thomas.weissschuh@linutronix.de
[ Upstream commit a40f0cdce78be8a559ee8a85c908049c65a410b2 ]
The heuristic to derive a clang target triple from a GCC one does not work for s390. GCC uses "s390-linux" while clang expects "s390x-linux" or "powerz-linux".
Add an explicit override.
Signed-off-by: Thomas Weißschuh thomas.weissschuh@linutronix.de Link: https://lore.kernel.org/r/20250620-tools-cross-s390-v2-1-ecda886e00e5@linutr... Signed-off-by: Thomas Weißschuh linux@weissschuh.net Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
Now let me understand better what the issue is. Based on my analysis:
**Backport Status: YES**
This commit fixes a critical cross-compilation issue where the heuristic to derive a clang target triple from a GCC one fails for s390 architecture. Here's my detailed analysis:
## Analysis of Code Changes:
The patch modifies `tools/scripts/Makefile.include` by adding two lines after line 104: ```makefile CLANG_CROSS_FLAGS := --target=$(notdir $(CROSS_COMPILE:%-=%)) +CLANG_TARGET := $(notdir $(CROSS_COMPILE:%-=%)) +CLANG_TARGET := $(subst s390-linux,s390x-linux,$(CLANG_TARGET)) +CLANG_CROSS_FLAGS := --target=$(CLANG_TARGET) ```
## Key Findings:
1. **Bug Type**: This fixes a build failure when cross-compiling kernel tools for s390 architecture using clang.
2. **Root Cause**: GCC uses "s390-linux" as the target triple while clang expects "s390x-linux" or "systemz-linux". The existing heuristic that derives the clang target from the GCC cross-compiler prefix fails for s390.
3. **Similar Fixes Already Present**: I found that other parts of the kernel already handle this incompatibility: - `tools/testing/selftests/nolibc/Makefile:` converts s390-linux to systemz-linux - `tools/include/nolibc/Makefile:` converts s390-linux to systemz- linux - `scripts/Makefile.clang:` directly uses s390x-linux-gnu
4. **Impact**: Without this fix, cross-compilation of kernel tools for s390 using clang will fail, affecting: - Developers building tools for s390 systems - CI/CD pipelines that cross-compile for multiple architectures - Distribution builders who need to build kernel tools
5. **Risk Assessment**: - The change is minimal and isolated to the build system - It only affects the clang target selection logic - No runtime behavior changes - Similar transformations are already proven in other makefiles
6. **Stable Tree Criteria**: - ✓ Fixes a real bug that affects users (build failure) - ✓ Small and contained fix (2 lines) - ✓ No side effects beyond fixing the issue - ✓ No architectural changes - ✓ Only touches build infrastructure - ✓ Minimal risk of regression
This is a clear candidate for stable backporting as it fixes a concrete build failure with minimal risk.
tools/scripts/Makefile.include | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include index 5158250988ce..ded48263dd5e 100644 --- a/tools/scripts/Makefile.include +++ b/tools/scripts/Makefile.include @@ -101,7 +101,9 @@ else ifneq ($(CROSS_COMPILE),) # Allow userspace to override CLANG_CROSS_FLAGS to specify their own # sysroots and flags or to avoid the GCC call in pure Clang builds. ifeq ($(CLANG_CROSS_FLAGS),) -CLANG_CROSS_FLAGS := --target=$(notdir $(CROSS_COMPILE:%-=%)) +CLANG_TARGET := $(notdir $(CROSS_COMPILE:%-=%)) +CLANG_TARGET := $(subst s390-linux,s390x-linux,$(CLANG_TARGET)) +CLANG_CROSS_FLAGS := --target=$(CLANG_TARGET) GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)gcc 2>/dev/null)) ifneq ($(GCC_TOOLCHAIN_DIR),) CLANG_CROSS_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE))