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 ケースで二重引用符を取り除くことはまだ可能ですか?
ありがとう、アンディ