.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是经常假目标是: allinstallcleandistcleanTAGSinfocheck

欲了解更多信息,这里有一个很好的教程解释它。


假设你已经install目标,这在makefile中很常见。 如果您不使用.PHONY ,并且名为install的文件与Makefile位于同一目录中,那么make install将不会执行任何操作。 这是因为Make将规则解释为“执行这样的配方来创建名为install的文件”。 由于该文件已经存在,并且其依赖关系没有改变,所以不会做任何事情。

但是,如果您将install目标设为PHONY,它会告诉make工具该目标是虚构的,并且该make不应该期望它创建实际的文件。 因此它不会检查install文件是否存在,这意味着:a)如果文件存在并且b)不会调用额外的stat()则其行为不会被改变。

通常,Makefile中不生成与目标名称同名的输出文件的所有目标应该是PHONY。 这通常包括allinstallcleandistclean等。


.PHONY: install
  • 表示“安装”一词在此Makefile中不代表文件名;
  • 意味着Makefile与在同一个目录中名为“install”的文件无关。
  • 链接地址: http://www.djcxy.com/p/61435.html

    上一篇: What is the purpose of .PHONY in a makefile?

    下一篇: How do I write the 'cd' command in a makefile?