Ada*_*tan 9 makefile phony-target
考虑一个makefile有很多目标的长目标,所有目标都是PHONY(这意味着目标名称不代表现有文件)。
我可以:
.PHONY: a
a:
do someting a
.PHONY: b
b:
do someting b
.PHONY: c
c:
do someting c
Run Code Online (Sandbox Code Playgroud)
要么:
.PHONY: a b c
a:
do someting a
b:
do someting b
c:
do someting c
Run Code Online (Sandbox Code Playgroud)
第一种选择很麻烦,第二种选择容易出错,因为将来我添加一个目标却忘记将其声明为PHONY。
有没有一种标准的方法来声明makefileas中的所有目标PHONY?
rag*_*ags 14
只需使用MAKEFLAGS并设置选项,--always-make如下所示:
MAKEFLAGS += --always-make
Run Code Online (Sandbox Code Playgroud)
小智 5
如果确实所有目标都是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 $@ $<
Run Code Online (Sandbox Code Playgroud)
然后,您可以执行以下操作:
.PHONY: all $(MAKECMDGOALS)
Run Code Online (Sandbox Code Playgroud)
这将动态地使任何在命令行PHONY上给定的目标。请注意,您必须在此处包括默认目标,因为可以通过简单地键入来调用它,而无需明确给出它make。
我不推荐这种方法,因为它有两个缺点:
make。make像这里这样的特定输出文件,它将是不正常的make doc3.pdf。因此,最好采用一种方法声明所有PHONY目标的方法。如果您Makefile确实很大,则可以将其拆分为多个文件并使用include- .PHONY:每个文件中只有一行。