diff options
author | 2015-09-01 21:17:59 +0000 | |
---|---|---|
committer | 2015-09-02 00:58:30 +0000 | |
commit | 0883ff0736eb03e0ca0a0cc7c9280ce76d900ae5 (patch) | |
tree | 53c3044c0b54f9c8bb2f78abdb33a4d139e300ff /src/main/java/com/google/devtools/build | |
parent | e36009f3f87acbedd6decbb601fa2c9c08608334 (diff) |
Add a BazelProtoLibrary representing a collection of .proto files.
--
MOS_MIGRATED_REVID=102079110
Diffstat (limited to 'src/main/java/com/google/devtools/build')
3 files changed, 142 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index f2e2c2b1b0..488015874c 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -114,6 +114,7 @@ import com.google.devtools.build.lib.rules.objc.ObjcOptionsRule; import com.google.devtools.build.lib.rules.objc.ObjcProtoLibraryRule; import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses; import com.google.devtools.build.lib.rules.objc.ObjcXcodeprojRule; +import com.google.devtools.build.lib.rules.proto.BazelProtoLibraryRule; import com.google.devtools.build.lib.rules.python.PythonConfigurationLoader; import com.google.devtools.build.lib.rules.python.PythonOptions; import com.google.devtools.build.lib.rules.workspace.BindRule; @@ -249,6 +250,7 @@ public class BazelRuleClassProvider { builder.addRuleDefinition(new BazelShLibraryRule()); builder.addRuleDefinition(new BazelShBinaryRule()); builder.addRuleDefinition(new BazelShTestRule()); + builder.addRuleDefinition(new BazelProtoLibraryRule()); builder.addRuleDefinition(new CcToolchainRule()); builder.addRuleDefinition(new CcToolchainSuiteRule()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java new file mode 100644 index 0000000000..309f7d29fa --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java @@ -0,0 +1,55 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.proto; + +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; +import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.RunfilesProvider; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; + +/** + * An implementation for the "proto_library" rule. + */ +public class BazelProtoLibrary implements RuleConfiguredTargetFactory { + + @Override + public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { + ImmutableList<Artifact> protoSources = + ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list(); + ImmutableList<Artifact> directProtoSources = ProtoCommon.getDirectProtoSources( + ruleContext, protoSources); + ProtoCommon.checkSourceFilesAreInSamePackage(ruleContext); + + NestedSet<Artifact> transitiveImports = + ProtoCommon.collectTransitiveImports(ruleContext, protoSources); + + RunfilesProvider runfilesProvider = + ProtoCommon.createRunfilesProvider(transitiveImports, ruleContext); + // TODO(bazel-team): this second constructor argument is superfluous and should be removed. + ProtoSourcesProvider sourcesProvider = + new ProtoSourcesProvider(transitiveImports, transitiveImports, directProtoSources); + + return new RuleConfiguredTargetBuilder(ruleContext) + .add(RunfilesProvider.class, runfilesProvider) + .addProvider(ProtoSourcesProvider.class, sourcesProvider) + .addSkylarkTransitiveInfo(ProtoSourcesProvider.SKYLARK_NAME, sourcesProvider) + .build(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java new file mode 100644 index 0000000000..b8e190c1f3 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java @@ -0,0 +1,85 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.proto; + +import static com.google.devtools.build.lib.packages.Attribute.attr; +import static com.google.devtools.build.lib.packages.Type.LABEL_LIST; + +import com.google.devtools.build.lib.analysis.BaseRuleClasses; +import com.google.devtools.build.lib.analysis.RuleDefinition; +import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; +import com.google.devtools.build.lib.packages.RuleClass; +import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.util.FileType; + +/** + * Rule definition for the proto_library rule. + */ +public final class BazelProtoLibraryRule implements RuleDefinition { + + @Override + public RuleClass build(Builder builder, final RuleDefinitionEnvironment env) { + + return builder + .setUndocumented() + .setOutputToGenfiles() + /* <!-- #BLAZE_RULE(proto_library).ATTRIBUTE(deps) --> + The list of other <code>proto_library</code> + rules that the target depends upon. + ${SYNOPSIS} + A <code>proto_library</code> may only depend on other + <code>proto_library</code> targets. + It may not depend on language-specific libraries. + <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ + .override(attr("deps", LABEL_LIST) + .allowedRuleClasses("proto_library") + .allowedFileTypes()) + /* <!-- #BLAZE_RULE(proto_library).ATTRIBUTE(srcs) --> + The list of <code>.proto</code> files that are processed to create the target. + ${SYNOPSIS} + This is usually a non empty list. One usecase where <code>srcs</code> can be + empty is an <i>alias-library</i>. This is a proto_library rule having one or + more other proto_library in <code>deps</code>. This pattern can be used to + e.g. export a public api under a persistent name. + <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ + .add(attr("srcs", LABEL_LIST) + .direct_compile_time_input() + .allowedFileTypes(FileType.of(".proto"))) + .advertiseProvider(ProtoSourcesProvider.class) + .build(); + } + + @Override + public Metadata getMetadata() { + return RuleDefinition.Metadata.builder() + .name("proto_library") + .ancestors(BaseRuleClasses.RuleBase.class) + .factoryClass(BazelProtoLibrary.class) + .build(); + } +} + +/*<!-- #BLAZE_RULE (NAME = proto_library, TYPE = LIBRARY, FAMILY = Protocol Buffer) --> + +${ATTRIBUTE_SIGNATURE} + +<p>Use <code>proto_library</code> to define libraries of protocol buffers + which may be used from multiple languages. A <code>proto_library</code> may be listed + in the <code>deps</code> clause of supported rules, such as <code>objc_proto_library</code>. +</p> + +${ATTRIBUTE_DEFINITION} + +<!-- #END_BLAZE_RULE -->*/ |