SCons 使用 scons 软件构建工具

laofo · 2010年03月25日 · 9 次阅读

scons 是一个比较有意思的软件构建工具,其本意是想替代著名的 autotools 系列,我没有用过 autotools,不过看到网上的 autotools 使用教程就头晕,后来听说了 scons,就仔细下载了它的文档看了一下,觉得很符合我的口味。scons 与 autotools 和 cmake 等工具不同的是,它并不是从一个类似工程配置的文件中生成 Makefile,再调用 make 进行编译,而是直接控制编译器,从这个意义上来说, 它其实并不是替代 autotools,而是 make!下面是一个简单的例子,如果你想编译著名的 hello.c 文件:

1. #include 2.

3. int main(){ 4. printf("hello,world\n"); 5. return 0; 6. }

  只需在 hello.c 的当前目录下建立一个叫 SConstruct 的文件:

1. Program('hello,'hello.c')

  然后运行 scons 就可以了,scons 会自动调用 gcc(不是 make)来编译生成可执行程序 hello。如果 hello.c 中引用了 foo.h 这个头文件,而 foo.h 声明的函数定义在 foo.c,则 SConstrut 可以写成:

1. Program('hello',['hello.c','foo.c'])

  Program 的第一个参数是目标,后面可以是单个源文件名或源文件名数组。注意,scons 是很智能的,它知道 hello.c 依赖于 foo.h,所以当 foo.h 发生改变时,就会重新编译 hello.c。这个依赖关系不需要我们额外写代码。如果源文件太多了,全写在那个数组里太长了, 而源文件都是在同一个目录以.c 为后辍时,我们可以简写如下:

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

  如果程序引入了其它的库,库名为 libbar.a,库的目录为/usr/local/lib:

1. Program('hello',Glob("*.c"),LIBS='bar',LIBPATH='/usr/local/lib')

  如果使用了 pkg-config 来管理库,可以用环境 (Enviroment) 如下,例如我使用了 GTK+ 2.0:

1. env=Enviroment() 2. env.ParseConfig("pkg-config --libs --cflags gtk+-2.0") 3. env.Program('hello',Glob("*.c"))

  scons 除了可以编译 C/C++ 程序以外,它还可以编译 LaTeX,如

1. DVI('paper.dvi','paper.tex')

  就可以用 latex 命令来编译 paper.dvi 文件,scons 还可以编译 Java 等其它类型的程序,具体内容见 scons 的官方文档。 scons 本身有一些设计得很好的地方,SConstruct 的本身是一个合法的 Python 程序,它并没有像 c,make 那样使用自有的配置文件格式, 可以使用所有 Python 的实用库来完成更高级的运用。还有它判断文件更改是默认情况下不是根据时间戳,而是 MD5 码!所以上面 foo.h 被 touch 了,并不会导致重新编译。scons 的缺点是其效率太低,速度太慢

目前用这个的公司很多么?

SCons 更新还是挺慢的,记得两年前版本是 0.98,现在也才 1.3。

用这个的公司有是有,但是不多,比较知名的像 Google,VMware,id 等等。

Right

Vmware 在用。

这两天才看到的消息,Chromium 本来用的是 SCons,后来因为性能太差,现在重新用 make 了。

人间悲剧啊

sigh

需要 登录 后方可回复。