声明所有目标 PHONY

2024-01-10

考虑一个长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(使用前将#替换为@)

声明所有目标 PHONY 的相关文章

随机推荐