2017-06-03 70 views
1

做巴澤勒提供用於創建新的或擴展調用C/C++現有的目標是什麼選項 - 碼檢查如巴澤爾跳棋支持

  • QAC
  • cppcheck
  • iwyu

我需要使用genrule還是有其他一些目標規則?

https://bazel.build/versions/master/docs/be/extra-actions.html我唯一可行的選擇嗎?

在諸如航空和汽車等安全關鍵軟件行業,使用這些調用的結果來收集所謂的「度量報告」非常普遍。

在這些情況下,對這些短尾的調用必須具有這些度量報表收集器的構建操作進一步處理的輸出。在這種情況下,我找不到重用巴澤爾「額外行動」的有用方法。任何一個想法?

回答

1

我已經寫了一些東西,使用額外的行動,產生由鐺,整潔和其他工具使用的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是另一種可能性。不過,我認爲額外的行動對此可以接受。

+0

我在這裏添加了兩個額外的動作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時,我沒有得到任何額外的輸出。我錯過了什麼? –

+1

您需要使用傳遞給bazel的'--experimental_action_listener = //:cppcheck_c_cpp'來執行構建。 另外,C和C++都是'CppCompile'。 –