2011-11-24 74 views
5

我正在嘗試使用SCons準備構建系統。我想在代碼生成階段使用clang,對於其他所有代碼使用自定義編譯器工具鏈。配置SCons使用單獨的工具進行代碼生成和組裝

默認情況下,SCons配置沒有生成彙編(.s)文件的明確步驟。

爲了解決這個問題,我創建了自己的Builder,它發出了彙編文件。

code_generator = Builder(action = '$CC -$LOTS_OF_FLAGS -S $SOURCE -o $TARGET', suffix = '.s') 
env.Append(BUILDERS = {'CodeGenerator':code_generator}) 

然後我用這個Builder我的源文件,並通過所產生的NodeListProgram

for file in Glob('*.c'): 
    sources += env.CodeGenerator(file) 

env.Program('say_hello', sources) 

這個效果很好,當我不修改任何變量。我使用gcc獲得可執行文件。

但是,當我嘗試替換適當的變量以使SCons使用自定義工具鏈(使用env.Replace(CC='clang')...)時,只生成一個程序集文件。我的自定義Builder不叫上其他任何文件和SCons的努力只有一個目標文件鏈接(這顯然失敗)

  1. 我怎樣才能讓SCons的運行上的所有文件生成器,包括用於連接這些 目標文件?
  2. 有沒有更好的方法來完成我想要做的事情?我剛剛開始與SCons合作。

回答

3

Builder類有大量關鍵字參數記錄在SCons man page上,這些在用戶手冊中未提及。這是SCons文檔中的一個弱點,並且已經有一段時間了。

在這種情況下,我相信你正在尋找single_source關鍵字參數其中:

指定此生成器希望每次調用一個源文件。 給出多個不含目標文件的源文件導致 隱式地多次調用該構建器(每個源給出一個源 一次)。

查看Builder的源代碼single_source需要評估爲True(或等價物)。所以你的代碼可以用一個很小的修改來重寫。

env = Environment() 
code_generator = Builder(action = '$CC $CCFLAGS -S $SOURCE -o $TARGET', 
         single_source = 1, 
         suffix = '.s') 
env.Replace(CC= 'clang') 
env.Append(BUILDERS = {'CodeGenerator' : code_generator}) 
sources = env.CodeGenerator(file) 
env.Program('say_hello', sources) 

提供用於與文件的目錄:foo.c的和bar.c產生輸出:

scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
clang -S bar.c -o bar.s 
as -o bar.o bar.s 
clang -S foo.c -o foo.s 
as -o foo.o foo.s 
clang -o say_hello bar.o foo.o 
scons: done building targets. 
+0

甚至建議修復後,我一直面臨着同樣的問題。但是,感謝關於手冊頁中額外文檔的評論。你是對的,我只是指用戶指南。如果我成功,我會進一步調查並報告。 – Buzzy

+0

您正在使用哪個版本的scons? –

+0

在Mac上安裝使用Homebrew:腳本:v2.1.0.r5357 引擎:v2.1.0。r5357 – Buzzy