2010-11-14 46 views
3

我有一個生成器看起來像這樣:

sFooBuilder = Builder(action = os.path.join(rBuildPath, 'foo_binary') + ' $SOURCE',   
         suffix = '.c', 
         src_suffix = '.foo' 
     ) 

由於二元我靠不採取$ TARGET參數並會產生一個執行錯誤,否則我只指定一個$ SOURCE參數。 會發生什麼情況是將二進制文件的輸出文件放在src目錄中而不是變體dir中。然而,SCons期望變體目錄中的輸出文件。

您呼叫scons的每一次,構建目標上方因執行以下操作:

scons: building `variant_dir/foo.c' because it doesn't exist 

而只是通過一個命令生成的文件複製到變種目錄無法正常工作或

scons: warning: Two different environments were specified for target foo.c, 
     but they appear to have the same action: foo_binary $SOURCE 
File "sconscript", 
scons: *** Multiple ways to build the same target were specified for: foo.c foo.foo'] and from ['foo.c']) 
File "/sconscript", 

我的問題是,如果這是預期的行爲?
是否有任何建議(除了修復使用的二進制文件)如何解決這種情況?不幸的是,我找不到任何涉及上述情況的文件。

在此先感謝!

+1

您有邏輯錯誤。您有多個構建命令來創建相同的目標。我無法多說,因爲在完成構建腳本的完整列表後,可能會發現某些錯誤。 – Torsten 2012-08-07 07:00:24

回答

2

foo_binary需要input.foo並在輸入的同一目錄下生成output.c文件?你打電話給建設者怎麼樣?喜歡這個? env.FooBuilder('foo.c','foo.foo')。

當使用變體dir時,scons預計構建器的輸出將轉至variant_dir/foo.c。當它失敗時,它認爲你已經刪除了該文件並重新創建它。我敢打賭,第一個構建也失敗了,但第二個構建是可行的,因爲scons發現源代碼樹中的「foo.c」。

聽起來最簡單的方法是讓foo_binary在源目錄中生成輸出,然後再移動它。你說過你試過這個,但你也許是把它作爲一個單獨的步驟,而不是在同一個建造者中。在那種情況下,它會混淆路徑。這應該做的伎倆:

sFooBuilder = Builder(action=[ 
      os.path.join(rBuildPath, 'foo_binary') + ' $SOURCE', 
      Move('$TARGET.dir', '$TARGET.srcpath')], 
      suffix = '.c', src_suffix = '.foo') 

這將運行在同一個製造商的行動2步:

foo_binary foo.foo 
mv foo.c variant_dir 

現在該建築工地做你說什麼它(創建於變異目錄的foo.c)它應該都按預期工作。

另一種解決方案是將輸入文件複製到構建目錄,但在source和build目錄中使用相同的文件名不可能。 SCons有點困惑,並首先拉入源目錄文件。

如果你使用了不同的名字,它將是可行的(foo.foo.in複製到變種dir中的foo.foo,然後將其轉換爲foo.c),但看起來有點混亂。