如何将所有先决条件复制到Makefile中的某个文件夹?



我想将所有先决条件复制到一个文件夹中,然后在那里处理它们。我尝试了一个shell for循环,但语法似乎是不同的

for f in $^; do cp $f some/folder/; done

我还尝试了GNU make

中的foreach循环
$(foreach f,$^,cp $f some/folder/)

我找到了这个解释,但我不是很理解。

make:为每个先决条件执行一个操作

这是我的食谱

CURRENT := $(PWD)
IMAGE_TREE_SOURCE := ./device/layer/kernelFitImage.its
FIT_PREREQUISITES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/Image 
$(PRODUCT_OUT)/ramdisk-recovery.img 
$(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/dts/freescale/imx8mm-gpv-distec.dtb 
$(IMAGE_TREE_SOURCE)
FIT_IMAGE_TARGET := $(PRODUCT_OUT)/boot/fitImage
$(FIT_IMAGE_TARGET): $(FIT_PREREQUISITES)
echo "Creating FIT image"
mkdir -p $(dir $@)
# for f in $^; do $$f $(PRODUCT_OUT)/boot; done
cd $(PRODUCT_OUT)/boot
cp $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/Image .
cp $(PRODUCT_OUT)/ramdisk-recovery.img .
cp $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/dts/freescale/imx8mm-gpv-distec.dtb .
cp $(IMAGE_TREE_SOURCE) .
mkimage -f kernelFitImage.its $@
rm ./Image 
rm ./ramdisk-recovery.img
rm ./imx8mm-gpv-distec.dtb
rm ./kernelFitImage.its
cd $(CURRENT)

我试图替换所有的复制语句来清理这个配方。

你不需要一个循环;为什么不能直接用cp $^ $(PRODUCT_OUT)/boot?然而,for循环确实有效。如果您在故障发生后查看目录,没有看到您复制到那里的文件吗?如果某件事失败了,你必须寻找其他问题。

我要指出的是,除非你在makefile中设置了一个shell,否则这是行不通的:
cd $(PRODUCT_OUT)/boot
cp $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/Image .
...

配方中的每个逻辑行都在单独的shell中运行。因此,在每一行完成后,shell退出(因此make知道它的退出代码是什么以及它是否失败)。当这种情况发生时,shell的所有本地上下文(包括环境变量和工作目录)将被丢弃。

因此,上面的cd ...行是无操作的:它将更改到子shell中的目录,然后子shell退出,您回到开始的地方。下一个shell仍然在原来的目录下。

您必须通过添加分号和反斜杠将其转换为单个逻辑行:

cd $(PRODUCT_OUT)/boot; 
cp $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/Image .; 
...