bash - 如何将所有先决条件复制到 Makefile 中的某个文件夹?
问题描述
我想将所有先决条件复制到一个文件夹中,然后在那里处理它们。我尝试了一个shell for循环,但语法似乎不同
for f in $^; do cp $f some/folder/; done
我还尝试了 GNU make 的 foreach 循环
$(foreach f,$^,cp $f some/folder/)
我找到了这个解释,但我不太明白
这是我的食谱
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 中设置 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 .; \
...
推荐阅读
- sql - 插入,即使是空白
- neo4j - 比较 neo4j 密码查询中的列表
- php - 如果发生 PHP 内存不足错误,如何获得实时警报?
- nearprotocol - 测试网浏览器上的交易状态为“未启动”
- python-3.x - 始终显示成功但未正确验证 - python random
- html - Flexbox 布局项宽度
- python - pandas resample last 取下一个值
- amazon-web-services - 在 Amazon S3 中将数据重组为前缀
- java - 在具有 openjdk 11.0.10 的 Scene Builder 16.0.0 中找不到 FontAwesomeIconView
- php - 用 iv = 0 解密 aes-256-cbc 编码文件