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

如何更改Makefile$(shell…)命令的路径?,makefile,path,environment-variables,gnu-make,Makefile,Path,Environment Variables,Gnu Make,当我跑的时候 export PATH := mypath $(error $(shell echo "$${PATH}")) 调用shell时,我的路径似乎没有改变 这是为什么?我如何实际更改shell调用的路径?这是GNU make吗?这是一个长期存在的问题。这根本不是特定于路径,它影响(或不影响)所有导出变量 根据GNU make的消息来源,这是很难实现的: /* Using a target environment for 'shell' loses in cases like:

当我跑的时候

export PATH := mypath
$(error $(shell echo "$${PATH}"))
调用
shell
时,我的
路径似乎没有改变


这是为什么?我如何实际更改
shell
调用的
路径?

这是GNU make吗?这是一个长期存在的问题。这根本不是特定于
路径
,它影响(或不影响)所有
导出
变量

根据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)
导出

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

对于要填充makefile变量的
$(shell)
调用,您可以改用它

  • 它还有更灵活的优点,因为您可以用一个配方填充多个变量
  • 您还可以定义适当的依赖项,而
    $(shell)
    总是在解析makefile或递归扩展变量时执行
  • 你会得到构建错误并记录配方,而
    $(shell)
    可以让DevOp工程师的生活充满活力
PATH:=mypath
Makefile.variables:
@PATH=$(PATH)echo“这是我的路径$${PATH}”
echo>$@“我的动态内容:=abcd”
包括Makefile.variables
$(信息我的动态内容'$(我的动态内容))
运行示例:

$make
我的动态内容“
这是我的路径“我的路径”
echo>Makefile.variables“我的动态内容:=abcd”
我的动态内容“abcd”
make:'Makefile.variables'是最新的。

Oof。。。我很害怕。多谢各位+1就其价值而言,我认为即使允许导出带有延迟扩展变量的
也是毫无意义的,但我是谁来判断GNU…我不明白为什么它毫无意义。变量可以是类似于
export TARGET=$@
的内容,以强制将
$TARGET
环境变量设置为目标名称,或者类似的内容。无论如何,要做您想做的事情,您必须在shell调用中包含设置:
$(shell PATH=$(PATH);运行我的命令)
@madscitector:如果我做了
export PATH=$(shell curl example.com)
$(info$(shell foo…)
$(info$(shell bar…)
example.com
我应该收到多少请求?一个?两个?三个。。。?调用
$(shell…
)不需要在规则内,它在Makefile解析时是合法的(顺便说一句,这就是我需要它的原因)。呃。。。什么?您正在尝试将
路径设置为运行
curl example.com
返回的值?我不明白你的评论,我想你也不明白我的。您有
$(错误$(shell echo$$PATH))
。我想说的是,如果希望shell脚本具有
PATH
设置,则必须将其包含在脚本中;e、 例如,将其写为
$(error$(shell PATH=$(PATH);echo$$PATH))
(是的,我意识到echo不是您想要做的:用您想要运行的任何命令替换它)。我同意
$(shell)
被过度使用:-)。是的,有些地方是正确的,但这些地方很少。我通常把它当作一种气味,makefile通常在删除后会得到改进。