Makefile编写如下:
all:
iceking='$@';
echo $$iceking;
然而输出如下:
[root@localhost test]# make
iceking='all';
echo $iceking;
字符串'all'不输出。为什么呢?
答案 0 :(得分:4)
当需要执行配方来更新目标时,它们就是 通过为配方的每一行调用一个新的子shell来执行...
由makefile调用的shell命令集等同于:
bash -c iceking='all';
bash -c echo $iceking;
无法从iceking
的第二次调用环境访问变量bash
。这就是你收到空输出的原因。
解决此问题的一种方法是使用.ONESHELL
特殊目标。来自GNU make manual:
如果.ONESHELL特殊目标出现在makefile中的任何位置 每个目标的所有配方行将提供给一个 调用shell。
但.ONESHELL
存在一个问题,此功能仅在GNU make
版本3.82之后添加。
修复它的另一种方法是在一行中编写配方,因为该行中的所有命令都将传递给shell
的单个调用。
all:
iceking='$@'; echo $$iceking;