mirror of
https://github.com/openwrt/openwrt.git
synced 2024-11-27 20:04:24 +08:00
53a08e3743
While experimenting with the AUTOREMOVE option in search of a way to use prebuilt host tools in different buildroot, it was discovered that the md5 generated by find_md5 in depends.mk is not reproducible. Currently the hash is generated by the path of the file in addition to the file mod time. Out of confusion, probably, there was an idea that such command was used on the package build_dir. Reality is that this command is run on the package files. (Makefile, patches, src) This is problematic because the package Makefile (for example) change at each git clone and base the hash on the Makefile mtime doesn't really reflect if the Makefile actually changes across a buildroot or not. A better approach is to generate an hash of each file and then generate an hash on the sort hash list. This way we remove the problem of git clone setting a wrong mtime while keeping the integrity of checking if a file changed for the package as any change will result in a different hash. Introduce a new kind of find_md5 function, find_md5_reproducible that apply this new logic and limit it only with AUTOREMOVE option set to prevent any kind of slowdown due to additional hash generation. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
184 lines
5.8 KiB
Makefile
184 lines
5.8 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
# Copyright (C) 2006-2020 OpenWrt.org
|
|
|
|
include $(INCLUDE_DIR)/prereq.mk
|
|
include $(INCLUDE_DIR)/depends.mk
|
|
|
|
ifneq ($(DUMP),1)
|
|
all: compile
|
|
endif
|
|
|
|
KERNEL_FILE_DEPENDS=$(GENERIC_BACKPORT_DIR) $(GENERIC_PATCH_DIR) $(GENERIC_HACK_DIR) $(PATCH_DIR) $(GENERIC_FILES_DIR) $(FILES_DIR)
|
|
STAMP_PREPARED=$(LINUX_DIR)/.prepared$(if $(QUILT)$(DUMP),,_$(shell $(call $(if $(CONFIG_AUTOREMOVE),find_md5_reproducible,find_md5),$(KERNEL_FILE_DEPENDS),)))
|
|
STAMP_CONFIGURED:=$(LINUX_DIR)/.configured
|
|
include $(INCLUDE_DIR)/download.mk
|
|
include $(INCLUDE_DIR)/quilt.mk
|
|
include $(INCLUDE_DIR)/kernel-defaults.mk
|
|
|
|
define Kernel/Prepare
|
|
$(call Kernel/Prepare/Default)
|
|
endef
|
|
|
|
define Kernel/Configure
|
|
$(call Kernel/Configure/Default)
|
|
endef
|
|
|
|
define Kernel/CompileModules
|
|
$(call Kernel/CompileModules/Default)
|
|
endef
|
|
|
|
define Kernel/CompileImage
|
|
$(call Kernel/CompileImage/Default)
|
|
$(call Kernel/CompileImage/Initramfs)
|
|
endef
|
|
|
|
define Kernel/Clean
|
|
$(call Kernel/Clean/Default)
|
|
endef
|
|
|
|
define Download/kernel
|
|
URL:=$(LINUX_SITE)
|
|
FILE:=$(LINUX_SOURCE)
|
|
HASH:=$(LINUX_KERNEL_HASH)
|
|
endef
|
|
|
|
KERNEL_GIT_OPTS:=
|
|
ifneq ($(strip $(CONFIG_KERNEL_GIT_LOCAL_REPOSITORY)),"")
|
|
KERNEL_GIT_OPTS+=--reference $(CONFIG_KERNEL_GIT_LOCAL_REPOSITORY)
|
|
endif
|
|
|
|
define Download/git-kernel
|
|
URL:=$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI))
|
|
PROTO:=git
|
|
VERSION:=$(CONFIG_KERNEL_GIT_REF)
|
|
FILE:=$(LINUX_SOURCE)
|
|
SUBDIR:=linux-$(LINUX_VERSION)
|
|
OPTS:=$(KERNEL_GIT_OPTS)
|
|
endef
|
|
|
|
ifdef CONFIG_COLLECT_KERNEL_DEBUG
|
|
define Kernel/CollectDebug
|
|
rm -rf $(KERNEL_BUILD_DIR)/debug
|
|
mkdir -p $(KERNEL_BUILD_DIR)/debug/modules
|
|
$(CP) $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/debug/
|
|
-$(CP) \
|
|
$(STAGING_DIR_ROOT)/lib/modules/$(LINUX_VERSION)/* \
|
|
$(KERNEL_BUILD_DIR)/debug/modules/
|
|
$(FIND) $(KERNEL_BUILD_DIR)/debug -type f | $(XARGS) $(KERNEL_CROSS)strip --only-keep-debug
|
|
$(TAR) c -C $(KERNEL_BUILD_DIR) debug \
|
|
$(if $(SOURCE_DATE_EPOCH),--mtime="@$(SOURCE_DATE_EPOCH)") \
|
|
| zstd -T0 -f -o $(BIN_DIR)/kernel-debug.tar.zst
|
|
endef
|
|
endif
|
|
|
|
ifeq ($(DUMP)$(filter prereq clean refresh update,$(MAKECMDGOALS)),)
|
|
ifneq ($(if $(QUILT),,$(CONFIG_AUTOREBUILD)),)
|
|
define Kernel/Autoclean
|
|
$(PKG_BUILD_DIR)/.dep_files: $(STAMP_PREPARED)
|
|
$(call rdep,$(KERNEL_FILE_DEPENDS),$(STAMP_PREPARED),$(PKG_BUILD_DIR)/.dep_files,-x "*/.dep_*")
|
|
endef
|
|
endif
|
|
endif
|
|
|
|
define BuildKernel
|
|
$(if $(QUILT),$(Build/Quilt))
|
|
$(if $(LINUX_SITE),$(call Download,kernel))
|
|
$(if $(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),$(call Download,git-kernel))
|
|
|
|
.NOTPARALLEL:
|
|
|
|
$(Kernel/Autoclean)
|
|
$(STAMP_PREPARED): $(if $(LINUX_SITE),$(DL_DIR)/$(LINUX_SOURCE))
|
|
-rm -rf $(KERNEL_BUILD_DIR)
|
|
-mkdir -p $(KERNEL_BUILD_DIR)
|
|
$(Kernel/Prepare)
|
|
touch $$@
|
|
|
|
$(KERNEL_BUILD_DIR)/symtab.h: FORCE
|
|
rm -f $(KERNEL_BUILD_DIR)/symtab.h
|
|
touch $(KERNEL_BUILD_DIR)/symtab.h
|
|
+$(KERNEL_MAKE) vmlinux
|
|
find $(LINUX_DIR) $(STAGING_DIR_ROOT)/lib/modules -name \*.ko | \
|
|
xargs $(TARGET_CROSS)nm | \
|
|
awk '$$$$1 == "U" { print $$$$2 } ' | \
|
|
sort -u > $(KERNEL_BUILD_DIR)/mod_symtab.txt
|
|
$(TARGET_CROSS)nm -n $(LINUX_DIR)/vmlinux.o | awk '/^[0-9a-f]+ [rR] __ksymtab_/ {print substr($$$$3,11)}' > $(KERNEL_BUILD_DIR)/kernel_symtab.txt
|
|
grep -Ff $(KERNEL_BUILD_DIR)/mod_symtab.txt $(KERNEL_BUILD_DIR)/kernel_symtab.txt > $(KERNEL_BUILD_DIR)/sym_include.txt
|
|
grep -Fvf $(KERNEL_BUILD_DIR)/mod_symtab.txt $(KERNEL_BUILD_DIR)/kernel_symtab.txt > $(KERNEL_BUILD_DIR)/sym_exclude.txt
|
|
( \
|
|
echo '#define SYMTAB_KEEP \'; \
|
|
cat $(KERNEL_BUILD_DIR)/sym_include.txt | \
|
|
awk '{print "KEEP(*(___ksymtab+" $$$$1 ")) \\" }'; \
|
|
echo; \
|
|
echo '#define SYMTAB_KEEP_GPL \'; \
|
|
cat $(KERNEL_BUILD_DIR)/sym_include.txt | \
|
|
awk '{print "KEEP(*(___ksymtab_gpl+" $$$$1 ")) \\" }'; \
|
|
echo; \
|
|
echo '#define SYMTAB_DISCARD \'; \
|
|
cat $(KERNEL_BUILD_DIR)/sym_exclude.txt | \
|
|
awk '{print "*(___ksymtab+" $$$$1 ") \\" }'; \
|
|
echo; \
|
|
echo '#define SYMTAB_DISCARD_GPL \'; \
|
|
cat $(KERNEL_BUILD_DIR)/sym_exclude.txt | \
|
|
awk '{print "*(___ksymtab_gpl+" $$$$1 ") \\" }'; \
|
|
echo; \
|
|
) > $$@
|
|
|
|
$(STAMP_CONFIGURED): $(STAMP_PREPARED) $(LINUX_KCONFIG_LIST) $(TOPDIR)/.config FORCE
|
|
$(Kernel/Configure)
|
|
touch $$@
|
|
|
|
$(LINUX_DIR)/.modules: export STAGING_PREFIX=$$(STAGING_DIR_HOST)
|
|
$(LINUX_DIR)/.modules: export PKG_CONFIG_PATH=$$(STAGING_DIR_HOST)/lib/pkgconfig
|
|
$(LINUX_DIR)/.modules: export PKG_CONFIG_LIBDIR=$$(STAGING_DIR_HOST)/lib/pkgconfig
|
|
$(LINUX_DIR)/.modules: export FAIL_ON_UNCONFIGURED=1
|
|
$(LINUX_DIR)/.modules: $(STAMP_CONFIGURED) $(LINUX_DIR)/.config FORCE
|
|
$(Kernel/CompileModules)
|
|
touch $$@
|
|
|
|
$(LINUX_DIR)/.image: export STAGING_PREFIX=$$(STAGING_DIR_HOST)
|
|
$(LINUX_DIR)/.image: export PKG_CONFIG_PATH=$$(STAGING_DIR_HOST)/lib/pkgconfig
|
|
$(LINUX_DIR)/.image: export PKG_CONFIG_LIBDIR=$$(STAGING_DIR_HOST)/lib/pkgconfig
|
|
$(LINUX_DIR)/.image: $(STAMP_CONFIGURED) $(if $(CONFIG_STRIP_KERNEL_EXPORTS),$(KERNEL_BUILD_DIR)/symtab.h) FORCE
|
|
$(Kernel/CompileImage)
|
|
$(Kernel/CollectDebug)
|
|
touch $$@
|
|
|
|
mostlyclean: FORCE
|
|
$(Kernel/Clean)
|
|
|
|
define BuildKernel
|
|
endef
|
|
|
|
download: $(if $(LINUX_SITE),$(DL_DIR)/$(LINUX_SOURCE))
|
|
prepare: $(STAMP_PREPARED)
|
|
compile: $(LINUX_DIR)/.modules
|
|
$(MAKE) -C image compile TARGET_BUILD=
|
|
|
|
oldconfig menuconfig nconfig xconfig: $(STAMP_PREPARED) $(STAMP_CHECKED) FORCE
|
|
rm -f $(LINUX_DIR)/.config.prev
|
|
rm -f $(STAMP_CONFIGURED)
|
|
$(LINUX_RECONF_CMD) > $(LINUX_DIR)/.config
|
|
$(_SINGLE)$(KERNEL_MAKE) \
|
|
$(if $(findstring Darwin,$(HOST_OS)), \
|
|
HOSTLDLIBS_mconf="-L$(STAGING_DIR_HOST)/lib -lncurses" \
|
|
filechk_conf_cfg=" :" \
|
|
) \
|
|
YACC=$(STAGING_DIR_HOST)/bin/bison \
|
|
$$@
|
|
$(call LINUX_RECONF_DIFF,$(LINUX_DIR)/.config) > $(LINUX_RECONFIG_TARGET)
|
|
|
|
install: $(LINUX_DIR)/.image
|
|
+$(MAKE) -C image compile install TARGET_BUILD=
|
|
|
|
clean: FORCE
|
|
rm -rf $(KERNEL_BUILD_DIR)
|
|
|
|
image-prereq:
|
|
@+$(NO_TRACE_MAKE) -s -C image prereq TARGET_BUILD=
|
|
|
|
prereq: image-prereq
|
|
|
|
endef
|