1

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

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

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

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

通配符是怎么回事?或者,有没有更好的方法来做到这一点?

4

2 回答 2

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,它会生成 html 并转换新生成的图像。请注意,它只会转换已更新的图像,这是您想要的。


感谢Beta指出 gif/png 扩展的混乱。

于 2009-09-24T20:46:51.717 回答
1

这听起来像是在$()处理 时评估所有表达式Makefile,而不是在执行每个规则时。您可以像这样向您的 makefile 添加规则:

images: $(patsubst %.png,%.gif,$(wildcard *.png))
.PHONY: images

然后将您的示例代码段更改为

%.html:
    ./generate-images.py > $@
    make images

以便 Make 在正确的时间评估 glob。这是值得检查手册的内容。

于 2009-09-24T20:33:48.653 回答