本帖最后由 reille 于 2012-12-31 22:37 编辑
$(eval)调用:
当make扫描makefile时,如果发现包含$(eval)的语句,会实时展开eval的参数,然后将展开的结果字符串插入到脚本当前位置,作为脚本还没扫描的一部分继续扫描。下面是一段测试脚本:
Name = a1
Step1 := $(Name) $(eval Name=a2)
Step2 := $(Name) Name = a3
Step3 := $(Name) all: echo $(Name)
echo $(Step1)
echo $(Step2)
echo $(Step3)
然后来分析(注意这里的措辞):第1行在数据库中添加Name="a1";第2行添加Step1="a1"(进行过一次实时展开);第3行等价于脚本Name=a2,因此是修改数据库,将Name的字面值从"a1"改为"a2";第4行实时展开后记录Step2="a2";第5行修改Name为"a3";第6行记录Step3="a3"。最后运行make打印"a3 a1 a2 a3"(这里的空格实际是换行)。
|