我知道 .PHONY 的作用。
如果在我的Makefile所在的文件夹中,我添加了一个名为 clean 的空文件,并且在运行make clean之后,由于文件中没有任何更改,因此不会执行所有clean目标。 ,因此目标将不会运行,这是正确的。 如果我添加 .PHONY:clean ,则将clean视为命令,这也是正确的。
我的问题是为什么在 all 目标上会发生这种行为,因为我在文件夹中添加了 all 文件。因此,基本上所有目标仍然像如果是。PHONY:全部
我有轻松的makefile代码。
all: test1 test2
test1: test1.o
test1.o: test1.c
test2: test2.o
test2.o: test2.c
clean:
rm -rf *.o test1 test2
答案 0 :(得分:1)
您怎么知道all
规则“仍在执行”?该规则没有配方,因此无法“执行”。
如果您的意思是即使本地目录中存在all
文件,但make
仍在构建目标test1
和test2
,那么make就是这样工作的(这与虚假目标与非虚假目标没有任何关系)。当make决定是否首先构建特定目标时,它会尝试构建该目标的所有先决条件以及那些目标的所有先决条件,等等。{{1 }}知道是否要建立第一个目标(在这种情况下为make
。
答案 1 :(得分:0)
make clean
这里没有任何依赖关系,因此放置一个名为clean
的文件足以将目标视为构建目标。
make all
具有依赖性。即使在其中放置了名为all
的文件,Make也必须检查all
文件是否比test1
和test2
更新。此过程将触发test1
和test2
的构建,并且恰好与all
是假目标一样。
依据是all: test1 test2
是构建名为all
的文件的秘诀,它取决于 files test1
和test2
。
如果您运行了make all
,Make将会执行以下操作:
Makefile
。all
取决于test1
和test2
。all
的时间戳,看它是否“最新”。
现在,如果要阻止Make将目标视为文件,则可以将其指定为phony targets。对于非文件目标(例如all
),这是最佳做法。