跳到正文
网络寻租
返回

scons介绍

什么是scons?

image scons不是上面的小甜饼, 而是一个基于python的自动化构建工具. 和make一个性质. 不过, 更高级一些.

为什么要用它呢?

安装

sudo apt-get install scons
eays_install scons

对了, 如果在windows下面, easy_install安装后有可能出现: import error: 找不到Scons.Script. 我研究了一下, 发现在scons放的位置不对, 只要搜索下把scons的目录放到dist-packages文件夹里面就好了.

一个简单的示例

我们直接去看一个示例吧, 目标是编译一个hello world c程序:

# 新建一个目录
rm t1 -rf; mkdir t1; cd t1

# 这里是我们的程序    
cat > hello.c <<EOF
#include <stdio.h>
int main(){
    printf("hello, world!\n");
    return 0;
}
EOF

# scons的脚本文件名称是SConstruct/Sconstruct/sconstruct, 如果直接执行scons, 会按照上面的顺序找文件. 和make类似.
cat > sconstruct <<EOF
# sconstruct其实就是一个python脚本, 支持所有python能做的事情.
BIN = 'hello'
# scons和其他构建工具一样, 是定义式的, 我们定义需要构建一个程序, 名称是BIN, 依赖hello.c
Program(BIN, ['hello.c'])
# 然后, 我们再定义一个执行的命令, 方便看结果. 它依赖BIN, 方法就是直接执行这个程序.
Command('run', BIN, './'+BIN)
EOF

# 最后, 我们调用scons来执行run的命令.    
scons run

这里是结果:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o hello.o -c hello.c
gcc -o hello hello.o
./hello
hello, world!
scons: done building targets.

scons会自动根据文件来调用对应的构建工具.

上面只是一个示例, 更多的最好去看 `scons官方文档`_. 文档有了我就不需要再写一遍了.

我自己整理的一些重点

我们可以构建:

批量获取源文件:

Program('hello', Glob('*.c'))

设置参数: LIBS, LIBPATH, CCFLAGS, CPPPATH

我们可以设置一个环境:

env = Environment(CC = 'gcc',
                  CCFLAGS = '-O2')
env.Program('hello.c')

可以设置判断是否修改的算法:

# 默认采用算MD5的方法判断文件是否修改
Decider('MD5')
# 可以设置传统的看timestamp是不是最新的方式
Decider('timestamp-newer'/make) #
# 也可以设置只要timestamp变了就算文件被修改了
Decider('timestamp-match')
# 混合: timestamp改变了, MD5也变了才算修改了
Decider('MD5-timestamp')

可以根据Enviroment设置Decider

缓存判断依赖关系

SetOption('implicit_cache', 1)

设置依赖关系

Depends(hello, 'otherfile')
Ignore(hello_obj, 'hello.h')

我最喜欢的, 执行自定义的命令:

Command('hello.o', 'hello.c',
        ['gcc $SOURCE -c',
         'wc -l $SOURCE >> summary'])

结论

看起来scons还是有点意思的, 我先用一段时间, 等有了一定的感觉之后再来看看.

资源


分享这篇文章:

上一篇
我的emacs配置
下一篇
简单python_宣告式编程

评论

评论通过 GitHub 账号发布,需要先使用 GitHub 登录。