2013-09-30 76 views
0

我使用scons(V1.1.0)作爲包含涉及flex工具的構建步驟的項目。scons用雙引號包圍選項

在scons的默認規則flex命令的定義是:

env["LEX"]  = env.Detect("flex") or "lex" 
env["LEXFLAGS"] = SCons.Util.CLVar("") 
env["LEXCOM"] = "$LEX $LEXFLAGS -t $SOURCES > $TARGET" 

,我不想改變。

但是,由於-t會在輸出文件中創建引用文件「<標準輸出>」的#line指令,所以會混淆後續的gcov處理。

作爲一個解決方案,我發現-o可以用來覆蓋flex生成到#line指令中的文件名(由於顯然具有優先權的-t選項,它仍然在stdout上生成它的輸出)。

爲了實現這個目標,我在項目的SConscript文件添加此:

env.AppendUnique(LEXFLAGS = ['-o $TARGET','-c'],delete_existing=1) 

我添加了-c選項(什麼都不做),只顯示與它是如何與-O相比處理的差異。

,根據權利調試打印在SConscript文件的結果在下面的(如預期):

repr(env["LEXFLAGS"]) = ['-o $TARGET', '-c'] 

這導致下面的命令行,根據scons的日誌:

flex "-o build/myfile.cpp" -c -t src/myfile.ll > build/myfile.cpp 

所以-c選項根據需要進入命令行,但-o選項及其文件名參數有雙引號,在擴展LEXFLAGS變量時必須由scons創建。

當我使用這個定義LEXFLAGS代替:

env.AppendUnique(LEXFLAGS = ['--outfile=$TARGET','-c'],delete_existing=1) 

得到的命令行工作根據需要:

flex --outfile=build/myfile.cpp -c -t src/myfile.ll > build/myfile.cpp 

因此可以推測,在-o情況空白造成雙引用將被使用,可能試圖將內容綁定到一個命令的邏輯參數中。

因此,雖然我的直接問題是通過使用--outfile解決的,但我的問題仍然是可以在-o情況下刪除雙引號嗎?

感謝, 安迪

回答

0

SCons的1.1.0是在這一點上非常老。我建議嘗試2.3.0。但你的分析是正確的;如果一個選項(即一個選項)中有一個空格,SCons會引用它,以便它保持單一選項。但是你沒有單一的選擇;你真的有兩個,'-o''$TARGET'。只要把它分開就行了。