Sometimes firmware files can be links. When rebuilding barebox correctly rebuilds the firmware when file the link points to is updated, but the firmware is not rebuilt when the link itself is changed to link to another file.
Fix this by including the sha256sum directly in the generated assembly file by using .byte rather than generating a file containing the binary sha256sum and include that using .incbin. This way the generated assembly file for sure changes when the firmware file changes and it's rebuilt when necessary (and not when it's not). Reproducer: export ARCH=arm make imx_v8_defconfig echo foo > firmware/foo echo bar > firmware/bar ln -sf foo firmware/imx8mm-bl31.bin make The following should rebuild the barebox image including the updated firmware, but doesn't: ln -sf bar firmware/imx8mm-bl31.bin make Reviewed-by: Ahmad Fatoum <[email protected]> Link: https://lore.barebox.org/[email protected] Signed-off-by: Sascha Hauer <[email protected]> --- Changes from v1: - Check for sha256 sum being the correct length firmware/Makefile | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/firmware/Makefile b/firmware/Makefile index 0c9da2996f..5154e6491b 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -57,6 +57,8 @@ FWSTR = $(subst /,_,$(subst .,_,$(subst -,_,$(FWNAME)))) FWNAME_EXISTS = $(if $(wildcard $(FIRMWARE_DIR)/$(FWNAME)),1,0) filechk_fwbin = { \ + SHA=$$(sha256sum $(FIRMWARE_DIR)/$(FWNAME) | sed 's/ .*$$//;s/../0x&, /g;s/, $$//') ;\ + \ echo "/* Generated by $(src)/Makefile */" ;\ echo "\#include <asm-generic/pointer.h>" ;\ echo ".section .note.GNU-stack,\"\",%progbits" ;\ @@ -80,29 +82,24 @@ filechk_fwbin = { \ echo " .p2align ASM_LGPTR" ;\ echo ".global _fw_$(FWSTR)_sha_start" ;\ echo "_fw_$(FWSTR)_sha_start:" ;\ - echo " .incbin \"$(fwobjdir)/$(FWNAME).sha.bin\"" ;\ + echo " .byte $${SHA}" ;\ echo ".global _fw_$(FWSTR)_sha_end" ;\ echo "_fw_$(FWSTR)_sha_end:" ;\ + echo ".if _fw_$(FWSTR)_sha_start + 32 - _fw_$(FWSTR)_sha_end";\ + echo ".error \"sha256sum invalid\"" ;\ + echo ".endif" ;\ } filechk_fwbin_ext = { \ $(filechk_fwbin) ;\ } -$(obj)/%.gen.S: $(obj)/%.sha.bin FORCE +$(obj)/%.gen.S: FORCE $(call filechk,fwbin,.rodata.$(FWSTR),) -$(obj)/%.extgen.S: $(obj)/%.sha.bin FORCE +$(obj)/%.extgen.S: FORCE $(call filechk,fwbin_ext,.pblext.$(FWSTR),a) -$(obj)/%.sha.bin: $(obj)/%.sum FORCE - $(call if_changed,sha256bin) - -$(obj)/%.sum: FORCE - $(if $(wildcard $(FIRMWARE_DIR)/$*), $(call if_changed,sha256sum,$(FIRMWARE_DIR)/$*), @touch $@) - -clean-files += *.sha.bin *.sum - # This dependency is used if missing firmware should fail the build immediately fwdep-required-y = $(FIRMWARE_DIR)/% # This dependency expands to nothing if the file doesn't exist. This allows -- 2.47.3
