From f866c69e9b9855d8067d4a1e8c61ba779724d46e Mon Sep 17 00:00:00 2001 From: Julius Bairaktaris Date: Wed, 23 Sep 2026 19:02:09 +0200 Subject: [PATCH] toolchain: gcc: replace revision in version with toolchain hash The GCC version string carries $(REVISION), so it changes on every commit even when nothing under toolchain/ does. The string ends up in the .comment section of every object and in the kernel's CONFIG_CC_VERSION_TEXT, so packages differ between revisions built with the same compiler, and no ccache entry for target code survives a pull. Dropping the revision was reverted in b5ed5604cf because ccache would then keep objects from a GCC built without a newly added patch. A hash over the names and contents of all files under toolchain/ changes with any GCC, binutils or libc patch or Makefile, and does not depend on a git checkout. The toolchain Makefile computes it once per make call, on first use, and passes it to the GCC builds. The buildbot check that wipes the toolchain compares the same hash instead of the last commit under toolchain/, so the toolchain is rebuilt exactly when the version string changes, and the check no longer needs a git checkout. Link: https://github.com/openwrt/openwrt/pull/24364 Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Julius Bairaktaris Link: https://github.com/openwrt/openwrt/pull/25362 Signed-off-by: Nick Hainke --- toolchain/Makefile | 11 ++++++++--- toolchain/gcc/common.mk | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/toolchain/Makefile b/toolchain/Makefile index 67b1540117c..0893c2c523b 100644 --- a/toolchain/Makefile +++ b/toolchain/Makefile @@ -30,7 +30,14 @@ curdir:=toolchain $(curdir)/builddirs := $(if $(CONFIG_GDB),gdb) $(if $(CONFIG_EXTERNAL_TOOLCHAIN),wrapper,kernel-headers binutils gcc/initial gcc/final $(LIBC) fortify-headers) $(if $(CONFIG_NASM),nasm) $(if $(CONFIG_USE_MOLD),mold) # builddir dependencies +# GCC version string and buildbot rebuild check, computed on first use. +toolchain_hash=$(eval toolchain_hash:=$(shell find toolchain -type f ! -path '*/.*' \ + ! -name '*.orig' ! -name '*.rej' ! -name '*~' -exec $(MKHASH) -n md5 {} + | \ + LC_ALL=C sort | $(MKHASH) md5 | cut -c1-10))$(toolchain_hash) + ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) + $(curdir)/gcc/%: export TOOLCHAIN_HASH=$(toolchain_hash) + ifdef CONFIG_USE_MUSL $(curdir)/gcc/initial/compile:=$(curdir)/binutils/compile $(curdir)/kernel-headers/compile:=$(curdir)/gcc/initial/compile @@ -63,9 +70,8 @@ endif endif ifdef CONFIG_BUILDBOT -ifneq ($(wildcard $(TOPDIR)/.git),) $(TOOLCHAIN_DIR)/stamp/.ver_check: $(TMP_DIR)/.build - cd "$(TOPDIR)"; git log --no-show-signature --format=%h -1 toolchain > $(TMP_DIR)/.ver_check + echo $(toolchain_hash) > $(TMP_DIR)/.ver_check cmp -s $(TMP_DIR)/.ver_check $@ || { \ rm -rf $(BUILD_DIR) $(STAGING_DIR) $(TOOLCHAIN_DIR) $(BUILD_DIR_TOOLCHAIN); \ mkdir -p $(TOOLCHAIN_DIR)/stamp; \ @@ -74,7 +80,6 @@ ifneq ($(wildcard $(TOPDIR)/.git),) $(TOOLCHAIN_DIR)/info.mk $(STAGING_DIR)/.prepared: $(TOOLCHAIN_DIR)/stamp/.ver_check endif -endif # prerequisites for the individual targets $(curdir)/ := .config prereq diff --git a/toolchain/gcc/common.mk b/toolchain/gcc/common.mk index 1d29e93d6e2..59c6fb66535 100644 --- a/toolchain/gcc/common.mk +++ b/toolchain/gcc/common.mk @@ -45,7 +45,7 @@ endif PATCH_DIR=../patches-$(GCC_MAJOR_VERSION).x BUGURL=http://bugs.openwrt.org/ -PKGVERSION=OpenWrt GCC $(PKG_VERSION) $(REVISION) +PKGVERSION=OpenWrt GCC $(PKG_VERSION) toolchain-$(TOOLCHAIN_HASH) HOST_BUILD_PARALLEL:=1