与目标

时间:2017-12-29 16:44:17

标签: makefile

我有一系列Markdown文件,视频,graphviz点文件等等,我希望使用make来处理文件,并且不必重复我自己。

在Makefile中,我正在为每个单独的文件编写构建指令,因为a)没有那么多,b)每个文件理论上可能需要稍微不同的构建过程。标准%.html: %.md类型的规则将没有用,因为并非所有html文件都是使用相同的命令构建的。例如。

但是,我无法弄清楚如何缩写规则语法的先决条件部分。每个目标文件都依赖于源目录中具有相同名称的文件。如何避免在基本规则中输入两次名称,如下所示?我觉得我应该只能指定文件名的干,目标后缀和源后缀,就是这样。这似乎应该是一件非常简单的事情,所以我可能只是用错误的术语来描述它并搜索解决方案。

./dist/00-introductions/overview.html: ./src/00-introductions/overview.md
       $(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_REVEALJS) -o $@ $<

如果重要,

$ make -v
GNU Make 4.1
Built for x86_64-pc-linux-gnu

1 个答案:

答案 0 :(得分:1)

您可以为每个目标使用单独的静态模式规则

./dist/00-introductions/overview.html: ./dist%.html: ./src%.md
    $(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_REVEALJS) -o $@ $<

更好的解决方案是在多个通用规则下对目标进行分组,并使用特定于目标的变量来调整配方:

targets1 := ./dist/00-introductions/overview.html
targets2 := ./dist/00-introductions/foobar.html

$(targets1): ./dist%.html: ./src%.md
    $(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_REVEALJS) -o $@ $<

$(targets2): ./dist%.html: ./src%.md
    $(FOOBAR) $(FOOBAR_OPTIONS) -o $@ $<

./dist/00-introductions/overview.html: PANDOC_OPTIONS := -foo
./dist/00-introductions/foobar.html: FOOBAR_OPTIONS := -bar