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))" ;
posted @ 2026-02-24 15:23  dewxin  阅读(3)  评论(0)    收藏  举报