Bazel中cc_proto_library规则的实现代码位于哪个位置?
cc_proto_library 实现位置
你在src/main/starlark/builtins_bzl/common/cc、src/main/starlark/builtins_bzl/common/proto根目录找不到该规则属于正常情况,它的实现分两部分:
- 正在逐步替换旧实现的Starlark版本代码位于
src/main/starlark/builtins_bzl/common/proto/cc/cc_proto_library.bzl,属于proto规则下的C++语言绑定子模块,没有直接放在cc或proto的公共根目录下 - 旧版本的原生Java实现位于
src/main/java/com/google/devtools/build/lib/rules/cpp/CcProtoLibrary.java,目前版本中该实现仍承担部分底层逻辑,待Starlark版本完全稳定后会被移除 - 规则的对外导出注册逻辑在
src/main/starlark/builtins_bzl/exports.bzl中完成,和其他内置规则的注册流程一致
cc_proto_library 工作原理
该规则属于典型的跨语言绑定胶水规则,本身不实现C++编译或proto解析的核心逻辑,仅做两边能力的串联,核心流程如下:
- 依赖收集阶段:遍历所有直接、间接依赖的
proto_library规则输出的ProtoInfo对象,去重后得到所有需要处理的proto源文件集合,同时排除已经被其他依赖生成过C++代码的proto文件,避免重复编译 - 代码生成阶段:调用当前配置的proto工具链中的protoc编译器,加载C++代码生成插件,为每个proto文件生成对应的
.pb.h头文件、.pb.cc源文件,如果配置了gRPC插件还会额外生成对应的gRPC stub代码 - 编译输出阶段:将生成的所有C源文件、头文件传入C编译流程,复用
cc_library的底层编译逻辑,按照当前C工具链的配置编译为静态库、动态库产物,对外输出标准的CcInfo提供者,和普通cc_library的输出完全兼容,可以直接被cc_binary、cc_test等C规则依赖 - 自动依赖处理:规则会默认将C++版本的protobuf运行时库加入链接依赖,不需要使用者手动额外配置依赖
内容的提问来源于stack exchange,提问作者daohu527
相关产品推荐
相关产品推荐

