我想将所有先决条件复制到一个文件夹中,然后在那里处理它们。我尝试了一个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循环确实有效。如果您在故障发生后查看目录,没有看到您复制到那里的文件吗?如果某件事失败了,你必须寻找其他问题。
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 .;
...