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 <julius@bairaktaris.de>
Link: https://github.com/openwrt/openwrt/pull/25362
Signed-off-by: Nick Hainke <vincent@systemli.org>
This commit is contained in:
Julius Bairaktaris authored and Nick Hainke committed 2026-10-11 20:10:55 +02:00
1 parent f2ec42706e
commit f866c69e9b
2 files changed
+9 -4

No files matched your search

+8 -3
View File
@@ -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
+1 -1
View File
@@ -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