N年前學的makefile,當時還勉強能寫一些簡單的工程編譯,現在已經基本忘了。makefile確實編寫復雜,而且平時也不是經常使用,容易忘記。偶識了scons,一切都變的簡單了。最近研究了下scons,原來需要上百行的makefile編譯過程,現在只需要十行不到,而且沒有makefile那些繁雜的結構語法,完全使用python語言就可以進行編譯腳本編寫,非常好記憶和編譯一些大的工程。
直接使用apt-get install scons命令就可以完成安裝,需要python環境。
Scons命令
scons:進行代碼文件編譯
scons -Q:進行代碼文件編譯,不顯示Scons內部操作打印的信息,只顯示編譯信息
scons -c:清除編譯中間文件和可執行文件
Scons編譯腳本
Scons對應的編譯腳本名稱為SConstruct,就如同make對應的編譯腳本為makefile
SConstruct腳本編寫
編譯函數
Program():執行編譯操作,生成可執行文件
Library():執行編譯操作,生成靜態庫
StaticLibrary():執行編譯操作,生成靜態庫
SharedLibrary():執行編譯操作,生成動態庫
Environment():編譯環境
編譯參數
target,生成的執行文件名字
source,編譯文件
LIBS,依賴庫
LIBPATH,依賴庫路徑,有環境變量的可不添加,針對用戶庫或第三方庫
CPPPATH,頭文件路徑
CCFLAGS,編譯參數
其他函數
Split():將字符串分隔為列表
Glob('*.cpp'):加入所有文件
編譯參數可以以任意順序加入編譯函數,編譯函數依據編譯參數對代碼文件進行編譯。
一個簡單例子
將文件放在當前目錄,頭文件放在上級目錄。
1 str = Split('main.cpp display.cpp') 2 Program('main',str,CPPPATH = '../'i,LIBS = 'pthread')一個復雜項目的例子
大多項目都可以套用的格式,Program內參數多個文件需要以python列表形式作為入參,這里可以用Split對文件字符串分隔為列表輸入。直接用Glob('*.cpp')包含當前目錄所有需要編譯的cpp文件。
1 TARGETNAME = 'server' 2 3 LIB = Split('jsoncpp logger ACE basetool tinyxml pthread dl rt') 4 5 FILELIST = Glob('*.cpp') 6 7 HEADFILEPATH = Split('../../common/include ../../3rd/ACE_wrappers ../../3rd/include/') 8 9 LIB_DIR = Split('../../3rd/lib ../../common/lib') 10 11 Program(target = TARGETNAME,source = FILELIST,LIBS = LIB,CPPPATH = HEADFILEPATH,LIBPATH = LIB_DIR)