SCons 第二章 簡單例程

第二章 簡單例程

? 本章會介紹幾個簡單的SCons構(gòu)建工程匾竿,以演示使用SCons在不同類型的系統(tǒng)上根據(jù)幾種不同的編程語言來構(gòu)建程序是多么容易币厕。

2.1 構(gòu)建簡單的C/C++程序

? 這是一個C語言版的“Hello, World” (文件名:hello.c):

int main() {
    printf("Hello, world!\n");
    return 0;
}

? 下面介紹如何使用SCons對其進(jìn)行構(gòu)建。新建一個SConstruct文件埂蕊,輸入一下內(nèi)容:

Program("hello.c")

? 這個簡單的SCons配置描述了兩條信息:工程的構(gòu)建類型(可執(zhí)行文件往弓、庫文件等)和待編譯文件(hello.c)。Program是一種編譯方法蓄氧,告訴SCons需要構(gòu)建一種可執(zhí)行文件函似。

? 就這樣,現(xiàn)在運行scons命令來構(gòu)建整個工程喉童。在POSIX平臺系統(tǒng)上撇寞,例如Linux或UNIX,你將會看到如下輸出:

> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cc -o hello.o -c hello.c
cc -o hello hello.o
scons: done building targets. 

? 在windows平臺堂氯,采用Micosoft Visual C++編譯器蔑担,你將會看到如下輸出:

C:\> scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cl /Fohello.obj /c hello.c /nologo
link /nologo /OUT:hello.exe hello.obj
embedManifestExeCheck(target, source, env)
scons: done building targets.

? 首先,您需要指定源文件的名稱咽白,并且SCons會根據(jù)源文件名正確推斷出要構(gòu)建的對象和可執(zhí)行文件的名稱啤握。

? 其次,相同的輸入SConstruct文件晶框,在兩個系統(tǒng)上會生成正確的輸出文件名排抬。(POSIX:hello.o和hello;WINDWOS:hello.obj和hello.exe)授段。這是一個簡單的例子蹲蒲,來說明SCOns如何編寫并構(gòu)建簡單的程序。

(請注意侵贵,對于本指南中所有的示例届搁,我們不會同時提供windows和Linux兩種輸出示例,除非有特殊說明窍育,否則輸出效果在兩個平臺上同樣有效)

2.2 構(gòu)建中間文件

? Program構(gòu)建方法只是SCons提供的眾多構(gòu)建方法之一卡睦,另外一種構(gòu)建方法是object,用以生成中間文件:

Object('hello.c')

? 現(xiàn)在你可以執(zhí)行scons命令蔫骂,去構(gòu)建整個工程么翰,在POSIX工程中這將會僅僅構(gòu)建hello.o。

> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cc -o hello.o -c hello.c
scons: done building targets.

? 在windows平臺上辽旋,將會僅僅構(gòu)建出來hello.obj(采用Microsoft Visual C++ 編譯器):

C:\>scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cl /Fohello.obj /c hello.c /nologo
scons: done building targets.

2.3 簡單Java構(gòu)建

? SCons構(gòu)建Java工程也很簡單浩嫌,不像ProgramObject這些構(gòu)建方法, Java構(gòu)建方法需要你指明構(gòu)建的輸出目標(biāo)路徑:

Java('classes', 'src')

? 如果src路徑包含了一個hello.java文件补胚,那么執(zhí)行scons命令后的輸出將會如下:

> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
javac -d classes -sourcepath src src/hello.java
scons: done building targets.

? 我們會覆蓋更多的java編譯細(xì)節(jié)码耐,包含java架構(gòu)和其他類型的文件,詳見第26章溶其。

2.4 編譯后清除

? 采用SCons我們不需要增加特殊的指令在構(gòu)建后執(zhí)行清除操作骚腥,相反,你可以簡單使用-c或者--clean選項瓶逃,此時SCons會自動刪除構(gòu)建的文件束铭,所以你可以采用scons -c進(jìn)行構(gòu)建后的清理工作廓块,在POSIX平臺上輸出如下:

> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cc -o hello.o -c hello.c
cc -o hello hello.o
scons: done building targets.

> scons -c
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Cleaning targets ...
Removed hello.o
Removed hello
scons: done cleaning targets.

? 在windows平臺上輸出如下:

C:\>scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cl /Fohello.obj /c hello.c /nologo
link /nologo /OUT:hello.exe hello.obj
embedManifestExeCheck(target, source, env)
scons: done building targets.

C:\>scons -c
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Cleaning targets ...
Removed hello.obj
Removed hello.exe
scons: donw cleaning targets.

? 請注意, SCons通過改變輸出來告訴你契沫,它在Cleaning targets ... 和 donw cleaning targets.

2.5 SConstruct文件

? SConstruct文件带猴,類似于Make系統(tǒng)中的Makefile文件,這是SCons讀取并控制編譯構(gòu)建的輸入文件懈万。

2.5.1 SConstruct文件是Python腳本

? SConstruct和Makefile的最大不同是:SConstruct文件是python腳本拴清,如果你不太熟悉python,也不用擔(dān)心会通,這本指南會詳細(xì)介紹Python的相關(guān)用法口予,保證您會高效地使用SCons,而且python也是非常簡單易學(xué)的涕侈。

? 使用Python作為腳本語言的一個方面是沪停,您可以在SConstruct中使用Python的注釋約定,將注釋放入文件中驾凶。也就是說牙甫,“#”和行尾之間的所有內(nèi)容都將被忽略:

# Arrange to build the "hello" program.
Program('hello.c') # "hello.c" is the source file.

? 在本指南剩余的部分您會發(fā)現(xiàn)调违,使用腳本語言可以大大簡化復(fù)雜的構(gòu)建過程窟哺。

