Make:变量无法从shell调用分配

时间:2018-06-06 18:57:15

标签: c++ makefile gnu-make

# makefile

SHELL:=/bin/bash
PATH:=/path/to/new/programs:$(PATH)


my_var:=$(shell which program)

rule:
    echo $(my_var)
    which program

#output
$: make rule

echo 

which program
/path/to/program

# prints nothing

我已经尝试了所有的东西,并且实际上回想起这个工作,因为我之前正在创建makefile。它变成了一个泥潭 - 我需要做的就是在安装之前检查是否存在exe。

2 个答案:

答案 0 :(得分:2)

如果您未在makefile中设置which变量,那么显式SHELL是否有效?

设置SHELL变量只会影响配方。它不用于$(shell ...)功能。您可以使用:

my_var := $(shell /bin/bash -c 'which function')

但是在我的系统中,即使使用默认shell也可以使用which。也许你的系统有所不同。

当然注意which找到程序,而不是函数......

答案 1 :(得分:0)

重写 (感谢@MadScientist指出我的困惑。 我认为最好完全删除错误信息。)

由于$PATH最初是导出到 make 的环境中的, make 将确保将其导出到运行的任何配方命令的环境中。 对makefile 中的$PATH所做的任何更改都会进入 make 运行的receipe命令的环境。

请注意,对于通过$(shell …)运行的命令,不是为true。 导出的变量保留 make 启动时的值。 就外部命令而言,它们在makefile中遭受的任何更改都将被忽略。

正如其他地方指出的那样, 一种解决方法是在任何$PATH

中明确重复$(shell …)的扩充
my_var := $(shell PATH='${PATH}' which program)

(让我惊讶。这是 make 错误吗?还是至少是文档错误?)