0

flex ツールを含むビルド ステップを含むプロジェクトに scons (V1.1.0) を使用しています。

scons のデフォルト ルールでの flex コマンドの定義は次のとおりです。

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

変更したくないもの。

ただし、-t を指定すると、出力ファイルにファイル "<stdout>" を参照する #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 の場合の空白が原因で二重引用符が使用されたと推測できます。おそらく、コマンドの 1 つの論理パラメーターにコンテンツをバインドしようとするためです。

私の差し迫った問題は --outfile を使用することで解決されますが、私の質問は -o ケースで二重引用符を取り除くことはまだ可能ですか?

ありがとう、アンディ

4

1 に答える 1

0

SCons 1.1.0 は、現時点では非常に古いものです。2.3.0 を試すことをお勧めします。しかし、あなたの分析は正しいです。オプション (つまり、単一のオプション) にスペースが含まれている場合、SCons はそれを引用して、単一のオプションのままにします。しかし、選択肢は 1 つではありません。あなたは本当に2つ持っています、'-o'そして'$TARGET'。このように分解するだけでうまくいきます。

于 2013-10-08T20:18:23.240 に答える