【发布时间】:2021-11-20 05:08:21
【问题描述】:
我有一个代码分析工具,我想为每个 cc_library(以及 cc_binary,在问题的其余部分默示)运行它。该工具有一个 CLI 接口:
- 一个工具项目文件
- 编译器细节,例如类型大小、内置函数、宏等。
- 要分析的文件
- 文件路径,包括,定义
- 规则适用(不适用)
- 要添加到项目中的文件
- 用于将文件与构建数据同步的选项
- JSON 编译数据库
- 解析构建日志
- 分析并生成分析报告
我一直在研究如何将其集成到 Bazel 中,以便自动更新要分析的文件以及相关的包含和定义,并正确缓存任何分析结果。生成 JSON 编译数据库(使用第三方库)或解析构建日志都需要单独运行和更新源代码树。对于这个问题,我认为这是我正在尝试删除的一种解决方法。
到目前为止,我尝试使用aspects,向任何库添加分析方面。总体思路是拥有一个包含库不变配置的基础项目文件,附加 cc_library 文件进行分析,最后触发分析生成报告。但我在执行时遇到了麻烦,我什至不确定这是否可行。
这是我目前的切面实现,尝试遍历 cc_library 属性和目标编译上下文:
def _print_aspect_impl(target, ctx):
# Make sure the rule has a srcs attribute
if hasattr(ctx.rule.attr, 'srcs'):
# Iterate through the files
for src in ctx.rule.attr.srcs:
for f in src.files.to_list():
if f.path.endswith(".c"):
print("file: ")
print(f.path)
print("includes: ")
print(target[CcInfo].compilation_context.includes)
print("quote_includes: ")
print(target[CcInfo].compilation_context.quote_includes)
print("system_includes: ")
print(target[CcInfo].compilation_context.system_includes)
print("define: " + define)
print(ctx.rule.attr.defines)
print("local_defines: ")
print(ctx.rule.attr.local_defines)
print("") # empty line to separate file prints
return []
我想不通的是如何在编译库时获取所有包含和定义:
- 从依赖的库中递归
- copts,定义,包括
- 来自工具链
- 功能,cxx_builtin_include_directories
问题:
- 如何获得丢失的标志,继续介绍的技术?
- 我能否以某种方式检索编译操作命令字符串?
- 使用构建日志 API 附加到分析项目
- 完全是其他解决方案?
- 也许用
cc_toolchain代替aspects可以做些什么...
- 也许用
【问题讨论】:
标签: bazel