这看起来很简单,但它让我望而却步。如何创建单个目标来复制具有不同文件名的文件列表?
我正在尝试将../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 $^ $@
答案 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