Makefile:声明所有目标为PHONY

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)


小智 13

对我来说.PHONY: *有效。(GNU make 4.2.1)


小智 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目标依赖于另一个PHONY目标,这也将产生异常。

因此,最好采用一种方法声明所有PHONY目标的方法。如果您Makefile确实很大,则可以将其拆分为多个文件并使用include- .PHONY:每个文件中只有一行。

  • 我不同意这样的前提:包含所有虚假目标的 Makefile 应该被任意脚本替换。Make 是一种极其多产的工具,它已成为构建大多数项目的事实上的标准。在项目中用任意构建脚本替换它会违反此标准,并可能会导致开发人员和消费者之间的混淆。 (18认同)