我阅读了巴泽尔的源代码,并在src/main/starlark/builtins_bzl/common/cc中找到了cc_binary和cc_library。
我还在src/main/starlark/builtins_bzl/common/proto中找到了src/main/starlark/builtins_bzl/common/proto。但我找不到cc_proto_library的实现在哪里。
有人能告诉我它是怎么工作的吗?
发布于 2022-07-06 12:28:11
提示:使用https://source.bazel.build的Bazel导航其源代码。
您可以使用如下查询快速找到任何内置规则的实现:
language:java "implements RuleDefinition" "\"cc_proto_library\")"这将使您了解CcProtoLibraryRule.java定义:
public class CcProtoLibraryRule implements RuleDefinition {
private final CcProtoAspect ccProtoAspect;
public CcProtoLibraryRule(CcProtoAspect ccProtoAspect) {
this.ccProtoAspect = ccProtoAspect;
}
@Override
public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
return builder
.requiresConfigurationFragments(CppConfiguration.class)
/* <!-- #BLAZE_RULE(cc_proto_library).ATTRIBUTE(deps) -->
The list of <a href="protocol-buffer.html#proto_library"><code>proto_library</code></a>
rules to generate C++ code for.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.override(
attr("deps", LABEL_LIST)
.allowedRuleClasses("proto_library")
.allowedFileTypes()
.aspect(ccProtoAspect))
.build();
}
@Override
public Metadata getMetadata() {
return RuleDefinition.Metadata.builder()
.name("cc_proto_library")
.factoryClass(CcProtoLibrary.class)
.ancestors(BaseRuleClasses.NativeActionCreatingRule.class)
.build();
}
}实现是用.factoryClass(CcProtoLibrary.class)定义的。
对于问题的第二部分,"builtins“是一个Bazel内部概念,可以透明地将Bazel规则的Java实现替换为其Starlark等效的Java实现,而无需在构建文件中添加任何load语句。这对于将现有用户迁移到Starlark实现而不造成用户影响是必要的。
https://stackoverflow.com/questions/72877119
复制相似问题