SCons的使用

一、概述

scons是一个Python写的自动化构建工具,和GNU make相比优点明显:
    1、 移植性:python能运行的地方,就能运行scons

2、 扩展性:理论上scons只是提供了python的类,scons使用者可以在这个类的基础上做所有python能做的事情。比如想把一个已经使用
了Makefile大型工程切换到scons,就可以保留原来的Makefile,并用python解析Makefile中的编译选项、源/目标文件等,
作为参数传递给scons,完成编译。
    3、 智能:Scons继承了autoconf/automake的功能,自动解析系统的include路径、typedef等;“以全局的观点来看所有的依赖关系”

二、scons文件

scons中可能出现的文件:
        SConstruct,Sconstruct,sconstruct,SConscript

scons将在当前目录以下次序 SConstruct,Sconstruct,sconstruct 来搜索配置文件,从读取的第一个文件中读取相关配置。
    在配置文件SConstruct中可以使用函数SConscript()函数来定附属的配置文件。按惯例,这些附属配置文件被命名为”SConscript”,当然也可以使用任意其它名字。

三、scons的命令行参数
    scons: 执行SConstruct中脚本
    scons -c   clean
    scons -Q  只显示编译信息,去除多余的打印信息
    scons -Q   --implicit-cache hello 保存依赖关系
                   --implicit-deps-changed   强制更新依赖关系
                   --implicit-deps-unchanged  强制使用原先的依赖关系,即使已经改变

四、SConstruct提供的方法

1、Program:生成可执行文件

Program(‘hello.c‘)  编译hello.c可执行文件,根据系统自动生成(hello.exe on Windows; hello on POSIX)
    Program(‘hello‘,‘hello.c‘) 指定Output文件名(hello.exe on Windows; hello on POSIX)
    Program([‘hello.c‘, ‘file1.c‘, ‘file2.c‘]) 编译多个文件,Output文件名以第一个文件命名
    Program(source = "hello.c",target = "hello")
    Program(target = "hello" , source = "hello.c")
    Program(‘hello‘, Split(‘hello.c file1.c file2.c‘)) 编译多个文件

Program(Glob("*.c"))
    src = ["hello.c","foo.c"];Program(src)
 
2、Object:生成目标文件

Object(‘hello.c‘) 编译hello.c目标文件,根据系统自动生成(hello.obj on Windows; hello.o on POSIX)
 
3、Library:生成静态/动态库文件

Library(‘foo‘, [‘f1.c‘, ‘f2.c‘, ‘f3.c‘]) 编译library
    SharedLibrary(‘foo‘, [‘f1.c‘, ‘f2.c‘, ‘f3.c‘]) 编译 shared library
    StaticLibrary(‘bar‘, [‘f4.c‘, ‘f5.c‘, ‘f6.c‘]) 编译 static library

库的使用:

Program(‘prog.c‘, LIBS=[‘foo‘, ‘bar‘], LIBPATH=‘.‘) 连接库,不需加后缀或是前缀

4、SourceSignatures:判断源文件是否修改
    SourceSignatures(‘MD5‘)     根据内容是否改变,默认方式
    SourceSignatures(‘timestamp‘) 根据修改时间

5、TargetSignatures:判断目标文件是否改变
    TargetSignatures(‘build‘)   根据编译结果
    TargetSignatures(‘content‘)  根据文件内容,如果只是加了句注释,将不会被重新编译
 
6、Ignore:忽略依赖关系

Ignore(hello, ‘hello.h‘)  忽略某个依赖关系

7、Depends:明确依赖关系

Depends(hello, ‘other_file‘) 明确依赖关系

8、SConscript:scons的配置文件。

源文件的目录结构如下:
    src:
    |    SConstruct
    |    test.cpp
    |    mA(目录):
         |     SConscript
         |     func.cpp
    其中test.cpp为主文件,中调用func.cpp中定义的函数
 
    SConstruct内容如下:

<textarea cols="57" rows="1" name="code" class="cpp"> subobj = SConscript([‘mA/SConscript‘])
obj = subobj + Object(Glob("*.cpp"))
Program("test",list(obj))
</textarea>  
    SConscript内容 :
        <textarea cols="57" rows="1" name="code" class="cpp"> obj = Object(Glob("*.cpp"))
