Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191946
  • 博文数量: 26
  • 博客积分: 2031
  • 博客等级: 大尉
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-10 22:13
文章分类

全部博文(26)

文章存档

2015年(1)

2013年(1)

2012年(1)

2011年(1)

2010年(17)

2009年(5)

我的朋友

分类: C/C++

2010-02-27 23:29:08

(一)
 
在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) |
给主人留下些什么吧!~~