软件构建工具Scons在大型项目中的几点总结

简介:

最近在为团队搭建统一的软件构建环境,目的是用scons为十几个软件模块提供统一的编译框架和命令,支持生成release/debug不同版本的可执行文件,同时支持不同的调试级别。


1.整体结构和实施过程


a.约定好不同模块在统一的代码库中的相对位置

因为软件模块之间可能存在库依赖、头文件依赖等关系,固定的相对路径能够使得模块中包含其他模块头文件或者库的脚本语句固定下来;


b.为每个新增加模块写sconscript脚本,在里面利用scons、python语句实现软件构建、部署和清除;


c.如果子模块里,有scons支持的类似rpcgen工具自动生成生成的代码,在对应的sconscript里面定义好对应的环境变量,比如rpcgen对应的$RPCGEN, $RPCGENCLIENTFLAGS, $RPCGENFLAGS, $RPCGENHEADERFLAGS, $RPCGENSERVICEFLAGS, $RPCGENXDRFLAGS;


c.如果子模块里,有scons不支持的类似thrift工具自动生成生成的代码,在对应的sconscript里面可以通过python os.system()/os.popen()/commands.getoutputstatus()里调用“thrift”命令实现;


d.在代码库的最顶层,根据约定的参数定义,实现全局的CCFLAGS、CCPDEFINES、LIBS、CPPPATH、LIBPATH的定义;


e.在代码库的最顶层,实现SConstruct脚本,里面利用相对路径引用各个子模块的SConscript脚本;


2.利用子模块已有的软件构建框架和脚本

如果子模块已经有现成的SConstruct,针对不同情况,有两种处理方式:

a.如果子模块的sconsript脚本的时候既可以从子模块调用,也可以从代码库的最顶层调用,那么可以从最顶层直接引用子模块的sconscript。

b.如果子模块的sconsript脚本的时候只能从子模块调用,那么可以从最顶层通过python os.system()/os.popen()等函数通过'cd subdir && scons'来引用子模块的sconstruct。


3.保证一致的的编译选项和配置能够传递到每个子模块

为了保证子模块能继承最顶层模块的环境变量设置,最顶层模块定义的CCFLAGS/CPPPATH/CCPDEFINES/LIBPATH等环境设置必需export出来,而在子模块中需要Import()出来。


如果最顶层脚本只能通过python os.system()/os.popen()等函数用'cd subdir && scons'来引用子模块的sconstruct,那么还需要保证顶层的参数能够传递到子模块当中去,而且子模块对参数的处理和最顶层一致。


4.注意事项

在多个模块的编译过程当中,需要特别注意的就是厘清各个模块之间的依赖关系,搞清楚哪些模块必须在哪个模块之前先编译,然后在scons脚本当中保证这个依赖关系。通过有两种方式可以达到这个目的:

1.利用scons PreAction/Requires等函数限定编译先后顺序;

2.编译那些需要跳转到子目录然后调用子目录的sconstruct脚本的模块,务必保证这个模块所依赖的库都已经生成。在这里,需要特别引起注意但是:如果SConstruct脚本当中里面有除了scons之外的其他python语句,scons解释程序会优先执行完所有非scons的python语句,最后才执行scons语句来引用子模块的sconscript。

















本文转自存储之厨51CTO博客,原文链接: http://blog.51cto.com/xiamachao/1867453,如需转载请自行联系原作者


相关文章
|
7月前
|
缓存 前端开发 测试技术
(译)Python 官方团队在打包项目中踩过的坑
(译)Python 官方团队在打包项目中踩过的坑
80 2
|
6月前
|
C语言 开发者
Makefile 简介:自动化你的构建过程
一旦`Makefile`被正确设置,你只需要在命令行中运行命令`make`,它会查找当前目录下的`Makefile`文件,并执行其中定义的规则来构建目标。`make`命令非常智能,它会检查文件的时间戳,只重新编译那些自上次编译后有改动的文件。 总之,`Makefile`是开发者的强大工具,能够大幅提升软件开发的效率和准确性。通过学习和使用`Makefile`,你可以更有效地管理项目构建过程,使其自动化、高效且可靠。
48 1
|
4月前
|
jenkins 持续交付
jenkins学习笔记之六:共享库方式集成构建工具
jenkins学习笔记之六:共享库方式集成构建工具
|
5月前
|
Rust 测试技术 编译器
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
|
5月前
|
资源调度 前端开发 JavaScript
如何用 Bower 管理前端资源:提升开发效率与项目维护性
【7月更文挑战第2天】**Bower**是基于Node.js的前端包管理器,用于高效管理JavaScript库、CSS和HTML模板等资源。通过安装、配置、搜索、安装、更新及卸载组件,它帮助开发者保持依赖的一致性,提升开发效率。配置`.bowerrc`设定安装目录,`bower.json`记录依赖。遵循最佳实践,如定期更新、锁定版本和清理无用组件,能增强项目维护性。尽管有新工具出现,掌握Bower仍是前端开发基础。
177 0
|
7月前
|
Linux 编译器 C语言
快速上手makefile自动化构建工具
快速上手makefile自动化构建工具
|
7月前
|
存储 Unix Shell
【简化Cmake编译过程 】编写通用的bash脚本:简化和构建cmake高效自动化任务
【简化Cmake编译过程 】编写通用的bash脚本:简化和构建cmake高效自动化任务
243 0
|
7月前
|
Linux iOS开发 MacOS
Python 自动化指南(繁琐工作自动化)第二版:附录 A:安装第三方模块
Python 自动化指南(繁琐工作自动化)第二版:附录 A:安装第三方模块
66 0
|
7月前
|
缓存 编译器 Go
Build实战指南:优雅编译,高效开发
Build实战指南:优雅编译,高效开发
133 0
|
IDE Unix 编译器
深入理解CMake:优化构建过程,提升开发效率(上)
深入理解CMake:优化构建过程,提升开发效率
下一篇
DataWorks