• 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的设计原则

    正确,这一点从使用MD5作为文件更新检查算法就可见一斑。要知道make使用的是时间戳,在没有ntp服务器的情况下,很容易出现因本地时间与服务器不同步而导致的不正常build。

    高效,只能说在满足正确的前提下做到高效,毕竟python在性能上还是无法和make相比的,当然前者可以做的事情也更多。

    方便,因为已经设定了一些默认的基本的原则,所以只需要编写很少的代码就可以完成一个项目的build。这一点比make是要好。当然做一个通用的makefile模板也不是什么难事。

    1.安装SCons

    因为SCons基于python,所以首先要安装python,本人安装的是官方推荐的python 2.5.1。SCons可以在多种OS上运行,windows的版本可以在http://www.scons.org/download.php找到。

    2.hello world

    用C写一个hello world, 如下
    int main()
    {
        printf("Hello, world! ");
    }

    保存文件名为hello.c,想要用scons来build这个文件,只需要,
    a.在同一目录下,建立一个名为SConstruct的文件
    b.在该文件中加入一行,

    Program('hello.c')

    如果只是想compile objects,不做link,可以改为,
    Object('hello.c')

    c.在当前目录下执行scons
    % scons
    scons: Reading SConscript files ...
    scons: done reading SConscript files.
    scons: Building targets ...
    cc -o hello.o -c hello.c
    cc -o hello hello.o
    scons: done building targets.

    3.make clean
    makefile的忠实用户一般都会在makefile中加入clean,作用是删除已经产生的objects,可执行文件等,scons已经内置该功能,不需要额外添加代码,执行scons –c。
    % scons -c
    scons: Reading SConscript files ...
    scons: done reading SConscript files.
    scons: Cleaning targets ...
    Removed hello.o
    Removed hello
    scons: done cleaning targets.

    4. SConstruct和makefile

    SConstruct和makefile有着本质的不同,但又有着惊人的相似之处。不同的是SConstruct是一个典型的python脚本,具有一切python脚本的特性;相似的是,和makefile一样都是declarative型(非imperative型)脚本,也就是说Program, Object这些定义并不立即触发编译动作。

    5. build多个文件

    Program(['prog.c', 'file1.c', 'file2.c'])

    指定目标文件的名字为myprog,
    Program('myprog', ['prog.c', 'file1.c', 'file2.c'])

    注意编译多个文件和指定目标文件可能会有语义上的歧义,因此使用文件列表时要用中括号。

     下面列出一些常用的例子方便以后使用。

    编译每个.c文件为单独的程序 src=Split(""" foo.c bar.c """)
    for x in src:
            Program(x) 
    编译所有的.c文件为一个程序 Program('program', Glob('*.c'))
    使用环境变量
    • 例子1
    env = Environment(LINKFLAGS='-pthread -lm')
    env.Program("foo.c")

    • 例子2
    env = Environment(CCFLAGS='-g',LINKFLAGS='-pthread -lm')
    env.Program("foo.c")
    编译MPI程序
    • 例子1
    import os
    env = Environment(ENV =  { 'PATH' : os.environ[ 'PATH' ] }, CC = 'mpicc')
    env.Program("alltoallv.c")

    • 例子2
    env = Environment(CC = '/opt/mpich2/bin/mpicc')
    env.Program("alltoallv.c")

    参考资料:
    1. 用户手册,http://www.scons.org/doc/production/HTML/scons-user/index.html

    参考:http://andylin02.iteye.com/blog/849665

  • 相关阅读:
    P1439 【模板】最长公共子序列
    DP,入门???
    关于Eclipse在servlet中连接数据库时出现驱动加载失败的解决
    JSP学习(JavaBean)
    HTML随笔3
    CSS随笔3
    计算机网络随笔
    基本命令行操作1(java编译)
    Javascript随笔2(JQuery)
    Javascrip随笔1
  • 原文地址:https://www.cnblogs.com/youxin/p/5088391.html
Copyright © 2020-2023  润新知