相关疑难解决方法(0)

在目标内设置环境变量

我在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)

makefile

20
推荐指数
1
解决办法
1万
查看次数

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

文件规定:

'.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

3
推荐指数
1
解决办法
3458
查看次数

标签 统计

makefile ×2