1.概述

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

2.scons文件

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

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

3.scons的命令行参数

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

4.SConstruct提供的方法

4.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)

4.2 Object:生成目标文件

     Object('hello.c')                         //编译hello.c目标文件,根据系统自动生成(hello.obj on Windows; hello.o on POSIX)

4.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.4 SourceSignatures:判断源文件是否修改

     SourceSignatures('MD5')                       //根据内容是否改变,默认方式
SourceSignatures('timestamp')                  //根据修改时间

4.5 TargetSignatures:判断目标文件是否改变

     TargetSignatures('build')                     //根据编译结果
TargetSignatures('content')                   //根据文件内容,如果只是加了句注释,将不会被重新编译

4.6 Ignore:忽略依赖关系

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

4.7 Depends:明确依赖关系

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

4.8 SConscript:scons的配置文件

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

 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'])

mA/SConscrip如下:

 obj = Object(Glob("*.cpp"))
Return("obj")

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

解决问题的办法就是环境变量输出,修改SConstruct和mA/SConscript如下:
    SConstruct:

 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'])

mA/SConscript:

 Import('env')
obj = env.Object(Glob("*.cpp"))
Return("obj")

scons使用的更多相关文章

  1. (转)使用 SCons 轻松建造程序

    在软件项目开发过程中,make 工具通常被用来建造程序.make 工具通过一个被称为 Makefile 的配置文件可以自动的检测文件之间的依赖关系,这对于建造复杂的项目非常有帮助,然而,编写 Make ...

  2. Protobuf - 使用scons编译proto文件

    使用protobuf过程中,需要先对消息结构进行定义,文件以.proto格式结尾.然后要使用google提供的protoc命令行,把.proto文件转成对应的代码文件. protoc --proto_ ...

  3. SCons - 简单而强大的项目编译脚本

    N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了.makefile确实编写复杂,而且平时也不是经常使用,容易忘记.偶识了scons,一切都变的简单了.最近研究了下scon ...

  4. scons学习

    http://blog.csdn.net/andyelvis/article/category/948141 http://www.scons.org/doc/production/HTML/scon ...

  5. linux 安装scons

     scons是一个Python写的自动化构建工具,需要安装python和scons后才能运行,能够跨平台.其集成功能类似于autoconf/automake ,是一个简洁可靠的工具.现在很多系统都自带 ...

  6. scons用户指南翻译(附gcc/g++参数详解)

    scons用户指南 翻译 http://blog.csdn.net/andyelvis/article/category/948141 官网文档 http://www.scons.org/docume ...

  7. eclipse scons 使用指南

    http://sconsolidator.com/projects/sconsolidator/wiki/Getting_Started Add SCons support to an existin ...

  8. eclipse 安装scons

    http://www.sconsolidator.com/update  Installation To use SConsolidator, you first have to install SC ...

  9. 终于用scons创建了一个MDK工程

    这几天我在学着怎么使用RT-Thread.起初只想用一下里面的RTGUI,却一直没成功,功力实在不行啊. RT-Thread用了scons来创建工程,似乎还能编译,还有很多可配置项,很是方便.于是我想 ...

随机推荐

  1. 004_URL 路由 - URL 路由

    在Web Form 情况下,每一个 ASPX页面既是一个文件,又是一个队请求自包含的响应.而在 MVC 情况下,请求是由控制器类中的动作方法处理的,而且与硬盘上的文件没有一对一的相互关系. ASP.N ...

  2. asp.net.mvc4在vs2010怎样创建mvc项目及它的结构

    1.打开vs2012,创建mvc项目 文件-->新建--> 项目--> web--> asp.net.Mvc 4web应用程序-->基本模板

  3. 重新想象 Windows 8 Store Apps (38) - 契约: Search Contract

    [源码下载] 重新想象 Windows 8 Store Apps (38) - 契约: Search Contract 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 ...

  4. Debian GNU/kFreeBSD是什么

    Debian GNU/kFreeBSD 是由使用GNU C语言库的GNU成员组成的基于FreeBSD内核.外加完整的Debian 软件包集合的操作系统. 它来自Debian社区,所以本质上,我们还是应 ...

  5. JPA学习(2)注解

    上一篇学习了JPA的helloworld,也初略的使用了一些注解,接下来就细细的了解一下有哪些注解,和这些注解的作用 JPA的基本注解: ①@Entity,@Table,@Id,@GeneratedV ...

  6. C# on Visual Studio Code

    installation Download .NET Core SDK installer and install it. https://www.microsoft.com/net/download ...

  7. Ogre2.1 灯光与阴影

    Ogre2.1大量光源渲染 Ogre2.1不是采用现在大部分引擎所用的延迟渲染,而是采用一种前向渲染的改进技术,理论基本来自于Forward+,见如下. http://www.klayge.org/? ...

  8. Eclipse 出现Some sites could not be found. See the error log for more detail.错误 解决方法

    Eclipse 出现Some sites could not be found.  See the error log for more detail.错误 解决方法 Some sites could ...

  9. java微信开发(wechat4j)——wechat4j配置文件解读

    wechat4j的配置文件是wechat4j.properties.需要放置在项目src目录下.在wechat4j.jar中的META-INF下有一个wechat4j.properties.sampl ...

  10. .net aes加密视频等文件

    公司学习平台在app端下载下来的视频需要加密 随查找资料参考一些写法 写了aes的加密方法 记录防止忘记 using System; using System.Collections.Generic; ...