如何在bjam Jamfile中获取构建类型/变体及输出feature?
优化BJam中获取构建动作/Variant的方法
执行
bjam debug、bjam release或bjam clean等命令时,希望在BJam脚本中获取debug、release、clean这类构建动作或类型。目前通过检查ARGV参数实现了功能,但想了解更优方法。已知debug、release是variant feature的简写,尝试echo $(<variant>)失败,询问如何正确使用或输出variant feature。现有实现代码如下:
import modules ; tbuildcmd = "" ; if clean in [ modules.peek : ARGV ] { tbuildcmd = clean ; } else if release in [ modules.peek : ARGV ] { tbuildcmd = release ; } else if debug in [ modules.peek : ARGV ] { tbuildcmd = debug ; } echo "tbuildcmd $(tbuildcmd)" ;
优化思路与实现
1. 正确获取Variant(debug/release)的值
Variant是BJam的原生feature,不能直接用$(<variant>)获取,得用feature.get命令来获取当前生效的variant值:
# 获取当前激活的variant current_variant = [ feature.get variant ] ;
用户输入的debug/release是variant的简写,feature.get会返回对应的完整变体名称,哪怕是自定义的变体(比如profile)也能正确识别。
2. 处理Clean动作
Clean是BJam的构建动作,不属于variant范畴,得单独判断。直接检查ARGV里是否包含clean即可:
# 检查是否在执行clean动作 if clean in [ modules.peek : ARGV ]
3. 整合后的完整优化脚本
import modules ; import feature ; tbuildcmd = "" ; # 先判断是否是clean动作 if clean in [ modules.peek : ARGV ] { tbuildcmd = clean ; } else { # 获取当前生效的构建变体 current_variant = [ feature.get variant ] ; if $(current_variant) { tbuildcmd = $(current_variant) ; } } echo "tbuildcmd $(tbuildcmd)" ;
优势说明
- 对于variant部分,用BJam原生API获取,不用硬编码判断ARGV值,支持自定义变体,扩展性更强
- 明确区分了构建动作(clean)和构建变体(debug/release)的不同处理逻辑
- 代码更简洁,减少冗余判断,符合BJam的使用规范
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