Return("obj")
</textarea>    
    上例中,在主目录中执行
scons就可以编译整个"工程"。SConstruct编译主目录中的test.cpp,并通过SConscript编译mA目录下的源文件,并最终生
成可执行文件;SConscript用于编译mA中的func.cpp并把生成的func.o传递给主目录的SConstruct。

10.env:环境变量
     环境变量用于设置在编译过程中的各种参数,可以用下面的SConstruct打印环境变量的所有信息(实际上env就是一个python字典)
     可以使用如下的SConstruct查看环境变量的内容:
       <textarea cols="73" rows="6" name="code" class="cpp">env = Environment()
dict = env.Dictionary()
keys = dict.keys()
keys.sort()
for key in keys:
print "construction variable = ‘%s‘, value = ‘%s‘" % (key, dict[key])
</textarea>      
     环境变量的使用:
         env = Environment()   #创建默认的环境变量,默认scons会按编译器的默认选项来进行编译
         import os
         env = Environment(CC = ‘gcc‘,CCFLAGS = ‘-O2‘) #创建并设置环境 变量
         env.Program(‘foo.c‘)

环境变量的复制:
         env = Environment(CC = ‘gcc‘)
         opt = env.Clone(CCFLAGS = ‘-O2‘)
         dbg = env.Clone(CCFLAGS = ‘-g‘)

环境变量的替换:
         env = Environment(CCFLAGS = ‘-DDEFINE1‘)
         env.Replace(CCFLAGS = ‘-DDEFINE2‘)
         env.Program(‘foo.c‘) 
     环境变量的输入输出:用于统一多目录源文件的编译选项,如:
     src:
     |    SConstruct
     |    libstlport.a
     |    test.cpp
     |     include(目录):
          |    foo.h
     |    mA(目录):
          |    SConscript
          |    func.cpp

test.cpp和mA/func.cpp都引用了include/foo.h,test.cpp调用了mA/func.cpp的功能函数,其中include/foo.h中定义了一个包含string类型的类。

SConstruct如下:
       <textarea cols="72" rows="4" name="code" class="cpp">env = Environment()
flags = env.ParseFlags([‘-pthread -I/usr/include/stlport ‘,‘ -L .‘])
env.MergeFlags(class_flags)
subobj = SConscript([‘mA/SConscript‘])
obj = subobj + env.Object(Glob("*.cpp"))
env.Program("test",list(obj),LIBS = [‘libstlport.a‘])

</textarea>

mA/SConscrip如下:
       <textarea cols="73" rows="1" name="code" class="cpp">obj = Object(Glob("*.cpp"))
Return("obj")
</textarea>

不出意外的话上边的工程编译可以通过,但是运行的时候会Aborted。因为test.cpp,mA/func.cpp都使用了包含string类型的那
个类,但是由于编译环境的不同,test.cpp认为string变量的大小是24字节,
mA/func.cpp认为string变量的大小是4个字节(libstlport.a捣的鬼)。

解决问题的办法就是环境变量输出,修改SConstruct和mA/SConscript如下:
    SConstruct:
       <textarea cols="72" rows="5" name="code" class="cpp">env = Environment()
flags = env.ParseFlags([‘-pthread -I/usr/include/stlport ‘,‘ -L .‘])
env.MergeFlags(class_flags)
Export(‘env‘)
subobj = SConscript([‘mA/SConscript‘],exports = ‘env‘)
obj = subobj + env.Object(Glob("*.cpp"))
env.Program("test",list(obj),LIBS = [‘libstlport.a‘])

</textarea> 
    mA/SConscript:
       <textarea cols="73" rows="2" name="code" class="cpp">Import(‘env‘)
obj = env.Object(Glob("*.cpp"))
Return("obj")</textarea>

from:http://blog.csdn.net/sealyao/article/details/6402257

时间: 2024-10-31 01:12:12

SCons的使用的相关文章

eclipse 使用 scons 编译的配置说明

eclipse版本: eclipse-cpp-kepler-SR1-win32.zip 创建项目必须选择“Makefile Project” 然后进入“Projects  Properities” 先创建一个变量 配置成 “scons.bat” apply 检查 Environment 中的 PATH,是否能找到scons.bat 在 C/C++ Build 中点击 Variables 选择 刚才设定的 scons 检查 Build Directory 中是否有 SConstruct 文件,并进

