scons淺入淺出
--作者:燕十三(flyingcys)
--QQ:294102238
Scons是一個開放原始碼、以Python語言編碼的自動化構建工具,可用來替代make編寫複雜的makefile。並且scons是跨平臺的,只要scons指令碼寫的好,可以在Linux和Windows下隨意編譯。
一、Scons安裝
如使用的是Ubuntu系統,可直接通過sudo apt-get install scons命令安裝已編譯好的scons。也可以通過原始碼編譯安裝,至官網http://scons.org/pages/download.html下載原始碼,當前最新版本為scons 2.5.1,可下載的zip格式的“scons-2.5.1.zip
解壓後進入原始檔目錄,在命令列輸入sudo python setup.py install進行編譯,安裝scons指令碼至python目錄/usr/local/bin,同事會安裝scons編譯引擎到python使用的庫目錄/usr/loacl/lib/scons。
二、Scons入門
1. scons 編譯指令碼:
a) 編譯頂層指令碼檔名為SConstruct,輸入scons命令後,自動呼叫該指令碼
b) scons的配置檔案Sconscript,通過Sconscript()函式匯入配置檔案。
2. scons -c:清除目標檔案,對應make clean
3. scons -Q:只顯示編譯資訊,去處多餘的列印資訊
4. 常用scons方法:
a) Program():生成可執行檔案。如:
Program(‘hello.c’):編譯hello.c為可執行檔案,檔名為第一個檔名
Program(‘main’,‘hello.c’):編譯hello.c為可執行檔案,檔名mian
b) Object():生成目標檔案。如:
Object(‘main’, ’hello.c’):編譯hello.c為目標檔案,檔名為main.o
c) 生成庫檔案
i. Library():生成庫,預設為靜態庫。
ii. StaticLibrary():生成靜態庫
iii. ShareLibrary():生成動態庫
d) 編譯多個檔案
i. Program([‘hello.c’, ‘func1.c’, ‘func2.c’])
ii. Split(‘hello.c func1.c func2’)
iii. Glob(‘*.c’)
5. 常用scons關鍵字:
i. source:指定原始檔名
ii. target:指定目標檔名。如:
Program(source = Split(‘hello.c func1.c func2.c’), target = ‘main’)
iii. LIBS:指定庫檔案,不需要新增lib和後面的.a,直接輸入名字。等同makefile裡面的-l。如:
LIBS=[‘m’,‘pthread’]
iv. LIBPATH:指定庫檔案路徑,等同於makefile裡面的-L。如:
LIBPATH = [‘/usr/lib’,‘/usr/local/bin’]
v. CPPPATH:指定程式編譯過程中需要查詢的標頭檔案路徑。
vi. CCFLAGS: 指定編譯選項。如:
Program(‘main’,‘hello.c’, CCFLAGS = [‘-g’,‘-O2’],CPPPATH = [‘./include’,‘../include’])
vii. LINKFLAGS: 指定連結選項
viii. CPPDEFINES:指定預編譯選項
三、Scons進階
scons指令碼是用Python語言寫的,所以熟悉Python很重要,但是沒關係,可以一點點熟悉。個人感覺對於scons來說,環境變數(Environment)是異常重要的,只有會用Environment,才能寫出真正可以實際使用的scons指令碼。
1. 構造環境變數:
個人理解就是由自己建立的環境變數,這個環境變數可以用來控制整個目標檔案編譯過程。
本人第一個用到構造環境變數的就是交叉編譯器的設定,由於scons預設用的是gcc來編譯系統,而嵌入式開發要使用指定的交叉編譯器來編譯目標檔案,所以可通過構造環境變數來修改編譯器。
a) 建立
env = Environment(CC = ‘arm-linux-gcc’)
b) 使用:用arm-linux-gcc編譯執行檔案
env.Program(‘hello.c’)
c) 從構造環境變數獲取值:
print “CC is:”, env[‘CC’]
d) 拷貝:我們想使用gcc編譯2個不同版本的debug/realse版本的程式,就可以通過拷貝建立2個環境變數
debug = env.Clone(CCFLAGS = ‘-g’)
Realse = env.Clone(CCFLAGS = ‘-O2’)
debug.Program(‘debug’,‘hello.c’)
debug.Program(‘realse’,‘hello.c’)
e) 追加到末尾:Append()
env.Append(CCFLAGS = ‘-DLAST’)
f) 追加到開始位置:Prepend()
env.Prepend(CCLFAGS = ‘-DFIRST’)
2. Python的os模組使用:
使用os模組,需要在每個指令碼檔案新增import os
a) os.name:獲取當前正在使用的平臺,linux顯示為‘posix’,windows返回的是‘nt’
b) os.getcwd():獲取當前工作目錄
c) os.getenv():讀取環境變數
d) os.putenv():設定環境變數
e) os.listdir():返回指定目錄下的所有檔案和目錄
f) os.remove():刪除一個檔案
g) os.system():執行shell命令
scons 要用好,需要學習的東西還是很多的,只能一邊用一邊學了!