开源的软件构件利器——SCons

(一)

 

在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()

 

 

 

SCons User Guide 1.2.0  :

 

http://www.scons.org/doc/HTML/scons-user/book1.html

 

 

原文地址 http://cplus.abang.com/od/cprogram/a/sconsintroduct1.htm

你可能感兴趣的:(软件构建)