1. 程式人生 > >scons淺入淺出

scons淺入淺出

--作者:燕十三(flyingcys)

--QQ:294102238

Scons是一個開放原始碼、以Python語言編碼的自動化構建工具,可用來替代make編寫複雜的makefile。並且scons是跨平臺的,只要scons指令碼寫的好,可以在LinuxWindows下隨意編譯。

一、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. Pythonos模組使用:

使用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 要用好,需要學習的東西還是很多的,只能一邊用一邊學了!