如何更改 Makefile $(shell ...) 命令的路径?

How to change PATH for Makefile $(shell ...) commands?

当我运行

export PATH := mypath
$(error $(shell echo "$${PATH}"))

似乎我的 PATH 在调用 shell 时没有改变。

为什么会这样,我如何实际更改 PATH 以供 shell 调用?

这是 GNU make 吗?有一个由来已久的GNU make feature request to honor exported variables with $(shell …)。这根本不是 PATH 特有的,它影响(或不影响)所有 export 个变量。

根据 GNU make 源,这很难实现:

  /* Using a target environment for 'shell' loses in cases like:
       export var = $(shell echo foobie)
       bad := $(var)
     because target_environment hits a loop trying to expand $(var) to put it
     in the environment.  This is even more confusing when 'var' was not
     explicitly exported, but just appeared in the calling environment.

     See Savannah bug #10593.

  envp = target_environment (NULL);
  */

解决方案很简单:永远不要使用 $(shell)export

环境变量应该是需要它们的配方的一部分。

对于应该填充 makefile 变量的 $(shell) 调用,您可以改用。

  • 它还有一个好处是更灵活,因为你可以用一个配方填充多个变量
  • 您还可以定义适当的依赖关系,而 $(shell) 始终执行,无论是在解析 makefile 时还是在递归扩展的变量被扩展时。
  • 您会遇到构建错误并记录配方,而 $(shell) 可以让 DevOp 工程师过上充实的生活...
PATH := mypath

Makefile.variables:
    @PATH=$(PATH) echo "This my path '$${PATH}'"
    echo >$@ "MY_DYNAMIC_CONTENT := abcd"

include Makefile.variables

$(info MY_DYNAMIC_CONTENT '$(MY_DYNAMIC_CONTENT)')

示例运行:

$ make
MY_DYNAMIC_CONTENT ''
This my path 'mypath'
echo >Makefile.variables "MY_DYNAMIC_CONTENT := abcd"
MY_DYNAMIC_CONTENT 'abcd'
make: 'Makefile.variables' is up to date.