From 6d819fae5343dc4666762f359bb57a6fbe60a968 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Tue, 10 Sep 2019 02:19:05 +0000 Subject: [PATCH] gemini: image: fix race condition when building copy-kernel.bin Make treat copy-kernel.o as intermediate and delete it when it's no longer needed. This can fail when the same submake was triggered multiple times for different devices. arm-openwrt-linux-muslgnueabi-as -k -o copy-kernel.o copy-kernel.S export MAKEFLAGS= ;make -w -C copy-kernel CROSS_COMPILE=arm-openwrt-linux-muslgnueabi- arm-openwrt-linux-muslgnueabi-objcopy -O binary -S copy-kernel.o copy-kernel.bin make[5]: Entering directory '/builder/shared-workdir/build/target/linux/gemini/image/copy-kernel' arm-openwrt-linux-muslgnueabi-objcopy -O binary -S copy-kernel.o copy-kernel.bin rm copy-kernel.o make[5]: Leaving directory '/builder/shared-workdir/build/target/linux/gemini/image/copy-kernel' # "App" partition is the rootfs arm-openwrt-linux-muslgnueabi-objcopy: 'copy-kernel.o': No such file Makefile:27: recipe for target 'copy-kernel.bin' failed make[5]: Leaving directory '/builder/shared-workdir/build/target/linux/gemini/image/copy-kernel' make[5]: *** [copy-kernel.bin] Error 1 Makefile:244: recipe for target '/builder/shared-workdir/build/build_dir/target-arm_fa526_musl_eabi/linux-gemini/tmp/openwrt-gemini-storlink_sl93512r-ext4-factory.bin' failed make[4]: *** [/builder/shared-workdir/build/build_dir/target-arm_fa526_musl_eabi/linux-gemini/tmp/openwrt-gemini-storlink_sl93512r-ext4-factory.bin] Error 2 With this change, output files are directed to $(KDIR) Signed-off-by: Yousong Zhou Reviewed-by: Linus Walleij --- target/linux/gemini/image/Makefile | 9 +++++---- target/linux/gemini/image/copy-kernel/Makefile | 14 ++++++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/target/linux/gemini/image/Makefile b/target/linux/gemini/image/Makefile index 24402f6a9b..b4daa92670 100644 --- a/target/linux/gemini/image/Makefile +++ b/target/linux/gemini/image/Makefile @@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/image.mk -define Build/copy-kernel - $(MAKE) -C copy-kernel CROSS_COMPILE=$(TARGET_CROSS) +define Build/copy-kernel.bin + $(call locked,$(MAKE) -C copy-kernel CROSS_COMPILE=$(TARGET_CROSS) O=$(KDIR),gemini-copy-kernel.bin) endef # Cook a "WRGG" image, this board is apparently one in the D-Link @@ -93,11 +93,10 @@ endef define Build/storlink-default-images mkdir -p $@.tmp - $(call Build/copy-kernel) # "App" partition is the rootfs mv $@ $@.tmp/hddapp.tgz # 256 bytes copy routine - dd if=copy-kernel/copy-kernel.bin of=$@.tmp/zImage + dd if=$(KDIR)/copy-kernel.bin of=$@.tmp/zImage $(call Image/pad-to,$@.tmp/zImage,512) # Copy first part of the kernel into zImage dd if=$(IMAGE_KERNEL) of=$@.tmp/zImage bs=1 seek=512 count=2096640 @@ -182,6 +181,8 @@ TARGET_DEVICES += dlink_dns-313 # Default images setup used by the StorLink reference designs define Device/storlink-reference + COMPILE := copy-kernel-$(1).bin + COMPILE/copy-kernel-$(1).bin := copy-kernel.bin IMAGES := factory.bin IMAGE/factory.bin := append-rootfs | pad-rootfs | pad-to 6144k | \ storlink-default-images $(1) diff --git a/target/linux/gemini/image/copy-kernel/Makefile b/target/linux/gemini/image/copy-kernel/Makefile index 155c35968c..9ba283bb01 100644 --- a/target/linux/gemini/image/copy-kernel/Makefile +++ b/target/linux/gemini/image/copy-kernel/Makefile @@ -13,20 +13,26 @@ OBJCOPY := $(CROSS_COMPILE)objcopy BIN_FLAGS := -O binary -S -all: copy-kernel.bin +SRC_DIR := $(CURDIR)/ +OUT_DIR := $(if $(O),$(if $(patsubst %/,,$(O)),$(O)/,$(O)),$(SRC_DIR)) + +all: $(OUT_DIR)copy-kernel.bin # Don't build dependencies, this may die if $(CC) isn't gcc dep: install: -%.o : %.S +$(OUT_DIR): + mkdir -p $(OUT_DIR) + +$(OUT_DIR)%.o : $(SRC_DIR)%.S | $(OUT_DIR) $(AS) $(ASFLAGS) -k -o $@ $< -%.bin: %.o +$(OUT_DIR)%.bin: $(OUT_DIR)%.o $(OBJCOPY) $(BIN_FLAGS) $< $@ mrproper: clean clean: - rm -f copy-kernel.bin copy-kernel.o + rm -f $(OUT_DIR)copy-kernel.bin $(OUT_DIR)copy-kernel.o