scons是非常好的build系统,可以用来代替Makefile,支持cpp和java
首先安装scons1.2,ubuntu自带的是0.97,如果最好synaptic里删掉
scons的文档很丰富,编译文件本身就是python,因此有很多很神奇的用法
这边只介绍基本的用法
假设你的code和编译的文件是分开的,比如src和build
假设你的include文件都是从某个root开始找,类似于 #include "lib1/lib1.h",而不是相对路径
基于以上个人认为的好习惯,开始设计SConstruct的结构吧
|-- SConstruct |-- src | |-- SConscript | |-- app1 | | |-- SConscript | | |-- app1.cc | |-- lib1 | | |-- SConscript | | |-- lib1.cc | | |-- lib1.h | `-- lib2 | |-- SConscript | |-- lib2.cc | |-- lib2.h
= SConstruct =
VariantDir('build', 'src', duplicate=0) SConscript('build/SConscript')
= src/SConscript =
SConscript([ 'lib1/SConscript', 'lib2/SConscript', 'app1/SConscript' ])
= src/lib1/SConscript =
env = Environment() env.Library('lib1', 'lib1.cc', CPPPATH = ['#src'])
= src/lib1/lib1.h =
#ifndef LIB1_LIB1_H #define LIB1_LIB1_H int add1(int x, int y); #endif
= src/lib1/lib1.cc =
#include "lib1/lib1.h" int add1(int x, int y) { return x + y + 1; }
= src/lib2/SConscript =
env = Environment() env.Library('lib2', 'lib2.cc', CPPPATH = ['#src'])
= src/lib2/lib2.h =
#ifndef LIB2_LIB2_H #define LIB2_LIB2_H int add1(int x, int y); #endif
= src/lib2/lib2.cc =
#include "lib2/lib2.h" int add1(int x, int y) { return x + y + 1; }
= src/app1/SConscript =
#include <iostream> #include "lib2/lib2.h" #include "lib2/lib2.h" using namespace std; int main() { cout << add1(1, 2) << endl; cout << add2(1, 2) << endl; return 0; }
好,到根目录下
$ scons
$ scons -c 为清空