2017-06-03 3 views
1

どのようなオプションBazelは、C/C++を呼び出して、新規または拡張既存のターゲットを作成するため提供しないをサポートしていますか?Bazelチェッカーは

genruleを使用する必要がありますか、それとも他のターゲットルールがありますか?

https://bazel.build/versions/master/docs/be/extra-actions.html私の唯一の実行可能な選択はここですか?

航空機や自動車などのセキュリティに重要なソフトウェア業界では、これらの呼び出しの結果を使用していわゆるメトリックレポートを収集するのが一般的です。

このような場合、これらのlintersへのコールには、これらのメトリックレポートコレクタのビルドアクションによってさらに処理される出力が必要です。そのような場合、Bazelの「余分な行動」を再利用する便利な方法は見つけられません。いずれかのアイデアですか?

答えて

1

私は、clang-tidyや他のツールで使用されているcompile_commands.jsonファイルを生成するために余分なアクションを使用するものを書いています。私はそれに慣れると同じ種類のことをしたいと思います。私はそれらの他のツールを使用していないが、私は彼らも同じパターンに合うと仮定します。

基本的な考え方は、各ファイル(別名C/C++コンパイルコマンド)の出力を生成し、後で(Bazelの外で)すべての出力ファイルを見つけて集約する追加のアクションを実行することです。合理的に完全な例は、参考としてhereです。基本的には、(Pythonで書かれた)アクションリスナは、余分なアクションプロトをデコードし、ソースファイル、コンパイラオプションなどを抽出します。

action = extra_actions_base_pb2.ExtraActionInfo() 
with open(argv[1], 'rb') as f: 
    action.MergeFromString(f.read()) 
cpp_compile_info = action.Extensions[extra_actions_base_pb2.CppCompileInfo.cpp_compile_info] 
compiler = cpp_compile_info.tool 
options = ' '.join(cpp_compile_info.compiler_option) 
source = cpp_compile_info.source_file 
output = cpp_compile_info.output_file 
print('%s %s -c %s -o %s' % (compiler, options, source, output)) 

あなたは余分なアクションoutput templateを与えた場合、それはにその出力を書き込むことができますファイル。出力ファイルに特有の名前を付けると、それらをすべて出力ツリーで見つけて、必要に応じてそれらを一緒にマージすることができます。

もっと洗練されたオプションは、bazelクエリ--output=protoを使用して、そこから興味のあるターゲットの余分なアクション出力ファイル名を計算するコードを書くことです。そのためにはより多くのコードを書く必要がありますが、出力ツリーの古い出力ファイルには、集計時に誤って含まれることはありません。

FWIW、Aspectsも可能です。しかし、私は余分な行動がこれに受け入れられると思う。

+0

https://github.com/nordlow/build-system-benchmark/blob/master/BUILDの2つの追加アクションを追加し、 'cppcheck_cat'を' CCompile'(推測された名前)、 ' CcCompile'(推測された名前)、および 'CppCompile'イベントです。しかし、https://github.com/nordlow/build-system-benchmark/blob/master/test_bazel.shを呼び出しても、明確なコンパイルを行っても余分な出力は得られません。私は何を逃したのですか? –

+1

bazelに '--experimental_action_listener = //:cppcheck_c_cpp'を渡してビルドを行う必要があります。 また、CとC++は両方とも 'CppCompile'になります。 –

関連する問題