scons 实用说明(一)

还在为写一个makefile发愁吗?还在为难记的make参数而苦恼吗?有了scons一切都边的简单了.最近研究了下scons,发现和makefile相比,soncs编译c和c++程序真的太方便了.搞程序什么做好,当然是简单实用最好下面大家就一起感受下简单的scons吧. 1.使用scons编译程序 在程序目录下执行命令如下:(前提是你已经安装scons了哟)     scons                   噢,噢,这个好像没啥简单的哈,和make差不多嘛.是吗?那就继续瞧好吧您 2.清空

将SCONS工具集成到Python代码中

SCONS是Python的自动智能结构化编译工具,将来或许能代替Make. 在Windows或者Linux下,SConstruct文件相当于MakeFile,使用SCONS编译,需输入scons.bat(scons),后面带上编译选项options(如SConstruct所在的路径).观察scons.bat这个脚本,可以在其他Python代码中,将SCONS工具当作一个函数来调用.这个函数就是Scons.Script.main(),这个main函数将解析命令行中的编译选项,通过sys.argv[

linux自动化构建工具-scons指南

1.scons是linux下的自动构建工具 scons是用Python编写的,使用scons之前需确认是否已经安装了Python.(在系统的命令行中运行python -V或python --version). 2.安装过程如下 wget http://prdownloads.sourceforge.net/scons/scons-2.2.0.tar.gz . tar zxvf scons-2.2.0.tar.gz cd scons-2.2.0 python setup.py install 3.

Meme游戏服务器开发日记(四)scons编译工具、C和C++混合使用

今天在编译python so时出现点问题--把其他C库链接到同一个so里--尝试了一早上发现了方法,已经更新到本系列的第二节里了. 整理了一下工程目录,打算用scons管理. scons毕竟是一种新型的build工具,比makefile肯定有很大进步,至少更清晰好学,少了很多晕晕的trick.但是相比其他高级工具比如cmake之类的,就不清楚优劣了. 这个例子写的过于简单了,正常使用时多用env,可以统一参数,简化编写. 例子: obj = Object( "test.c", CPPP

scons

[scons] 安装scons.在根目录下运行. SCons will work with any 2.x version of Python from 2.7 on; 3.0 and later are not yet supported. If you need to install Python and have a choice, we recommend using the most recent 2.x Python version available. scons会被安装在下面这个

去除scons构建动态库的前缀lib

如何使用scons构建工程,请参考快速构建C++项目工具Scons,结合Editplus搭建开发环境. 编译SharedLibrary项目的时候,生产的so文件时自动加上lib, 例如: env = Environment() env.SharedLibrary('hello', sources=['hello.c']) 将以上保存成build.py, 执行编译命令 scons -f build.py 生成动态库so的文件名 libhello.so.这样做的好处,自然不用多说.这种lib前缀并不

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

最近在为团队搭建统一的软件构建环境,目的是用scons为十几个软件模块提供统一的编译框架和命令,支持生成release/debug不同版本的可执行文件,同时支持不同的调试级别. 1.整体结构和实施过程 a.约定好不同模块在统一的代码库中的相对位置 因为软件模块之间可能存在库依赖.头文件依赖等关系,固定的相对路径能够使得模块中包含其他模块头文件或者库的脚本语句固定下来: b.为每个新增加模块写sconscript脚本,在里面利用scons.python语句实现软件构建.部署和清除: c.如果子模块

SCONS如何集成工具

SCons中,windows下调用env.Program("hello.c"),就可以调用cl和link等工具,自动完成编译链接:使用env.Jar(target='hello.jar',source=['hello.java']),把文件用Jar工具压缩...为了搞清如何集成这些工具,查看了一下源代码.    SCons的模块文件一般安装在Python的Lib\site-packages\scons-2.3.2\SCons下,以下都是以该路径为当前路径.    在Script\__i

scons安装和使用

1. scons是神马? scons是linux下的自动构建工具,类似cmake. 2. 安装 wget http://prdownloads.sourceforge.net/scons/scons-2.2.0.tar.gz tar zxvf scons-2.2.0.tar.gz cd scons-2.2.0 python setup.py install 正常情况下,scons将安装到${PYTHON_INSTALL_DIR}/bin/下 3. hello world程序 三个文件hello.