为什么环境变量不能在$(shell)命令中工作?

时间:2015-10-15 22:08:34

标签: makefile

export HELLO=Hello,world
all:
        @echo $(HELLO)
        @echo $(shell echo $$HELLO)
        @echo `echo $$HELLO`

输出:

Hello,world

Hello,world

为什么反引号和$(shell)之间存在差异,是否有办法将环境变量传递给$(shell)调用?

我正在尝试在交叉编译环境中使用pkg-config,所以我需要设置$ PKG_CONFIG_SYSROOT。我可以使用反引号,但它为每个.o文件执行一次。根据{{​​3}},我需要使用PKG_CFLAGS:= $(shell pkg-config $(PACKAGES)),但我无法传递所需的环境变量以使其正常工作。

在GNU Make 4.0上测试。

1 个答案:

答案 0 :(得分:2)

恭喜您遇到了制作错误:$(shell) doesn't honor export but this is undocumented?

代码中有一条评论(在提交故障单之前,并在故障单中引用),表示存在无法正常工作的复杂情况,因此看起来它还没有完成。

我可以想到两种方法让$(shell)环境让您想要手动设置的变量可用。

  1. 明确地在$(shell)上下文中设置它们。

    PCVAR:=$(shell PKG_CONFIG_SYSROOT=$(make-level-variable-PKG_CONFIG_SYSROOT) pkg-config ...)
    
  2. make进程环境中设置它们,以便$(shell)环境正常继承它们。

    $ PKG_CONFIG_SYSROOT=/some/path make