Scons是什么
1. make
在Linux系統上做過c/c++開發的同學們都知道一個項目工程管理工具:make和Makefile。
make 這個工具自上個世紀 70 年代 Stuart Feldman 在貝爾實驗室開發出以來,就一直是類 UNIX 程序員的最愛之一。
通過檢查文件的修改時間,make 工具可以知道編譯目標文件所要依賴的其他文件。在復雜的項目中,如果只有少數幾個文件修改過,make 工具知道僅僅需要對哪些文件重新編譯就可以確保目標程序被正確的編譯鏈接。這樣做的好處就是在編譯中,不僅可以節省大量的重復輸入,還可以確保程序可以被正確的鏈接,縮短編譯的時間。
雖然如此,但是為 make 工具編寫建造規則卻不是一件容易的事。它復雜的配置規則,即使是有經驗的開發者也望而生畏。
那么,今天介紹一個它的同類產品,也可以說是升級產品:Scons,它做的事情跟make一樣,但更簡單,更容易。
2.Scons
Scons是一個開放源碼、以Python語言編碼的自動化構建工具,可用來替代make編寫復雜的makefile。並且scons是跨平台的,只要scons腳本寫的好,可以在Linux和Windows下隨意編譯。
SCons 的設計目標就是讓開發人員更容易、更可靠和更快速的建造軟件。
與傳統的 make 工具比較,SCons 具有以下優點:
- 使用 Python 腳本做為配置文件。
- 對於 C,C++ 和 Fortran, 內建支持可靠自動依賴分析 . 不用像 make 工具那樣需要 執行"make depends"和"make clean"就可以獲得所有的依賴關系。
- 內建支持 C, C++, D, Java, Fortran, Yacc, Lex, Qt,SWIG 以及 Tex/Latex。 用戶還可以根據自己的需要進行擴展以獲得對需要編程語言的支持。
- 支持 make -j 風格的並行建造。相比 make -j, SCons 可以同時運行 N 個工作,而 不用擔心代碼的層次結構。
- 使用 Autoconf 風格查找頭文件,函數庫,函數和類型定義。
- 良好的誇平台性。SCons 可以運行在 Linux, AIX, BSD, HP/UX, IRIX, Solaris, Windows, Mac OS X 和 OS/2 上。
3.Scons使用
3.1 安裝
在 SCons 的官方網站上可以查每個平台的具體安裝方法。
Win平台的下載和安裝就不說了。
Linux下下載tar包,執行以下命令即可:
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 下。
3.2 使用
這里通過一個簡單的示例來說明。
一個hello.c源文件,一個SConstruct文件,后面再解釋。
% ls hello.c SConstruct % cat hello.c #include <stdio.h> int main(void) { printf("hello, world!\n"); return 0; }
運行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: *** No SConstruct file found.的解決方案
使用SCons時有3種方式指定SConstruct文件,如下:
-
scons
從項目的根目錄執行,這里應該有一個 SConstruct 文件。這是最標准的方式。 -
從項目的子目錄中,在根目錄下應該有一個 SConsctruct 文件,
scons
使用以下選項之一(如 scons -h 所見)執行以告訴它查找 SConstruct 的目錄結構
-u, --up, --search-up
Search up directory tree for SConstruct, build targets at or below current directory. -U Search up directory tree for SConstruct, build Default() targets from local SConscript.
- 顯式指定 SConstruct 文件的位置,這也可以從
scons -h
-f FILE, --file=FILE, --makefile=FILE, --sconstruct=FILE
Read FILE as the top-level SConstruct file.
這是目錄中的示例項目,其/home/notroot/projectDir
目錄結構如下:
SConstruct subdir/file.hh subdir/file.cc
以下是如何使用上述不同選項:
選項1:
從項目根目錄執行 scons
# cd /home/notroot/projectDir
# scons
選項 2:
從項目目錄中執行 scons 並告訴它查找 SConstruct 的目錄層次結構
# cd /home/notroot/projectDir/subdir
# scons -u
選項 3:
從項目目錄中執行 scons 並指定 SConstruct 的路徑
# cd /home/notroot/projectDir/subdir
# scons -f /home/notroot/projectDir/SConstruct