.EXPORT_ALL_VARIABLES 仅在设为“虚假”时才有效

3 makefile

文件规定:

'.EXPORT_ALL_VARIABLES'

简单地作为目标被提及,这告诉“make”默认将所有变量导出到子进程。*注意将变量与子“make”通信:变量/递归。

然而,下面的makefile 表明,只有通过制作.EXPORT_ALL_VARIABLES一个虚假的目标,而且只有这样,它才会对makefile 产生预期的影响,即导出所有变量。

Makefile(版本 1)是:

ifeq "$(MAKELEVEL)" "0"

foo=bar

.DEFAULT:;

all: .EXPORT_ALL_VARIABLES
    @$(MAKE)

else

all:
    @echo 'foo is: $(foo)'

endif
Run Code Online (Sandbox Code Playgroud)

运行,我们得到:

make[1]: Entering directory '/home/myname'
foo is:
make[1]: Leaving directory '/home/myname'
Run Code Online (Sandbox Code Playgroud)

Makefile(版本 2)是:

ifeq "$(MAKELEVEL)" "0"

foo=bar

.DEFAULT:;

all: .EXPORT_ALL_VARIABLES
    @$(MAKE)

# This line is added in THIS version.
.PHONY: .EXPORT_ALL_VARIABLES

else

all:
    @echo 'foo is: $(foo)'

endif
Run Code Online (Sandbox Code Playgroud)

运行,我们得到:

make[1]: Entering directory '/home/myname'
foo is: bar
make[1]: Leaving directory '/home/myname'
Run Code Online (Sandbox Code Playgroud)

现在,这两个版本的 makefile 之间的唯一区别是,在第二个版本中,它.EXPORT_ALL_VARIABLES被伪造了。

为什么需要“虚假”才能工作?

Mad*_*ist 5

仅仅通过被提及为目标,

为什么需要“虚假”才能工作?

它不是。您没有将其声明.EXPORT_ALL_VARIABLES为目标,而是将其声明为先决条件:

all: .EXPORT_ALL_VARIABLES
Run Code Online (Sandbox Code Playgroud)

这是先决条件,而不是目标。如果您将其声明为目标:

.EXPORT_ALL_VARIABLES:
Run Code Online (Sandbox Code Playgroud)

然后它会起作用,你不必声明它是假的。

一个更准确的问题是,为什么.EXPORT_ALL_VARIABLES即使没有声明为目标,声明为虚假的工作也有效?之所以会发生这种情况,是因为即使没有明确提及,标记为 phony 的东西也被假定为目标。这可能是也可能不是错误,这取决于您如何解释.PHONY.

您最近的问题似乎遵循一种模式:阅读文档,然后编写一个与文档所说的内容类似但不相同的 makefile,观察它不像描述的那样工作,然后问为什么不行。