scons 簡單入門

簡單入門

hello world

scons由Sconstruct 作為入口产舞,控制如何進(jìn)行編譯操作。Sconstruct 本身是一個(gè)python文件菠剩,故需要遵循python的語法易猫,以及能使用一些python的方法。(如我們可以用print 來debug)

這有一段很簡單的hello.cpp

#include <iostream>

int main() {
    std::cout << "hello world" << std::endl;
}

以及一個(gè)很簡單的Sconstruct

Program("hello.cpp")

Program是Scons中的一個(gè)編譯方法(builder_method)具壮, 告訴Scons 我們想要把hello.cpp 編譯成一個(gè)可執(zhí)行文件准颓。

保證Sconstruct 和hello.cpp 在同一個(gè)文件夾下哈蝇,執(zhí)行scons,就可以完成編譯攘已,生成可執(zhí)行文件hello炮赦。

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o hello.o -c hello.cpp
g++ -o hello hello.o
scons: done building targets.

可以看到,我們只指定了一個(gè)cpp文件贯被,scons會默認(rèn)給可執(zhí)行文件一個(gè)名字眼五,以及完成.o文件的生成,非常智能彤灶。當(dāng)然看幼,我們也能指定輸出文件的名字,Program("target_name", hello.cpp")

另外幌陕,除了Program 诵姜,還有其他很多builder_method, 如Object, SharedLibrary搏熄,StaticLibrary棚唆,LoadableModuleStaticObject心例,CFile

編譯多個(gè)文件

編譯多個(gè)文件非常簡單

  • 直接使用list Program(["a.cpp", "b.cpp", "c.cpp"])即可宵凌。

  • 也可以使用Glob方法

    source = Glob("src/*.cpp")
    print source # python語法,可以打印出來debug
    Program(["hello.cpp"] + source) 
    

    用這種方式把src下的文件都加進(jìn)來

  • Program(Split("a.cpp, b.cpp c.cpp") Split 也是SCons提供的一個(gè)方法止后,顧名思義了瞎惫。

編譯一個(gè)庫

把Program改為 Library (或者StaticLibrary,這兩者是一樣的)即可译株。

Library("t", Glob("src/*.cpp"))

這樣就能得到一個(gè)靜態(tài)庫了瓜喇。 如果如要一個(gè)動(dòng)態(tài)庫,則可以使用SharedLibrary歉糜。

鏈接一個(gè)庫

上邊我們學(xué)會如何編譯一個(gè)庫了乘寒,那么如何鏈接呢?也很簡單匪补,加個(gè)參數(shù)即可

source = Glob("src/*.cpp")
SharedLibrary("t", source)
Program(["hello.cpp"], LIBS=["t"], LIBPATH=".")

Program 可以理解為python 的一個(gè)方法伞辛,很多參數(shù)都有默認(rèn)值,我們要做的只用覆蓋其默認(rèn)值即可夯缺。如上始锚,我們指定引入LIBS。同樣的喳逛,LIBS參數(shù)也可以是個(gè)str瞧捌,LIBPATH也可以是個(gè)list,放上所有要查找的路徑,如['/usr/lib', '/usr/local/lib']姐呐,這里就不贅述了殿怜。

略微高級一點(diǎn)的功能

判斷是否需要重新編譯

SCons很智能,只會編譯需要編譯的內(nèi)容曙砂。比如我剛執(zhí)行完scons头谜,再次執(zhí)行,則會提示scons: . is up to date.鸠澈。 那么他是如何做到的呢柱告?也不復(fù)雜,依賴一個(gè)Decider的方法笑陈,以及一個(gè).sconsign.dblite文件际度。

默認(rèn)情況下,如果文件的md5值改變了涵妥,才會重新編譯乖菱。每次編譯,SCons都會把md5存起來蓬网,再次執(zhí)行時(shí)窒所,如果md5沒變,則不需要rebuild帆锋。

如果我們不希望使用md5吵取,而是使用文件修改時(shí)間呢?很簡單锯厢,增加Decider('timestamp-newer') (默認(rèn)情況下為md5)皮官。也可以使用'MD5-timestamp,則他們一起變了才會rebuild哲鸳。

我們前面也說到,Decider是一個(gè)方法盔憨,那很顯然徙菠,我們也可以自己寫個(gè)decider方法,詳細(xì)的可以看scons-user.pdf 6.1.5郁岩,這里不細(xì)寫了婿奔。。

env

env分為三種

  • external enviroment 保存在os.environ 中问慎,和scons其實(shí)沒太大關(guān)系萍摊,保存著一些系統(tǒng)定義的環(huán)境變量,如PATH之類

  • construction environment

    這個(gè)比較重要如叼,我們可能希望不同的源文件使用不同的編譯參數(shù)冰木,這時(shí)候我們就能設(shè)置不同的編譯環(huán)境,指定哪個(gè)文件用哪種編譯。construction environment 中保存了構(gòu)建相關(guān)的一些參數(shù)踊沸。

    使用方式如下

    env1 = Environment(CXX = 'gcc') # 創(chuàng)建一個(gè)env
    print env1["CXX"] # 獲取參數(shù)
    env2 = env1.Clone(CXX = 'g++')    # 復(fù)制一個(gè)env
    env1.Replace(CXX = 'g++') # 修改參數(shù)
    env1["CXX"] = "clang++"   #再修改參數(shù)
    
    env1.MergeFlags("-g") #增加一個(gè)flag
    

    就可以構(gòu)建出一個(gè)env歇终,除了CXX 被修改以外,其他參數(shù)均不變逼龟。另外评凝,我們也可以像一個(gè)dict一樣,去獲取env中的內(nèi)容腺律。

  • execution enviroment

    這其實(shí)就是construction environment 中的一個(gè)變量ENV

    env = Environment()
    print env["ENV"]
    
    env2 = Environment(ENV=os.environ)
    env3 = Environment(ENV = {"PATH" : os.environ["PATH"]})
    

    幾個(gè)簡單的例子奕短,一看就明白了

命令行輸入的參數(shù)

比如我們想通過一個(gè)debug字段來控制是否開啟debug模式,怎么做呢匀钧?可以通過ARGUMENTS

env = Environment()
debug = ARGUMENTS.get("debug", 0)
if int(debug):
    print "in debug mode"

scons debug=1就可以了翎碑。

小結(jié)

上面只是我在看的時(shí)候做的一個(gè)小結(jié),詳細(xì)的可以看(文檔)[https://scons.org/doc/production/PDF/scons-user.pdf]榴捡,很多東西都沒寫杈女,在日常工作中可以一點(diǎn)一點(diǎn)去體會。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吊圾,一起剝皮案震驚了整個(gè)濱河市达椰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌项乒,老刑警劉巖啰劲,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異檀何,居然都是意外死亡蝇裤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門频鉴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栓辜,“玉大人,你說我怎么就攤上這事垛孔∨核Γ” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵周荐,是天一觀的道長狭莱。 經(jīng)常有香客問我,道長概作,這世上最難降的妖魔是什么腋妙? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮讯榕,結(jié)果婚禮上骤素,老公的妹妹穿的比我還像新娘匙睹。我一直安慰自己,他們只是感情好谆甜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布垃僚。 她就那樣靜靜地躺著,像睡著了一般规辱。 火紅的嫁衣襯著肌膚如雪谆棺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天罕袋,我揣著相機(jī)與錄音改淑,去河邊找鬼。 笑死浴讯,一個(gè)胖子當(dāng)著我的面吹牛朵夏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榆纽,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼仰猖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奈籽?” 一聲冷哼從身側(cè)響起饥侵,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衣屏,沒想到半個(gè)月后躏升,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狼忱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年膨疏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钻弄。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佃却,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窘俺,到底是詐尸還是另有隱情饲帅,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布批销,位于F島的核電站洒闸,受9級特大地震影響染坯,放射性物質(zhì)發(fā)生泄漏均芽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一单鹿、第九天 我趴在偏房一處隱蔽的房頂上張望掀宋。 院中可真熱鬧,春花似錦、人聲如沸劲妙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镣奋。三九已至币呵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侨颈,已是汗流浹背余赢。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哈垢,地道東北人妻柒。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像耘分,于是被迫代替她去往敵國和親举塔。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 第一章:編譯和安裝SCons第二章:簡單編譯第三章:編譯相關(guān)的一些事情第四章:編譯和鏈接庫文件第五章:節(jié)點(diǎn)對象第六...
    仙靈兒閱讀 11,786評論 0 3
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,696評論 0 3
  • 一求泰、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,744評論 0 10
  • 一央渣、NDK產(chǎn)生的背景 Android平臺從誕生起,就已經(jīng)支持C拜秧、C++開發(fā)痹屹。眾所周知,Android的SDK基于J...
    Ten_Minutes閱讀 3,499評論 1 27
  • 1:InputChannel提供函數(shù)創(chuàng)建底層的Pipe對象 2: 1)客戶端需要新建窗口 2)new ViewRo...
    自由人是工程師閱讀 5,301評論 0 18