2.5 SCons函數(shù)和構(gòu)建順序無關(guān)

? SConstruct有一點和一般python腳本不同,SCons函數(shù)的書寫調(diào)用順序技肩,并不影響SCons真實的構(gòu)建順序且轨,這點和Makefile有點相似。換句話說虚婿,當(dāng)你調(diào)用Program構(gòu)建時(或者其他構(gòu)建方法)旋奢,SCons并非在此刻構(gòu)建可執(zhí)行文件,相反然痊,這僅僅是告訴SCons你想要獲得一個可執(zhí)行文件的構(gòu)建結(jié)果至朗。舉例來說,需要構(gòu)建hello.c的源文件剧浸,SCons也僅僅是獲取了構(gòu)建可執(zhí)行文件hello和源碼hello.c之間的關(guān)系锹引。(在第6章會詳細(xì)介紹)

? 我們可以通過打印輸出,來區(qū)分SCons僅僅是調(diào)用構(gòu)建方法如Program獲取構(gòu)建信息唆香,還是真實構(gòu)建可執(zhí)行文件嫌变。通過python的print函數(shù),我們可以看到SCons的Program構(gòu)建過程:

print("Calling Program('hello.c')")
Program('hello.c')
print("Calling Program('goodbye.c')")
Program('goodbye.c')
print("Finished calling Program()")

? 當(dāng)執(zhí)行scons指令時躬它,我們可以看到輸出如下:

> scons
scons: Reading SConscript files ...
Calling Program('hello.c')
Calling Program('goodbye.c')
Finished calling Program()
scons: done reading SConscript files.
scons: Building targets ...
cc -o goodbye.o -c goodbye.c
cc -o goodbye goodbye.o
cc -o hello.o -c hello.c
cc -o hello hello.o
scons: done building targets.

? 注意到腾啥,SCons先構(gòu)建了goodbye,即使在SConstruct中優(yōu)先定義了hello。

2.6 降低SCons輸出詳細(xì)程度

? 你已經(jīng)知道了SCons構(gòu)建時的一些輸出信息:

C:\>scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cl /Fohello.obj /c hello.c /nologo
link /nologo /OUT:hello.exe hello.obj
embedManifestExeCheck(target, source, env)
scons: done building targets.

? 這些輸出信息描述了SCons的工作順序倘待,SCons會先讀取所有的配置文件(SConstruct和SConscript文件等)疮跑,其次才是構(gòu)建具體的目標(biāo)。這些輸出信息還會描述一些錯誤信息延柠,包括【配置文件讀取過程中的出錯和編譯執(zhí)行過程中的出錯等祸挪。

? 當(dāng)然,這些輸出結(jié)果會導(dǎo)致輸出比較混亂贞间,我們可以通過-Q參數(shù)來禁用:

C:\>scons -Q
cl /Fohello.obj /c hello.c /nologo
link /nologo /OUT:hello.exe hello.obj
embedManifestExeCheck(target, source, env)

? 因為我們希望本指南用戶重點關(guān)注SCons實際在做什么,所以我們將使用該-Q選項雹仿,從本指南中所有其他示例的輸出中刪除這些消息增热。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胧辽,隨后出現(xiàn)的幾起案子峻仇,更是在濱河造成了極大的恐慌,老刑警劉巖邑商,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摄咆,死亡現(xiàn)場離奇詭異,居然都是意外死亡人断,警方通過查閱死者的電腦和手機(jī)吭从,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恶迈,“玉大人涩金,你說我怎么就攤上這事∠局伲” “怎么了步做?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奈附。 經(jīng)常有香客問我全度,道長,這世上最難降的妖魔是什么斥滤? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任将鸵,我火速辦了婚禮,結(jié)果婚禮上中跌,老公的妹妹穿的比我還像新娘咨堤。我一直安慰自己,他們只是感情好漩符,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布一喘。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凸克。 梳的紋絲不亂的頭發(fā)上议蟆,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音萎战,去河邊找鬼咐容。 笑死,一個胖子當(dāng)著我的面吹牛蚂维,可吹牛的內(nèi)容都是我干的戳粒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼虫啥,長吁一口氣:“原來是場噩夢啊……” “哼蔚约!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涂籽,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤苹祟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后评雌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體树枫,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年景东,在試婚紗的時候發(fā)現(xiàn)自己被綠了砂轻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡耐薯,死狀恐怖舔清,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曲初,我是刑警寧澤体谒,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站臼婆,受9級特大地震影響抒痒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颁褂,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一故响、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颁独,春花似錦彩届、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贮聂。三九已至,卻和暖如春寨辩,著一層夾襖步出監(jiān)牢的瞬間吓懈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工靡狞, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留耻警,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓甸怕,卻偏偏與公主長得像甘穿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梢杭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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

  • 簡單入門 hello world scons由Sconstruct 作為入口扒磁,控制如何進(jìn)行編譯操作。Sconstr...
    辰辰沉沉沉閱讀 24,728評論 0 8
  • 一式曲、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,746評論 0 10
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關(guān)于...
    SeanCST閱讀 7,808評論 0 27
  • C++少說也用了十年了缸榛,從簡單的Hello World到200萬行的游戲項目吝羞,編譯和構(gòu)建的工具也經(jīng)歷了各種升級。最...
    davidpp閱讀 7,988評論 4 16
  • 今天在單位去聽課姜老師的課内颗,果不其然钧排,受益匪淺。姜老師博學(xué)多才均澳,學(xué)貫古今恨溜,是我們學(xué)習(xí)的榜樣。下午又改進(jìn)了太極...
    月中丹桂自扶疏閱讀 29評論 0 0