scons是什麼
make
在linux系統上做過c/c++開發的同學們都知道乙個專案工程管理工具:make和makefile。
make 這個工具自上個世紀 70 年代 stuart feldman 在貝爾實驗室開發出以來,就一直是類 unix 程式設計師的最愛之一。
通過檢查檔案的修改時間,make 工具可以知道編譯目標檔案所要依賴的其他檔案。在複雜的專案中,如果只有少數幾個檔案修改過,make 工具知道僅僅需要對哪些檔案重新編譯就可以確保目標程式被正確的編譯鏈結。這樣做的好處就是在編譯中,不僅可以節省大量的重複輸入,還可以確保程式可以被正確的鏈結,縮短編譯的時間。
雖然如此,但是為 make 工具編寫建造規則卻不是一件容易的事。它複雜的配置規則,即使是有經驗的開發者也望而生畏。
那麼,今天介紹乙個它的同類產品,也可以說是公升級產品:scons,它做的事情跟make一樣,但更簡單,更容易。
scons
scons是乙個開放原始碼、以python語言編碼的自動化構建工具,可用來替代make編寫複雜的makefile。並且scons是跨平台的,只要scons指令碼寫的好,可以在linux和windows下隨意編譯。
scons 的設計目標就是讓開發人員更容易、更可靠和更快速的建造軟體。
與傳統的 make 工具比較,scons 具有以下優點:
scons使用
安裝在 scons 的官方**上可以查每個平台的具體安裝方法。
tar -zxf scons-2.0.1.tar.gz
cd scons-2.0.1
sudo python setup.py install
對於 linux 來說,scons 會預設安裝到 /usr/loca/bin 目錄下,而在 windows 平台上,則會被安裝到 c:\python25\scripts 下。
使用這裡通過乙個簡單的示例來說明。
乙個hello.c原始檔,乙個sconstruct檔案,後面再解釋。
% ls
hello.c sconstruct
% cat hello.c
#include int main(void)
執行scons,得到如下:
% scons
scons: reading sconscript files ...
scons: done reading sconscript files.
scons: building targets ...
gcc -o hello.o -c hello.c
gcc -o hello hello.o
scons: done building targets.
% ls
hello hello.c hello.o sconstruct
% ./hello
hello, world!
就是這樣,程式編譯完成了。到這裡scons似乎與make沒有什麼兩樣,同樣的操作,只是把scons換成make,sconstruct換成makefile。
對,不同的地方就在於,下面的展示:
% cat sconstruct
program("hello.c")
哈哈,你沒看錯,就這一行,編譯就完成了!!!
事實確實如此,它比傳統的 makefile 簡單很多。sconstruct 以 python 指令碼的語法編寫,你可以像編寫 python 指令碼一樣來編寫它。
其中的 program 是編譯的型別,說明你準備想要建造乙個可執行的二進位制程式,它由 hello.c 檔案來生成。
在這裡,沒有指定生成的可執行程式的名字,scons 會把源**檔案名字的字尾去掉,用來作為可執行檔案的名字。
我們甚至不需要像 makefile 那樣指定清理的動作,就可以執行清理任務。在 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.
% ls
hello.c sconstruct
相關命令
如果你不想直接編譯可執行的二進位制檔案,那也沒有關係。scons 支援多種編譯型別,你可以根據自己的需要,任意選用其中的一種。
scons 支援的編譯型別有:
program('myhello', 'helloscons.c')
其中 myscons 就是你想要的可執行檔案的名字.
% scons -q
gcc -o hello.o -c hello.c
gcc -o myhello hello.o
其中,-q 引數是減少編譯時的由 scons 產生的冗餘資訊。
如果你的專案由多個原始檔組成,而且你想指定一些編譯的巨集定義,以及顯式的指定使用某些庫,這些對於 scons 來說,都是非常簡單的事情。我們的另外乙個例子 helloscons2 很好的說明這種情況。 helloscons2 由 3 個原始檔組成 , 它們是 helloscon2.c, file1.c, file2.c,另外指定了編譯的選項,同時還指定了使用哪些具體的庫。讓我們來看一下 helloscons2 的 sconstruct 檔案 :
program(
'helloscons2',[
'helloscons2.c'
,'file1.c'
,'file2.c'],
libs =
'm',
libpath =
['/usr/lib'
,'/usr/local/lib'],
ccflags =
'-dhelloscons'
)
該 sconstruct 檔案指出,它將生成乙個名叫 helloscons2 的可執行程式,該可執行程式由 helloscons2.c, file1.c 和 file2.c 組成。注意,多個原始檔需要放在乙個 python 列表中。如果你的源程式**檔案很多,有十幾個甚至上百個,那不要乙個個的將他們都列出來,你可以使用 glob(』*.c』) 來代替源**列表。如下 :
program(
'helloscons2'
, glob(
'*.c'
))
配置檔案中 libs,libapth 和 ccflags 是 scons 內建的關鍵字,它們的作用如下:
ccflags: 編譯選項,可以指定需要的任意編譯選項,如果有多個選項,應該放在乙個列表中。這個例子裡,編譯選項是通過 -d 這個 gcc 的選項定義了乙個巨集 helloscons。
cpppath:指定標頭檔案的路徑
執行 scons 命令的時候,可以看到這些變數如何被使用的,讓我們執行一下 scons 命令 :
$ scons -q
gcc -o file1.o -c -dhelloscons file1.c
gcc -o file2.o -c -dhelloscons file2.c
gcc -o helloscons2.o -c -dhelloscons helloscons2.c
gcc -o helloscons2 helloscons2.o file1.o file2.o -l/usr/lib -l/usr/local/lib -lm
以上只是入門,還有更多知識等待學習。
如,通過environment指定編譯環境,env = environment(cc = 'g++')
,指定使用g++編譯程式。
示例如下:
env =
environment
(cc =
'g++'
)env.
program
("client"
,"client.c"
, libs =
'm', cpppath =
'../include'
, ccflags =
'-std=c++11'
)
Scons使用一二
無意中看到了乙個用python來寫makefile的工具scons,使用了一下,感覺還不錯,記錄一下。pip install scons以之前構建的freertos的simulator做範例。首先需要在目錄下建立乙個名為sconstruct的檔案,scons通過解析該檔案來進行編譯。我們在檔案中首先...
scons編譯系統
scons是乙個以python語言編碼的開源自動化構建工具,可以用來替換make工具。它使用更高階的語言來編寫,相對於make來說對於使用者更加友好,降低了學習成本,它的構建語法相對與make更加簡單明瞭。sudo apt get install python python pip sudo apt...
學習scons總結
5 關鍵字 ccflags 指定編譯選項 linkflags 指定鏈結選項 cppdefines指定預編譯器 libs 指定所需要鏈結的庫檔案 libpath 指定庫檔案 lib 的搜尋路徑 cpppath 指定 h,c,cpp 等檔案的搜素路徑 source 指定源檔名 target 指定目標檔名...