Bazel为创建新的或扩展调用C / C ++的现有目标提供了哪些选项 - 代码检查器,如
我是否需要使用genrule
或者是否有其他目标规则?
https://bazel.build/versions/master/docs/be/extra-actions.html我唯一可行的选择吗?
在安全关键软件行业,例如航空和汽车行业,使用这些调用的结果来收集所谓的“度量报告”非常普遍。
在这些情况下,对此类链接的调用必须具有由这些度量报告收集器的构建操作进一步处理的输出。在这种情况下,我找不到重用Bazel"额外行动"的有用方法。任何一个想法?
答案 0 :(得分:1)
我写了一些使用额外操作生成clang-tidy和其他工具使用的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是另一种可能性。但是,我认为额外的行动对此可以接受。