我有一个包含以下类型规则的Makefile:
%.html:
./generate-images.py > $@
make $(patsubst %.png,%.gif,$(wildcard *.png))
generate-images
脚本不仅将HTML文件(到stdout)写入,而且将几个.png文件写入当前目录。这里的目标是将它们转换为.gif。 (不是真的,但这是一个例子)
如果我直接调用它,这是有效的。问题是:如果我从foo.html
是依赖项的另一个规则调用它,则通配符语句无法找到任何文件。换句话说,它只是调用make
而没有参数,这不是我想要的。
与通配符有什么关系?或者,有更好的方法吗?
答案 0 :(得分:3)
虽然你的问题可能有所不同,但我清楚地看到了一个问题。
同时处理规则中所有命令的全文,以便扩展make的函数和变量。假设您在目录中没有.png
个文件,并且您调用make,因此它应该重新生成它们:a.png
和b.png
。然后,在调用make之后,规则的文本将实际上如下所示:
file.html:
./generate-images.py > file.html
make
因为在读取makefile时没有.png
个文件!执行第一行后,将显示文件,但下一行已生成只是“make”。
只有当您第二次调用makefile时,它才会扩展为
file.html:
./generate-images.py > file.html
make a.gif b.gif
这不是你想要的。所以我建议以正确的方式做这件事。
# If you have batch conversion program, this may be helpful
images.stamp: *.png
convert_all_images $?
touch images.stamp
# OR, if you want convert one-by-one with means of make
images.stamp: $(wildcard *.png)
touch images.stamp
%.gif: %.png
convert_one --from=$^ --to=$@
# HTML would look like
%.html:
./generate-images.py > $@
make images.stamp
因此,当您调用make all
时,它会生成htmls并转换新生成的图像。请注意,它只会转换更新的图像,这就是您想要的。
感谢Beta指出gif / png扩展程序的混乱。
答案 1 :(得分:1)
听起来它正在评估所有$()
表达式,因为它处理Makefile
,而不是执行每个规则。您可以像这样在makefile中添加规则:
images: $(patsubst %.png,%.gif,$(wildcard *.png))
.PHONY: images
然后将您的示例代码段更改为
%.html:
./generate-images.py > $@
make images
以便Make在适当的时候评估glob。这是检查手册可能值得的东西。