在Makefile中定义变量

时间:2014-05-28 05:49:45

标签: makefile

Makefile编写如下:

all:
        iceking='$@';
        echo $$iceking;

然而输出如下:

[root@localhost test]# make
iceking='all';
echo $iceking;

字符串'all'不输出。为什么呢?

1 个答案:

答案 0 :(得分:4)

配方的每一行的新子shell。

来自GNU make manual:

  

当需要执行配方来更新目标时,它们就是   通过为配方的每一行调用一个新的子shell来执行...

由makefile调用的shell命令集等同于:

bash -c iceking='all';
bash -c echo $iceking;

无法从iceking的第二次调用环境访问变量bash。这就是你收到空输出的原因。

.ONESHELL(仅限GNU制作3.82)

解决此问题的一种方法是使用.ONESHELL特殊目标。来自GNU make manual:

  

如果.ONESHELL特殊目标出现在makefile中的任何位置   每个目标的所有配方行将提供给一个   调用shell。

.ONESHELL存在一个问题,此功能仅在GNU make版本3.82之后添加。

一行食谱。

修复它的另一种方法是在一行中编写配方,因为该行中的所有命令都将传递给shell的单个调用。

all:
    iceking='$@'; echo $$iceking;