Jam 陷阱
Jam 语法陷阱
Jam的Variable作用域是全局的
Jam的Variable 作用域一直都是全局的, 即使是local的 变量,它也是存储在全局Variable表中的。只是它在定义local变量的时候,会将全局表中的原来的变量名的变量给置换出来,作用域结束的时候,再将原来的变量给置换回去。
因此当一个ruleA调用另一个ruleB的时候, 因为ruleA还没结束,ruleB里面其实是能访问ruleA的变量的。
$取值失败会导致整个sentence取消执行
里面有个很奇怪的地方。
对于下面的 jam脚本
on $(_obj) hdrs += $(HDRS.$(ALL_TYPES)) ;
如果我们想要打印$(HDRS.$(ALL_TYPES))的值,如果这个变量不存在,那么是无法打印的。。
我们可以将这个问题提取出来。对于下面的jam脚本,执行后,我们可以看到 Var1.VarSub is VarSub。
$(Var1.$(VarSub)) 首先会展开内侧的$(VarSub), => $(Var1.Var1)
$(Var1.Var1) 会再次尝试展开Var1.Var1这个变量 => VarSub
但是如果注释掉Var1.Var1 = ...这一行,那么 echo "Var1.VarSub is ..."这一行不会有任何输出。。
VarSub = "Var1" ;
Var1.Var1 = "VarSub" ;
#Var1.Var1 = "VarSub" ; 如果上面一行像这样注释掉
echo "Var1.VarSub is $(Var1.$(VarSub))" ;

浙公网安备 33010602011771号