生成文件中的虚假目标

CHI*_*HID 4 linux gnu makefile

我试图执行此链接中的示例。

all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
    cc -o prog1 prog1.o utils.o

prog2 : prog2.o
    cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
    cc -o prog3 prog3.o sort.o utils.o
Run Code Online (Sandbox Code Playgroud)

有或没有 PHONY(如果我注释掉 .PHONY 行),输出是相同的。PHONY在这里的真正用途是什么?

文章提到了这个

When one directory contains multiple programs, it is most convenient to describe all of the programs in one makefile

Since the target remade by default will be the first one in the makefile, it is common to make this a phony target named ‘all’ and give it, as prerequisites, all the individual programs

我无法理解 PHONY 在这里的真正用途是什么。有人可以在这个例子中指出一个场景,在这个场景中,如果没有 PHONY,程序的行为会有所不同吗?

gby*_*gby 5

没有 .PHONY “all” 只是一个常规的 make 目标,它取决于 prog1、prog2、prog3。这意味着如果一个名为“all”的文件碰巧存在于比 prog1、prog2 和 prog3 更新的目录中,它们将不会被构建(试试看!) - 但这显然不是您的想法。

.PHONY 告诉 GNU 使“all”目标是假的——你真的不打算创建一个名为“all”的文件,它应该构建依赖关系,无论名为“all”的文件是否存在。

稍后补充:

尽管总体思路是正确的,但我上面的 all 和 prog1 示例并不正确。这是一个非常简单的例子

all: prog

prog: prog.c

clean:
  $(RM) prog prog.o


giladb@xxx:~/tmp$ ls
Makefile  prog.c
giladb@xxx:~/tmp$ make
cc     prog.c   -o prog
giladb@xxx:~/tmp$ make clean
rm -f prog prog.o
giladb@nps06:~/tmp$ make
cc     prog.c   -o prog
giladb@xxx:~/tmp$ touch clean
giladb@xxx:~/tmp$ make clean
make: `clean' is up to date.
Run Code Online (Sandbox Code Playgroud)