.PHONY在makefile中的用途是什么?
.PHONY
在Makefile中意味着什么? 我已经经历了这个,但它太复杂了。
有人可以用简单的语言向我解释吗?
默认情况下,Makefile目标是“文件目标” - 它们用于从其他文件构建文件。 假定它的目标是一个文件,这使得编写Makefiles变得相对容易:
foo: bar
create_one_from_the_other foo bar
但是,有时您希望Makefile运行不代表文件系统中物理文件的命令。 很好的例子是“干净”和“全部”的共同目标。 有可能情况并非如此,但是您的主目录中可能会有一个名为clean
的文件。 在这种情况下,Make会被混淆,因为默认情况下, clean
目标将与该文件相关联,并且Make只会在文件看起来不是最新的依赖关系时运行它。
这些特殊的目标被称为假,你可以明确地告诉他们没有与文件关联,例如:
.PHONY: clean
clean:
rm -rf *.o
现在,即使您有一个名为clean
的文件, make clean
也会按预期运行。
就Make而言,假目标只是一个总是过时的目标,所以无论何时你问make <phony_target>
,目标都会运行,与文件系统的状态无关。 一些常见的make
是经常假目标是: all
, install
, clean
, distclean
, TAGS
, info
, check
。
欲了解更多信息,这里有一个很好的教程解释它。
假设你已经install
目标,这在makefile中很常见。 如果您不使用.PHONY
,并且名为install
的文件与Makefile位于同一目录中,那么make install
将不会执行任何操作。 这是因为Make将规则解释为“执行这样的配方来创建名为install
的文件”。 由于该文件已经存在,并且其依赖关系没有改变,所以不会做任何事情。
但是,如果您将install
目标设为PHONY,它会告诉make工具该目标是虚构的,并且该make不应该期望它创建实际的文件。 因此它不会检查install
文件是否存在,这意味着:a)如果文件存在并且b)不会调用额外的stat()
则其行为不会被改变。
通常,Makefile中不生成与目标名称同名的输出文件的所有目标应该是PHONY。 这通常包括all
, install
, clean
, distclean
等。
.PHONY: install