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

Dan*_*lat 4 makefile

export HELLO=Hello,world
all:
        @echo $(HELLO)
        @echo $(shell echo $$HELLO)
        @echo `echo $$HELLO`
Run Code Online (Sandbox Code Playgroud)

输出:

Hello,world

Hello,world
Run Code Online (Sandbox Code Playgroud)

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

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

在 GNU Make 4.0 上测试。

Eta*_*ner 5

恭喜您遇到了 make bug:$(shell) 不支持导出,但这没有记录?

代码中有一条注释(在提交票证之前并在票证中引用),它表明在复杂的情况下此操作无法正常工作,因此看起来它还没有完成。

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

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

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

    $ PKG_CONFIG_SYSROOT=/some/path make
    
    Run Code Online (Sandbox Code Playgroud)