软件构建工具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,如需转载请自行联系原作者


相关文章
|
1月前
|
Linux 编译器 C语言
快速上手makefile自动化构建工具
快速上手makefile自动化构建工具
|
2月前
|
存储 Unix Shell
【简化Cmake编译过程 】编写通用的bash脚本:简化和构建cmake高效自动化任务
【简化Cmake编译过程 】编写通用的bash脚本:简化和构建cmake高效自动化任务
49 0
|
2月前
|
算法 编译器 测试技术
跨平台构建的艺术:使用 CMake 实现项目移植的全面指南
跨平台构建的艺术:使用 CMake 实现项目移植的全面指南
85 5
|
2月前
|
缓存 编译器 测试技术
简化 CMake 多平台兼容性处理:高效开发的秘诀
简化 CMake 多平台兼容性处理:高效开发的秘诀
78 0
|
4月前
|
Linux iOS开发 MacOS
Python 自动化指南(繁琐工作自动化)第二版:附录 A:安装第三方模块
Python 自动化指南(繁琐工作自动化)第二版:附录 A:安装第三方模块
28 0
|
6月前
|
IDE Unix 编译器
深入理解CMake:优化构建过程,提升开发效率(上)
深入理解CMake:优化构建过程,提升开发效率
|
6月前
|
算法 定位技术 数据库
深入理解CMake:优化构建过程,提升开发效率(下)
深入理解CMake:优化构建过程,提升开发效率
|
12月前
|
存储 测试技术 C++
CMake构建指南:如何提高C/C++项目的可维护性
如果您是一位C/C++开发人员,那么您一定知道在编写和维护大型项目时所面临的挑战。这些项目通常包含大量的源代码、库和依赖项,需要耗费大量的时间和精力才能构建和维护。在这种情况下,使用自动化工具可以大大减轻您的负担,提高项目的可维护性。CMake就是这样一款工具,它可以自动化C/C++项目的构建过程,使其更加易于管理和维护
163 0
|
12月前
|
安全 编译器 测试技术
C/C++项目构建指南:如何使用Makefile提高开发效率
Makefile是一个常用的自动化构建工具,它可以为开发人员提供方便的项目构建方式。在C/C++项目中,Makefile可以用来编译、链接和生成可执行文件。使用Makefile的好处是可以自动执行一系列命令,从而减少手动操作的复杂性和出错的可能性。此外,Makefile还可以根据源代码的修改情况,自动更新目标文件,从而提高了构建的效率和准确性
119 0
|
12月前
|
存储 编译器 开发者
5个编写高效Makefile文件的最佳实践
在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动化构建、编译、测试和部署。然而,编写高效的Makefile文件并不是一件容易的事情。在本文中,我们将讨论如何编写高效的Makefile文件,以提高我们的开发效率和产品质量
118 0