制作目标以复制文件

时间:2016-04-18 20:10:40

标签: makefile

这看起来很简单,但它让我望而却步。如何创建单个目标来复制具有不同文件名的文件列表?

我正在尝试将../images/class中的所有$(IMG)文件复制到当前目录。

我试过这个:

CP := cp

IMGS := \
  A.png \
  A.tif \
  A.eps \
  B.png \
  B.tif \
  B.eps

SRC_IMG_DIR := ../images/class

.SECONDEXPANSION:
$(IMGS): $$($(SRC_IMG_DIR)/$$@)
    $(CP) -f $^ $@

2 个答案:

答案 0 :(得分:2)

实际上,你只是在试图使用二次扩展时感到困惑。这是一个简单的情况,因此标准模式规则的简单应用就可以解决这个问题:

% : $(SRC_IMG_DIR)/%
        $(CP) -f $< $@

二次扩展只需要更复杂/棘手的问题。

答案 1 :(得分:1)

你的问题是你要扩展太多次了。

您正在考虑$(SRC_IMG_DIR)/$$@) $(SRC_IMG_DIR)位在初始解析阶段正在扩展,并且$$@位在二级扩展迷你阶段期间正在扩展且然后再次扩展结果

因此,假设您在make A.png中运行A.png A.tif ...: $(../images/class/$@)初始解析结果。

然后发生目标确定,make决定需要构建A.png,以便找到A.png目标并发现它需要展开{​​{1}},展开{{1} ($(../images/class/$@))并获取$@,然后将A.png 扩展为变量名称,最后得到一个空的先决条件,最终运行{{ 1}}。

你不希望最后一次扩展,所以放弃包裹$(../images/class/A.png)

../images/class/A.png