SCons 第五章 編譯節(jié)點對象

第五章 編譯節(jié)點對象

? 在SCons內(nèi)部絮宁,所有的文件和路徑都被看作是節(jié)點(Nodes)派敷,我們可以采用這種方式讓您的SConscript腳本更加便于遷移和閱讀曼追。

5.1 返回目標(biāo)節(jié)點列表的編譯方法

? 所有的構(gòu)建方法返回一個節(jié)點對象列表押赊,這些節(jié)點可以被用作其他構(gòu)建方法的參數(shù)抠刺。

? 舉例而言,如果我們想要構(gòu)建兩個中間文件阱飘,他們采用不同的編譯參數(shù):

Object('hello.c', CCFLAGS='-DHELLO')
Object('goodbye.c', CCFLAGS='-DGOODBYE')

? 將上述兩個中間文件連接在一起斥杜,構(gòu)建最終的輸出文件,一種方式是將上述輸出中間文件放入一個列表中沥匈,作為Program的參數(shù):

Object('hello.c', CCFLAGS='-DHELLO')
Object('goodbye.c', CCFLAGS='-DGOODBYE')
Program(['hello.o', 'goodbye.o'])

? 這樣做在跨平臺方面會存在問題蔗喂,因為在Windows平臺上,生成的中間文件是hello.obj和goodbye.obj咐熙,而非hello.o和goodby.o弱恒。

? 較好的處理方式是將Object的構(gòu)建輸出存入變量中,這樣我們可以不斷在列表后追加新的內(nèi)容棋恼,將其作為Program的輸入:

hello_list = Object('hello.c', CCFLAGS='-DHELLO')
goodbye_list = Object('goodbye.c', CCFLAGS='-DGOODBYE')
Program(hello_list + goodbye_list)

? 這樣SConstruct腳本的跨平臺性可以得到保證返弹,其在Linux平臺輸出如下:

> scons -Q
cc -o goodbye.o -c -DGOODBYE goodbye.c
cc -o hello.o -c -DHELLO hello.c
cc -o hello hello.o goodbye.o

? Windows平臺輸出如下:

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

? 后續(xù)將會介紹更多的編譯節(jié)點的使用方法。

5.2 明確創(chuàng)建文件和路徑節(jié)點

? 值得一提的是爪飘,SCons明確了文件節(jié)點和路徑節(jié)點的不同义起,SCons支持FileDir兩個函數(shù),用于返回文件和路徑節(jié)點:

hello_c = File('hello.c')
Program(hello_c)

classes = Dir('classes')
Java(classes, 'src')

? 通常情況下师崎,您不需要手動調(diào)用File或Dir默终,因為調(diào)用構(gòu)建方法時,會自動將輸入作為文件或目錄的名稱犁罩,并將其轉(zhuǎn)換為一個Node對象齐蔽。除非您需要明確SCons的節(jié)點類型,比如在調(diào)用構(gòu)建方法或者需要調(diào)用特殊文件或路徑樹的時候床估。

? 有時候含滴,您可能在無法明確編譯系統(tǒng)環(huán)境的前提下,需要一個輸入丐巫,這可能是文件也可能是一個路徑谈况,此時SCons提供了一個Entry函數(shù)勺美,用于返回一個文件節(jié)點或者路徑節(jié)點。

xyzzy = Entry('xyzzy')

? 這里返回的xyzzy節(jié)點碑韵,將會在其第一次被調(diào)用的時候赡茸,轉(zhuǎn)化為文件節(jié)點或路徑節(jié)點。

5.3 打印節(jié)點文件名稱

? 大多數(shù)情況下我們需要調(diào)用節(jié)點去打印其內(nèi)部的文件名稱祝闻,但是請注意此時的對象是節(jié)點列表占卧,而非文件對象,因此打印的時候需要增加下標(biāo)訪問:

object_list = Object('hello.c')
program_list = Program(object_list)
print("The object file is: %s"%object_list[0])
print("The program file is: %s"%program_list[0])

? 在POSIX系統(tǒng)輸出如下:

> scons -Q
The object files is: hello.o
The program file is: hello
cc - o hello.o -c hello.c
cc -o hello hello.o

? 在Windows系統(tǒng)輸出如下:

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

? 請注意联喘,在上面的示例中屉栓,object_list[0]從列表中提取了一個實際的Node對象,Python的print語句將該對象轉(zhuǎn)換為要打印的字符串耸袜。

5.4 將節(jié)點對象轉(zhuǎn)換為字符串

? 如上節(jié)介紹所示,我們可以直接打印節(jié)點的文件信息牲平,但是如果您想得到一個節(jié)點字符串堤框,而非列表,則可以通過python內(nèi)置的str函數(shù)實現(xiàn)纵柿。舉例而言蜈抓,如果您希望使用Python的os.path.exists來確認(rèn)文件是否存在,您可以采用如下方式:

import os.path
program_list = Program('hello.c')
program_name = str(program_list[0])
if not os.path.exists(program_name):
    print("%s doses not exist!"%program_name)

? 此時昂儒,在POSIX系統(tǒng)中將會得到如下輸出:

> scons -Q
hello does not exist!
cc -o hello.o -c hello.c
cc - o hello hello.o

5.5 GetBuildPath: 通過節(jié)點或字符串獲取路徑

? env.GetBuildPath(file_or_list)返回節(jié)點或者字符串(描述路徑)的路徑沟使,當(dāng)然輸入?yún)?shù)也可以是列表,這將會返回路徑的列表信息渊跋。如果輸入是單個節(jié)點的話,則相當(dāng)于調(diào)用了str(node)。字符串參數(shù)可以被初始化在Environment函數(shù)參數(shù)列表中寺旺,此時將會被傳遞到后續(xù)的調(diào)用函數(shù)中:

env = Environment(VAR="value")
n = File("foo.c")
print(env.GetBuildPath([n, "sub/dir/$VAR"]))

? 打印信息如下:

> scons -Q
['foo.c', 'sub/dir/value']
scons: '.' is up to date

? GetBuildPath函數(shù)也可以被默認(rèn)的Environment環(huán)境調(diào)用男窟,而非特殊指定。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒿囤,一起剝皮案震驚了整個濱河市客们,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌材诽,老刑警劉巖底挫,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脸侥,居然都是意外死亡建邓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門湿痢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涝缝,“玉大人扑庞,你說我怎么就攤上這事【艽” “怎么了罐氨?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滩援。 經(jīng)常有香客問我栅隐,道長,這世上最難降的妖魔是什么玩徊? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任租悄,我火速辦了婚禮,結(jié)果婚禮上恩袱,老公的妹妹穿的比我還像新娘泣棋。我一直安慰自己,他們只是感情好畔塔,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布潭辈。 她就那樣靜靜地躺著,像睡著了一般澈吨。 火紅的嫁衣襯著肌膚如雪把敢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天谅辣,我揣著相機(jī)與錄音修赞,去河邊找鬼。 笑死桑阶,一個胖子當(dāng)著我的面吹牛柏副,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚣录,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼搓扯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了包归?” 一聲冷哼從身側(cè)響起锨推,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎公壤,沒想到半個月后换可,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡厦幅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年沾鳄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片确憨。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡译荞,死狀恐怖瓤的,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吞歼,我是刑警寧澤圈膏,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站篙骡,受9級特大地震影響稽坤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糯俗,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一尿褪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧得湘,春花似錦杖玲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跪帝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間些阅,已是汗流浹背伞剑。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留市埋,地道東北人黎泣。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像缤谎,于是被迫代替她去往敵國和親抒倚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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