我使用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情況下刪除雙引號嗎?
感謝, 安迪