如何更改 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.
当我运行
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.