我已經寫了一些東西,使用額外的行動,產生由鐺,整潔和其他工具使用的compile_commands.json文件,我想要做這樣的事情的時候iwyu我去接近它。我還沒有使用過其他工具,但我認爲它們也適用於相同的模式。
其基本思想是運行一個額外的動作,爲每個文件(也稱爲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並註冊了'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'。 –