考虑一个长makefile
有许多目标,所有这些目标PHONY https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html(意味着目标名称不代表现有文件)。
我可以这样做:
.PHONY: a
a:
do someting a
.PHONY: b
b:
do someting b
.PHONY: c
c:
do someting c
Or:
.PHONY: a b c
a:
do someting a
b:
do someting b
c:
do someting c
第一个选项很麻烦,第二个选项很容易出错,当未来我添加一个目标并忘记将其声明为PHONY
.
是否有一个标准方法来声明所有目标makefile
as PHONY
?
如果真的all目标是PHONY,这有点没有意义。make
是为了“做必要的事情来更新我的输出”,如果答案为有什么必要?总是相同的,简单的脚本可以用更少的开销完成相同的工作。
话虽这么说,我可以想象一种情况,所有目标打算在命令行给出应该PHONY-- 假设您想要构建一些这样的文档:
all: doc1.pdf doc2.pdf doc3.pdf doc4.pdf doc5.pdf
manuals: doc3.pdf doc4.pdf
faqs: doc1.pdf
designdocs: doc2.pdf
apidocs: doc5.pdf
developerdocs: doc2.pdf doc5.pdf
userdocs: doc1.pdf doc3.pdf doc4.pdf
%.pdf: %.md
$(somedocgenerator) -o $@ $<
然后你could请执行下列操作:
.PHONY: all $(MAKECMDGOALS)
这将动态地生成命令行中给出的任何目标PHONY。请注意,您必须包括您的默认目标在这里,因为可以在不显式给出的情况下调用它,只需输入make
.
我不推荐这种方法,因为它有两个缺点:
- 它对于不同口味的移植性较差
make
.
- 它会行为不端if有人决定
make
像这里这样的特定输出文件make doc3.pdf
.
- 如果你决定拥有你的其中一个,它也会行为不当PHONY目标取决于另一个目标PHONY one.
因此,最好采用一行声明所有内容的方法PHONY目标。如果你的Makefile
真的很大,你可以将它分成几个文件并使用include
——并且拥有一个.PHONY:
每个文件中的行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)