makefile - 为什么 "make all"没有将 "all"添加到 .PHONY 目标就按预期工作?

标签 makefile gnu-make

我知道 .PHONY 的作用。

如果在我的 Makefile 所在的文件夹中,我添加了一个名为 clean 的空文件,并且在我运行 make clean 之后所有的 clean 目标都不会被执行,因为文件中没有任何变化,所以目标不会运行,这是正确的。 如果我添加 .PHONY: clean,则 clean 被视为命令,这也是正确的。

我的问题是为什么这种行为不会发生在 all 目标上,因为我在文件夹中添加了一个 all 文件。所以基本上 all 目标仍然执行如果是 .PHONY: all

我有休闲的 makefile 代码。

all: test1 test2

test1: test1.o
test1.o: test1.c

test2: test2.o
test2.o: test2.c

clean:
        rm -rf *.o test1 test2

最佳答案

你怎么知道 all 规则“仍在执行”?该规则没有配方,因此无法“执行”。

如果您的意思是即使 all 文件存在于本地目录中,make 仍在构建目标 test1test2,这就是 make 的工作原理(这与虚假目标与非虚假目标没有任何关系)。当 make 决定是否首先构建特定目标时,它会尝试构建该目标的所有先决条件,以及那些目标的所有先决条件,等等。只有在所有这些都完成之后,知道是否构建第一个目标(在本例中为all)。

关于makefile - 为什么 "make all"没有将 "all"添加到 .PHONY 目标就按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51225819/

相关文章:

c - 编写我的第一个 Makefile 时遇到问题

c - Linux 内核模块 Makefile 不能包含相对路径

c - Gnu-Make 无法包含 makefile

c - -lpthread 在 C Makefile 中的位置

postgresql - 如何在 PostgreSQL 16 中设置 "VARSIZE"和 "SET_VARSIZE"

macos - 如何运行 "gmake install"?

makefile - 停止让它回显进入/退出的目录

c++ - 如何设置 Makefile 以使用 Visual-Studio 风格的输出目录进行构建?

mercurial - 我使用 Mercurial Hook 将版本号嵌入到我的应用程序中的方法有多好?

makefile - "Sysroot"从 QtCreator 传输到 Makefile 中的哪个命令?