我有一个 Markdown 文件、视频、图形可视化点文件等的集合,我想根据需要使用 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
您可以为每个目标使用单独的静态模式规则
./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