当目标文件基本名称与先决条件文件不同时有效的 Makefile 配方?
Makefile recipe that works when target file base name is different from prerequisite file?
我有一个 Makefile,其中有几个目标需要以相同的方式制作,但其中一个目标是一个基本名称与其先决条件不同的文件。这是一个最小的例子:
ABOUT.html: README.md
help.html: help.md
%.html: %.md
pandoc --standalone --quiet -f gfm -H $(github-css) -o tmp.html $<
inliner -n < tmp.html > $@
rm -f tmp.html
有了这个 Makefile,help.html
就生成了,但 ABOUT.html
永远不会生成。我认为,原因是 %.html
和 %.md
的基本文件名在 ABOUT.html
的情况下不匹配,因为该目标取决于 README.md
。
有没有办法使这项工作无需为 ABOUT.html
制作单独的配方?
一种选择是创建 ABOUT.md
符号链接,以便您的模式规则起作用,方法是添加以下规则:
ABOUT.md : README.md
ln -s ${<F} ${@F}
您可能希望避免在配方中使用相同的临时文件,因为这会破坏并行构建。更好的方法是根据目标名称为目标使用唯一的临时文件:
%.html: %.md
pandoc --standalone --quiet -f gfm -H $(github-css) -o $@~ $<
inliner -n < $@~ > $@
rm -f $@~
我有一个 Makefile,其中有几个目标需要以相同的方式制作,但其中一个目标是一个基本名称与其先决条件不同的文件。这是一个最小的例子:
ABOUT.html: README.md
help.html: help.md
%.html: %.md
pandoc --standalone --quiet -f gfm -H $(github-css) -o tmp.html $<
inliner -n < tmp.html > $@
rm -f tmp.html
有了这个 Makefile,help.html
就生成了,但 ABOUT.html
永远不会生成。我认为,原因是 %.html
和 %.md
的基本文件名在 ABOUT.html
的情况下不匹配,因为该目标取决于 README.md
。
有没有办法使这项工作无需为 ABOUT.html
制作单独的配方?
一种选择是创建 ABOUT.md
符号链接,以便您的模式规则起作用,方法是添加以下规则:
ABOUT.md : README.md
ln -s ${<F} ${@F}
您可能希望避免在配方中使用相同的临时文件,因为这会破坏并行构建。更好的方法是根据目标名称为目标使用唯一的临时文件:
%.html: %.md
pandoc --standalone --quiet -f gfm -H $(github-css) -o $@~ $<
inliner -n < $@~ > $@
rm -f $@~