# 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。
答案 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 错误吗?还是至少是文档错误?)