私は、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も可能です。しかし、私は余分な行動がこれに受け入れられると思う。
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を呼び出しても、明確なコンパイルを行っても余分な出力は得られません。私は何を逃したのですか? –
bazelに '--experimental_action_listener = //:cppcheck_c_cpp'を渡してビルドを行う必要があります。 また、CとC++は両方とも 'CppCompile'になります。 –