SCons構建工具使用


    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'))
使用環境變量
  • 例子1
env = Environment(LINKFLAGS='-pthread -lm')
env.Program("foo.c")

  • 例子2
env = Environment(CCFLAGS='-g',LINKFLAGS='-pthread -lm')
env.Program("foo.c")
編譯MPI程序
  • 例子1
import os
env = Environment(ENV =  { 'PATH' : os.environ[ 'PATH' ] }, CC = 'mpicc')
env.Program("alltoallv.c")

  • 例子2
env = Environment(CC = '/opt/mpich2/bin/mpicc')
env.Program("alltoallv.c")

參考資料:
1. 用戶手冊, http://www.scons.org/doc/production/HTML/scons-user/index.html

參考:http://andylin02.iteye.com/blog/849665

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM