Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux makefile中的假目标_Linux_Makefile_Gnu - Fatal编程技术网

Linux makefile中的假目标

Linux makefile中的假目标,linux,makefile,gnu,Linux,Makefile,Gnu,我试着执行这个例子 有或没有假冒(如果我注释掉.PHONY行),输出是相同的。虚假在这里的真正用途是什么 文章提到了这一点 当一个目录包含多个程序时,在一个makefile中描述所有程序是最方便的 由于默认情况下重新生成的目标将是makefile中的第一个目标,因此通常会将其设为名为“all”的虚假目标,并将所有单独的程序作为先决条件提供给它 我不明白在这里假冒伪劣的真正用途是什么。在这个例子中,有人能给我指出一个场景吗?在这个场景中,如果没有假冒,程序的行为会有所不同。没有假冒。假冒“all”

我试着执行这个例子

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

文章提到了这一点

当一个目录包含多个程序时,在一个makefile中描述所有程序是最方便的

由于默认情况下重新生成的目标将是makefile中的第一个目标,因此通常会将其设为名为“all”的虚假目标,并将所有单独的程序作为先决条件提供给它

我不明白在这里假冒伪劣的真正用途是什么。在这个例子中,有人能给我指出一个场景吗?在这个场景中,如果没有假冒,程序的行为会有所不同。

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

.PHONY告诉GNU make“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.

至少对于GNU Make,结合本例,关于输出的行为是相同的,无论目标“all”是否是虚假目标。即使有一个名为“all”的文件

但是正如链接后面的手册所描述的,GNU Make的内部行为是不同的。如果“all”不是虚假目标,GNU将检查名为“all”的文件是否存在并且是否比其先决条件旧。试试“make-d”,你会看到不同之处

另一个重要的一点是,总是执行虚假目标的配方。如果你举这个例子:

all: goal
    echo "Done"

.PHONY : clean

goal:
    echo "Hello World!" > $(@)

clean:
    rm -f goal all
。。。并执行以下操作:

$ make clean
rm -f goal all
$ make
echo "Hello World!" > goal
echo "Done"
Done
$ make
echo "Done"
Done
$ touch all
$ make
make: 'all' is up to date.
。。。创建文件“all”后将不执行配方

“所有”都是虚假目标:

all: goal
    echo "Done"

.PHONY : all clean

goal:
    echo "Hello World!" > $(@)

clean:
    rm -f goal all
。。。“all”的配方将始终独立于文件“all”的存在而执行


不正确,至少对于gnu make:
touch prog1.c;睡眠1;触摸一切;make all
build prog1,正如您可以看到的文件
all
存在,并且它比
prog1.c
@user1034749更新,这是因为所有的都需要比prog1更新,而不是prog1.cBut prog1的日期没有意义,如果它比源代码更新的话。问题是,若并没有什么改变,为什么要使用假冒伪劣产品。
all: goal
    echo "Done"

.PHONY : all clean

goal:
    echo "Hello World!" > $(@)

clean:
    rm -f goal all
$ make clean
rm -f goal all
$ make
echo "Hello World!" > goal
echo "Done"
Done
$ make
echo "Done"
Done
$ make
echo "Done"
Done
$ touch all
$ make
echo "Done"
Done
$ make
echo "Done"
Done