(一)
在unix/linux环境下用c/c++语言开发大中型项目时,你是否为写复杂的Makefile来编译、打包你的unix/linux c/c++程序,还需要对上万行、几十万代码进行开发和维护感到苦恼不已。”工欲善其事,必先利其器”,这里我将向大家介绍一种开源的软件构件利器——SCons
SCons是下一代的软件构件工具,它跨平台,功能类似autoconf/automake, 它能帮助你更方便,更可靠,更快速的构建软件,下面将重点来介绍一下SCons,及如何SCons。
SCons通过决定哪个具体的模块必须被rebuild,并执行相关的命令来进行rebuild。默认情况下,SCons将在当前目录以以下次序(SConstruct,Sconstruct,sconstruct)来搜索配置文件,从读取的第一个文件中读取相关配置。我们可以通过-f选项来指定替代的配置文件,具体方法如下:
scons –f configfilename
在配置文件需要指定build哪些目标文件,也可以指定build这些目标的规则,对于大多数项目,我们仅仅需要指定目标和输入文件。
在配置文件SConstruct中可以使用函数SConscript()函数来定附属的配置文件。按惯例,这些附属配置文件被命名为”SConscript”,当然也可以使用任意其它名字。
Scons中的配置文件SConscript由python脚本编写,所以我们能使用python脚本的灵活性来处理复杂的build。Scons在读取和执行所有SConscript文件之后,才对目标进行构建,具体流程,我们可以看一下示例:
$ scons foo.out
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cp foo.in foo.out
scons: done building targets.
(二)
本章重点介绍Scons中的一个重要概念——Enviroment(环境):Scons需要在一个特定的Enviroment(环境)中来构建软件,环境中定义了一些构建软件过程中需要的变量和变量的值。但scons不会自动复制构建目标文件的外部环境,以保证无论何时调用scons,构建的结果不会出现差异。无论何时创建enviroment,你可以通过以下步骤从外部环境中复制环境变量PATH的值到创建的enviroment
import os
env = Environment(ENV = {’PATH’ : os.environ[’PATH’]})
相似的,可以复制诸如$PATH,$HOME,$JAVA_HOME,$LANG,$SHELL,$TERM等环境变量的值到创建的enviroment
import os
env = Environment(ENV = {’PATH’ : os.environ[’PATH’],
’HOME’:os.environ[’HOME’]})
或者你可以复制完整的一个外部enviroment:
import os
env = Environment(ENV = os.environ)
如果如上完全拷贝外部环境,我们必须保证外部环境中的环境变量被正确的设置。
(三)
Scons默认从包含Sconstruct文件的根目录开始执行,也可以在命令行参数中指定需要build的目标文件
使用命令”scons”将会build当前目录下的所有的目标文件。如果在命令行中没有指定需要build的目标,我们需要使用函数Default()来显示的指定默认目标。
即使在SConscript file中使用Default指定build目标,我们也可以在命令行中显示的指定当前目录(.),来build所有当前目录下的所有目标,具体命令格式如下
scons .
如果想build当前目录以外的任何文件,可以使用绝对路径来指定build目录,具体格式如下
scons /dir/
在windows下也可以使用盘符,具体如下:
scons c:\ d:\
为了build特定的目标,我们可以用指定目标为命令行参数,具体如下:
scons foo bar
如果想清除build过程中产生的中间文件和目标文件,可以使用以下命令进行清除
scons –c .
(四)
如果想build项目代码树的一个子集,一个目录,只需要指定项目根目录和需要build的子目录,就能对项目的一个子目录进行build,具体如下:
scons src/subdir
如果想在项目的子目录进行构建该目录,调用scons时-u选项,scons将会沿着目录层次关系向上遍历,直到找到SConstruct文件,然后build与当前子目录相关的目标:
cd src/subdir
scons –u .
scons支持并行build多个目标通过使用-j选项:
scons –j 4
如上例,同时build4个目标。
scons可以通过以下方式来传递变量及其值:
scons debug = 1
在SConscript文件中可以通过ARGUMENTS字典来读取和修改:
if ARGUMENTS.get(’debug’, 0):
env = Environment(CCFLAGS = ’-g’)
else:
env = Environment()
:
阅读(6908) | 评论(0) | 转发(0) |