为什么“全部制作”能按预期工作而不在.PHONY目标中添加“全部”?

时间:2018-07-07 18:15:52

标签: makefile gnu-make

我知道 .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

2 个答案:

答案 0 :(得分:1)

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

如果您的意思是即使本地目录中存在all文件,但make仍在构建目标test1test2,那么make就是这样工作的(这与虚假目标与非虚假目标没有任何关系)。当make决定是否首先构建特定目标时,它会尝试构建该目标的所有先决条件以及那些目标的所有先决条件,等等。{{1 }}知道是否要建立第一个目标(在这种情况下为make

答案 1 :(得分:0)

make clean这里没有任何依赖关系,因此放置一个名为clean的文件足以将目标视为构建目标。

另一方面,

make all具有依赖性。即使在其中放置了名为all的文件,Make也必须检查all文件是否比test1test2更新。此过程将触发test1test2的构建,并且恰好与all是假目标一样。


依据是all: test1 test2是构建名为all文件的秘诀,它取决于 files test1test2

如果您运行了make all,Make将会执行以下操作:

  1. 分析Makefile
  2. 发现all取决于test1test2
  3. 检查all的时间戳,看它是否“最新”。
    • 如果没有一个依赖关系比其本身新,则为“最新”。
      • 换句话说,如果Make比所有依赖项都新,Make可以跳过构建文件。
  4. 构建过时或丢失的文件。

现在,如果要阻止Make将目标视为文件,则可以将其指定为phony targets。对于非文件目标(例如all),这是最佳做法。