【发布时间】:2020-04-05 16:27:34
【问题描述】:
例如,我有以下 Makefile 可以从子目录中的 Markdown 文件生成 PDF 文件:
FOLDERS = f1 f2 f3
.PHONY: $(FOLDERS)
f1: f1/f1.md
cd $@ && pandoc $(notdir $^) -o $(patsubst %.md,%.pdf,$(notdir $^))
f2: f2/f2.md
cd $@ && pandoc $(notdir $^) -o $(patsubst %.md,%.pdf,$(notdir $^))
f3: f3/f3.md
cd $@ && pandoc $(notdir $^) -o $(patsubst %.md,%.pdf,$(notdir $^))
预期结果是make f1 需要f1/f1.md 的存在,并将生成的PDF 生成为f1/f1.pdf。 f2 和 f3 也是如此。这可行,但声明似乎不必要地重复。
有没有办法将这三个规则合并为一个通用规则?也就是说,不需要显式写出 PDF 文件或 Markdown 文件的所有路径,因为我可能会动态添加子文件夹,而且我更愿意在第一行更改 FOLDERS 的定义。我已经四处搜索并尝试了一些东西,但我觉得要么我找不到正确的咒语来使用,要么我错过了有关 Makefile 如何工作的知识。有人可以指出我正确的方向吗?
【问题讨论】:
-
请注意,您可能希望使用
$<而不是$^。另请注意,您可以将$(notdir $<)替换为$(<F)。这是某种程度的简化。 -
关于第一个建议,当只有一个先决条件时,
$<和$^之间是否存在功能差异?谢谢你的第二个! -
功能上没有区别。但是,如果您只想要第一个先决条件,
$^是错误的。
标签: makefile