Build Your Projects with Scons



Scons 是一个全新的软件build工具,是基于python的,相当于Gnu Make。 不同于makefile,它的配置文件都是python脚本, 这个项目从2011年起,一直活跃至今,虽然不知道普及程度如何,但是最近碰到一个开源代码是用的scons,不禁想学习学习如何使用它。

安装

安装非常的简单,你可以用操作系统的包管理软件,或者下载代码自己build,因为是基于python的,所以只要你的系统有python应该就能够自己build。在Mac上我主要用homebrew,所以

brew search scons
brew install scons

Build

借用文档里的例子,比如我们有一个helloword c

int main() {
    printf("Hello, world!\n");
}

如果要使用scons来build的话,只需要创建Sconstruct:

Program('hello.c')

然后run scons 你会看到结果如下

syi➜~/tmp» scons                                                   
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o hello.o -c hello.c
gcc -o hello hello.o
scons: done building targets.

然后你会发现这个proj已经被build好了。

从这个简单例子不难看出,scons就是由这么一些command构成的,比如 如果你想build obj,就用Object替换Program

syi➜~/tmp» scons                                               
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o hello.o -c hello.c
scons: done building targets.

More Builds

Java

比如我们在src里创建HelloWorld.java

class HelloWorld {
    public static void main (String[] args) {
        System.out.println("Hello, world!\n");
    }
}

在Sconstruct里需要声

Java('classes','src')

第一个是output folder path, 第二个参数是source code folder path

如果要build jar包需要使用

Java(target = 'classes', source = 'src')
Jar(target = 'test.jar', source = 'classes')

Sconstruct File Example

Program('new_hello','hello.c') # build program with given name
Program(['prog.c', 'file1.c', 'file2.c']) # compile multiple files
Program('program', ['prog.c', 'file1.c', 'file2.c'])
Library('foo', ['f1.c', 'f2.c', 'f3.c']) # build a library, foo->libfoo
StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])

当你需要link libraries的时候

Library('foo', ['f1.c', 'f2.c', 'f3.c'])
Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.')

判断是否重新编译

Decider('timestamp-newer')或者Decider('MD5')或者Decider('MD5-timestamp')

More Commands

scons -c 可以清理build空间

scons -Q 简洁output

结语

最重要的参考应该还是官方文档,见Ref[1]

Reference

  1. http://www.scons.org/doc/production/HTML/scons-user.html
  2. http://www.ibm.com/developerworks/cn/linux/l-cn-scons/
  3. http://dongxicheng.org/cpp/scons-intro-usage/