如何让bjam在主项目构建时正确编译子目录projects/qtclient?
解决Wallix/Redemption项目中QtClient子项目集成编译与打包问题
问题分析
根目录执行bjam projects/qtclient/报错"ERROR: rule 'setvar' unknown",核心原因是子项目的Jamfile依赖的setvar规则仅在子目录上下文加载(比如子目录Jamfile自行定义了该规则,或引用了本地Jam模块),根目录直接调用时未初始化这些依赖。而子目录单独执行bjam qtclient能成功,是因为子目录的Jamfile会自动加载本地依赖环境。
可行解决方案
方案1:通过build-project正确集成(优先推荐)
在根目录的Jamfile中添加以下指令,确保子项目的依赖上下文被正确加载:
# 先添加子项目的模块搜索路径,确保setvar等规则能被根目录bjam找到 SEARCH += projects/qtclient ; # 引入子项目构建逻辑 build-project projects/qtclient ;
完成配置后,执行根目录的bjam exe libs,会自动触发QtClient子项目的构建流程。
如果子项目有独立的Jamroot文件,需确保该文件内的依赖引用为相对路径,或在根目录Jamfile中补充对应的搜索路径。
方案2:通过自定义动作触发子目录构建
如果build-project仍无法解决上下文依赖问题,可在根目录Jamfile中定义自定义构建动作,显式切换到子目录执行构建:
# 定义自定义动作,切换到子目录执行QtClient构建 actions build_qtclient { cd projects/qtclient && bjam qtclient } # 将该动作关联到主项目的exe别名,确保主构建流程触发子项目构建 alias exe : : @build_qtclient ;
执行bjam exe libs时,会自动执行子目录的构建命令。
方案3:确保打包时包含可执行文件
修改tools/packager.py的打包配置,将QtClient的可执行文件添加到deb包的文件列表中:
- 找到打包配置中定义文件安装路径的部分,添加类似配置(根据实际构建路径调整源文件路径):
packager.add_file( source="projects/qtclient/build/qtclient", dest="/usr/bin/qtclient", permissions=0o755 )
确保构建后的QtClient可执行文件路径与配置中的source路径完全匹配。
调试验证步骤
- 执行
bjam exe libs后,检查projects/qtclient目录下是否生成了目标可执行文件; - 手动运行
tools/packager.py,查看生成的deb包内容,确认/usr/bin/qtclient已被包含; - 若仍报错,检查子项目Jamfile中
setvar规则的定义位置,确保根目录Jamfile能通过SEARCH路径找到对应的Jam模块。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

