mirror of
https://github.com/openwrt/openwrt.git
synced 2026-10-12 04:47:17 +04:00
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>
98 lines
3.4 KiB
Makefile
98 lines
3.4 KiB
Makefile
#
|
|
# Copyright (C) 2007-2009 OpenWrt.org
|
|
#
|
|
# This is free software, licensed under the GNU General Public License v2.
|
|
# See /LICENSE for more information.
|
|
#
|
|
# Main makefile for the toolchain
|
|
#
|
|
# Steps:
|
|
# 1) toolchain/binutils/compile
|
|
# build & install binutils
|
|
# 2) toolchain/gcc/minimal/compile
|
|
# build & install a minimal gcc, needed for steps 3 & 4
|
|
# 3) toolchain/kernel-headers/compile
|
|
# install kernel headers, needed for step 4
|
|
# 4) toolchain/libc/headers/compile
|
|
# build & install libc headers & support files, needed for step 5
|
|
# 5) toolchain/gcc/initial/compile
|
|
# build & install an initial gcc, needed for step 6
|
|
# 6) toolchain/libc/compile
|
|
# build & install the final libc
|
|
# 7) toolchain/gcc/final/compile
|
|
# build & install the final gcc
|
|
#
|
|
# For musl, steps 2 and 4 are skipped, and step 3 is done after 5
|
|
|
|
curdir:=toolchain
|
|
|
|
# subdirectories to descend into
|
|
$(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
|
|
else
|
|
$(curdir)/builddirs += $(LIBC)/headers gcc/minimal
|
|
$(curdir)/gcc/minimal/compile:=$(curdir)/binutils/compile
|
|
$(curdir)/kernel-headers/compile:=$(curdir)/gcc/minimal/compile
|
|
$(curdir)/$(LIBC)/headers/compile:=$(curdir)/kernel-headers/compile
|
|
$(curdir)/gcc/initial/compile:=$(curdir)/$(LIBC)/headers/compile
|
|
endif
|
|
|
|
$(curdir)/$(LIBC)/compile:=$(curdir)/gcc/initial/compile $(curdir)/kernel-headers/compile
|
|
$(curdir)/gcc/final/compile:=$(curdir)/$(LIBC)/compile
|
|
endif
|
|
|
|
ifndef DUMP_TARGET_DB
|
|
ifneq ($(ARCH),)
|
|
$(TOOLCHAIN_DIR)/info.mk: .config
|
|
@for dir in $(TOOLCHAIN_DIR); do ( \
|
|
$(if $(QUIET),,set -x;) \
|
|
mkdir -p "$$dir"; \
|
|
cd "$$dir"; \
|
|
ln -nsf lib lib64; \
|
|
ln -nsf lib lib32; \
|
|
mkdir -p stamp lib usr/include usr/lib ; \
|
|
); done
|
|
@grep GCC_VERSION $@ >/dev/null 2>&1 || $(INSTALL_DATA) $(TOPDIR)/toolchain/info.mk $@
|
|
@touch $@
|
|
endif
|
|
endif
|
|
|
|
ifdef CONFIG_BUILDBOT
|
|
$(TOOLCHAIN_DIR)/stamp/.ver_check: $(TMP_DIR)/.build
|
|
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; \
|
|
mv $(TMP_DIR)/.ver_check $@; \
|
|
}
|
|
|
|
$(TOOLCHAIN_DIR)/info.mk $(STAGING_DIR)/.prepared: $(TOOLCHAIN_DIR)/stamp/.ver_check
|
|
endif
|
|
|
|
# prerequisites for the individual targets
|
|
$(curdir)/ := .config prereq
|
|
$(curdir)//compile = $(STAGING_DIR)/.prepared $(TOOLCHAIN_DIR)/info.mk $(tools/stamp-compile)
|
|
|
|
ifndef DUMP_TARGET_DB
|
|
$(TOOLCHAIN_DIR)/stamp/.gcc_final_installed:
|
|
endif
|
|
|
|
$(curdir)/install: $(curdir)/compile
|
|
|
|
$(eval $(call stampfile,$(curdir),toolchain,compile,$(TOOLCHAIN_DIR)/stamp/.gcc_final_installed,,$(TOOLCHAIN_DIR)))
|
|
$(eval $(call stampfile,$(curdir),toolchain,check,$(TMP_DIR)/.build))
|
|
$(eval $(call subdir,$(curdir)))
|
|
|