GNU Make和通配符 - 缺少文件

时间:2009-09-24 20:20:11

标签: makefile gnu-make

我有一个包含以下类型规则的Makefile:

%.html:
    ./generate-images.py > $@
    make $(patsubst %.png,%.gif,$(wildcard *.png))

generate-images脚本不仅将HTML文件(到stdout)写入,而且将几个.png文件写入当前目录。这里的目标是将它们转换为.gif。 (不是真的,但这是一个例子)

如果我直接调用它,这是有效的。问题是:如果我从foo.html是依赖项的另一个规则调用它,则通配符语句无法找到任何文件。换句话说,它只是调用make而没有参数,这不是我想要的。

与通配符有什么关系?或者,有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

虽然你的问题可能有所不同,但我清楚地看到了一个问题。

同时处理规则中所有命令的全文,以便扩展make的函数和变量。假设您在目录中没有.png个文件,并且您调用make,因此它应该重新生成它们:a.pngb.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。这是检查手册可能值得的东西。