首页 > 解决方案 > 如何将所有先决条件复制到 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)

我正在尝试替换所有的复制语句来清理这个食谱。

标签: bashfor-loopmakefile

解决方案


你不需要循环;为什么你不能使用cp $^ $(PRODUCT_OUT)/boot?但是,for 循环确实有效。如果你在失败后去查看目录,你没有看到你在那里复制的文件吗?如果出现问题,您将不得不寻找其他问题。

我会指出,除非您在 makefile 中设置 oneshell,否则这是行不通的:

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

推荐阅读