如何在Makefile中将所有前置依赖文件复制到指定文件夹
精简Makefile构建规则方案
原有写法错误原因
- shell循环写法问题:
- 你注释的测试代码遗漏了
cp指令,仅写了$$f $(PRODUCT_OUT)/boot会被识别为直接执行前置依赖文件,必然报错 - make默认将每行规则语句当作独立的子shell进程执行,如果要拆分shell循环为多行,需要在行尾加
\拼接为同一个命令块,否则循环变量无法跨行传递
- 你注释的测试代码遗漏了
- make foreach循环写法问题:仅需在每个生成的
cp命令后加分号分隔,即可正常执行,本身逻辑没有核心错误
精简后的完整构建规则
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_OUTPUT_DIR := $(dir $(FIT_IMAGE_TARGET)) $(FIT_IMAGE_TARGET): $(FIT_PREREQUISITES) echo "Creating FIT image" mkdir -p $(FIT_OUTPUT_DIR) # 二选一即可,推荐shell循环写法可读性更高 # 方案1:shell循环实现所有前置依赖复制 for f in $^; do cp $$f $(FIT_OUTPUT_DIR); done # 方案2:make foreach循环实现 # $(foreach f,$^,cp $(f) $(FIT_OUTPUT_DIR);) # 所有关联命令用&& \拼接,保证在同一个shell进程执行,无需手动切回原目录 cd $(FIT_OUTPUT_DIR) && \ mkimage -f $(notdir $(IMAGE_TREE_SOURCE)) $(notdir $@) && \ rm $(notdir $^)
优化说明
- 新增
FIT_OUTPUT_DIR公共变量复用目标路径,避免重复编写相同路径 - 用循环替换了4条单独的cp复制语句,后续新增前置依赖无需额外加复制代码
- 将cd、mkimage、rm操作拼接为同一个shell命令块,省略了原有的目录切换回退操作
- 用
$(notdir $^)批量获取所有前置依赖的文件名,替换4条单独的rm删除语句,代码更精简易维护
内容的提问来源于stack exchange,提问作者neolith
相关产品推荐
相关产品推荐

