scons是一個Python寫的自動化構建工具,和GNU make相比優點明顯:
1、 移植性:python能運行的地方,就能運行scons
2、 擴展性:理論上scons只是提供了python的類,scons使用者可以在這個類的基礎上做所有python能做的事情。比如想把一個已經使用了Makefile大型工程切換到scons,就可以保留原來的Makefile,並用python解析Makefile中的編譯選項、源/目標文件等,作為參數傳遞給scons,完成編譯。
3、 智能:Scons繼承了autoconf/automake的功能,自動解析系統的include路徑、typedef等;“以全局的觀點來看所有的依賴關系”
SCons的設計原則
正確,這一點從使用MD5作為文件更新檢查算法就可見一斑。要知道make使用的是時間戳,在沒有ntp服務器的情況下,很容易出現因本地時間與服務器不同步而導致的不正常build。
高效,只能說在滿足正確的前提下做到高效,畢竟python在性能上還是無法和make相比的,當然前者可以做的事情也更多。
方便,因為已經設定了一些默認的基本的原則,所以只需要編寫很少的代碼就可以完成一個項目的build。這一點比make是要好。當然做一個通用的makefile模板也不是什么難事。
1.安裝SCons
因為SCons基於python,所以首先要安裝python,本人安裝的是官方推薦的python 2.5.1。SCons可以在多種OS上運行,windows的版本可以在http://www.scons.org/download.php找到。
2.hello world
用C寫一個hello world, 如下
int main()
{
printf("Hello, world!\n");
}
保存文件名為hello.c,想要用scons來build這個文件,只需要,
a.在同一目錄下,建立一個名為SConstruct的文件
b.在該文件中加入一行,
Program('hello.c')
如果只是想compile objects,不做link,可以改為,
Object('hello.c')
c.在當前目錄下執行scons
% scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cc -o hello.o -c hello.c
cc -o hello hello.o
scons: done building targets.
3.make clean
makefile的忠實用戶一般都會在makefile中加入clean,作用是刪除已經產生的objects,可執行文件等,scons已經內置該功能,不需要額外添加代碼,執行scons –c。
% scons -c
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Cleaning targets ...
Removed hello.o
Removed hello
scons: done cleaning targets.
4. SConstruct和makefile
SConstruct和makefile有着本質的不同,但又有着驚人的相似之處。不同的是SConstruct是一個典型的python腳本,具有一切python腳本的特性;相似的是,和makefile一樣都是declarative型(非imperative型)腳本,也就是說Program, Object這些定義並不立即觸發編譯動作。
5. build多個文件
Program(['prog.c', 'file1.c', 'file2.c'])
指定目標文件的名字為myprog,
Program('myprog', ['prog.c', 'file1.c', 'file2.c'])
注意編譯多個文件和指定目標文件可能會有語義上的歧義,因此使用文件列表時要用中括號。
下面列出一些常用的例子方便以后使用。
編譯每個.c文件為單獨的程序 | src=Split(""" foo.c bar.c """) for x in src: Program(x) |
編譯所有的.c文件為一個程序 | Program('program', Glob('*.c')) |
使用環境變量 |
env.Program("foo.c")
env = Environment(CCFLAGS='-g',LINKFLAGS='-pthread -lm')
env.Program("foo.c")
|
編譯MPI程序 |
env = Environment(ENV = { 'PATH' : os.environ[ 'PATH' ] }, CC = 'mpicc') env.Program("alltoallv.c")
env.Program("alltoallv.c")
|
參考資料:
1. 用戶手冊, http://www.scons.org/doc/production/HTML/scons-user/index.html
參考:http://andylin02.iteye.com/blog/849665