我正在尝试编写一个makefile,其中有一个.asy 文件列表,每个文件都生成一个.png 或.pdf。
我通过查看文件得到了正确的扩展名,所以我有它们生成的源和对象的列表:
asy_to_ext = $(shell sed -n \
's#^settings.outformat *= *"\([a-z]*\)" *;#\1#p' \
$(file) | tail -1)
ASY_SRC := $(wildcard *.asy)
ASY_EXT := $(foreach file,$(ASY_SRC),$(asy_to_ext))
ASY_OBJ := $(ASY_SRC:.asy=.$(ASY_EXT))
我的问题是:现在,我如何告诉 make 每个对象都依赖于相应的源?使用单个扩展,静态模式规则就可以了:
$(ASY_OBJ) : %.png: %.asy
asy -noView -nointeractiveView $<
但是我在手册中找不到任何类似于带有通配符的模式规则$(ASY_OBJ) : %.*: %.asy
或使用我喜欢的源列表的任何
内容$(ASY_OBJ) : $(ASY_SRC)
。
我也尝试了双冒号规则,但它们只处理第一个对象,直到其中一个规则不匹配,而且理想情况下,我正在寻找可以工作的东西,即使 ASY_OBJ 最终具有与 .pdf 或 .pdf 不同的扩展名。 .png
$(ASY_OBJ) :: %.png: %.asy
asy -noView -nointeractiveView $<
$(ASY_OBJ) :: %.pdf: %.asy
asy -noView -nointeractiveView $<
因为我最终找到了方法,所以要回答自己:解决方案是辅助扩展,它允许在先决条件列表中使用自动变量。这样,无论目标的扩展名最终是什么,都可以将其剥离并替换为 .asy。
我还发现我获取 ASY_EXT 的功能无法正常工作,这也让我无法理解,这是通过使用手册中给出的 map 功能解决的。