我在makefile中有一个目标:
all: $(TARGETS)
Run Code Online (Sandbox Code Playgroud)
我想要一个变体,all它不仅仅是因为它设置了一个环境变量.就像是:
all-abc: $(TARGETS)
ABC=123
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为在设置变量之前处理依赖项.我已经考虑过在设置环境变量的实际依赖之前有另一个依赖,但我不认为环境会在目标之间持续存在.也就是说
abc:
ABC=123
all-abc: abc $(TARGETS)
Run Code Online (Sandbox Code Playgroud)
不起作用.我最终希望能做的是
$ make all-abc
Run Code Online (Sandbox Code Playgroud)
代替
$ ABC=123 make
Run Code Online (Sandbox Code Playgroud)
是否可以设置这样的环境变量?
(GNU Make 3.82)
该文件规定:
'.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 …Run Code Online (Sandbox Code Playgroud) makefile ×2