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

How to copy all prerequisites to a certain folder in a Makefile?

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

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

我还尝试了 GNU make 的 foreach 循环

$(foreach f,$^,cp $f some/folder/)

我找到了这个解释,但我不是很明白

make: execute an action for each prerequisite

这是我的食谱

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 .; \
 ...