什么是scons?
scons不是上面的小甜饼, 而是一个基于python的自动化构建工具.
和make一个性质. 不过, 更高级一些.
为什么要用它呢?
高阶的make工具
make是不错, 但是太过简单了, 很多东西都要重复写, 很多事情都做不了..
我们需要一个更高级的工具.
python
既然我们要用更高级的工具, 去找找看: automake, cmake, qmake, ant..
已经有一堆东西了, 我们选择哪一个呢?
按照我的看法, 对于任何复杂的工具, 本质上来说,
都需要一个足够强大的编程语言来支持, 以便实现自动化和高可配置性.
既然python已经成为我的”main stream”语言, 当然要看支持python的工具了.
google python + make, 第一个结果就是scons了. 当然, 还有很多其他的
pyghon构建工具
可以选择.
安装
sudo apt-get install scons
- 或者直接在安装了python的环境里面easy_install:
eays_install scons
对了, 如果在windows下面, easy_install安装后有可能出现: import error:
找不到Scons.Script. 我研究了一下, 发现在scons放的位置不对,
只要搜索下把scons的目录放到dist-packages文件夹里面就好了.
一个简单的示例
我们直接去看一个示例吧, 目标是编译一个hello world c程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| # 新建一个目录
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
|
这里是结果:
1
2
3
4
5
6
7
8
| 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
- Object
- Library
- SharedLibrary
批量获取源文件:
1
| Program('hello', Glob('*.c'))
|
设置参数: LIBS, LIBPATH, CCFLAGS, CPPPATH
我们可以设置一个环境:
1
2
3
| env = Environment(CC = 'gcc',
CCFLAGS = '-O2')
env.Program('hello.c')
|
可以设置判断是否修改的算法:
1
2
3
4
5
6
7
8
| # 默认采用算MD5的方法判断文件是否修改
Decider('MD5')
# 可以设置传统的看timestamp是不是最新的方式
Decider('timestamp-newer'/make) #
# 也可以设置只要timestamp变了就算文件被修改了
Decider('timestamp-match')
# 混合: timestamp改变了, MD5也变了才算修改了
Decider('MD5-timestamp')
|
可以根据Enviroment设置Decider
缓存判断依赖关系
1
| SetOption('implicit_cache', 1)
|
设置依赖关系
1
2
| Depends(hello, 'otherfile')
Ignore(hello_obj, 'hello.h')
|
我最喜欢的, 执行自定义的命令:
1
2
3
| Command('hello.o', 'hello.c',
['gcc $SOURCE -c',
'wc -l $SOURCE >> summary'])
|
结论
看起来scons还是有点意思的, 我先用一段时间, 等有了一定的感觉之后再来看看.
资源