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
被伪造了。
为什么需要“虚假”才能工作?
仅仅通过被提及为目标,
为什么需要“虚假”才能工作?
它不是。您没有将其声明.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,观察它不像描述的那样工作,然后问为什么不行。
归档时间: |
|
查看次数: |
3458 次 |
最近记录: |