diff options
Diffstat (limited to 'src/main')
7 files changed, 113 insertions, 36 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java index 3a2d65a91d..2f09dbbf03 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java @@ -29,12 +29,13 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.events.Location; +import com.google.devtools.build.lib.packages.BuiltinProvider; import com.google.devtools.build.lib.packages.NativeInfo; -import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; -import com.google.devtools.build.lib.syntax.Environment; +import com.google.devtools.build.lib.skylarkbuildapi.OutputGroupInfoApi; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.EvalUtils; +import com.google.devtools.build.lib.syntax.SkylarkDict; import com.google.devtools.build.lib.syntax.SkylarkIndexable; import com.google.devtools.build.lib.syntax.SkylarkNestedSet; import java.util.HashSet; @@ -60,10 +61,10 @@ import javax.annotation.Nullable; @Immutable @AutoCodec public final class OutputGroupInfo extends NativeInfo - implements SkylarkIndexable, Iterable<String> { + implements SkylarkIndexable, Iterable<String>, OutputGroupInfoApi { public static final String SKYLARK_NAME = "output_groups"; - public static NativeProvider<OutputGroupInfo> SKYLARK_CONSTRUCTOR = new Constructor(); + public static final OutputGroupInfoProvider SKYLARK_CONSTRUCTOR = new OutputGroupInfoProvider(); /** * Prefix for output groups that are not reported to the user on the terminal output of Blaze when @@ -258,22 +259,22 @@ public final class OutputGroupInfo extends NativeInfo return outputGroups.keySet(); } - /** A constructor callable from Skylark for OutputGroupInfo. */ - private static class Constructor extends NativeProvider<OutputGroupInfo> { - - private Constructor() { - super(OutputGroupInfo.class, "OutputGroupInfo"); + /** + * Provider implementation for {@link OutputGroupInfoApi.OutputGroupInfoApiProvider}. + */ + public static class OutputGroupInfoProvider extends BuiltinProvider<OutputGroupInfo> + implements OutputGroupInfoApi.OutputGroupInfoApiProvider { + private OutputGroupInfoProvider() { + super("OutputGroupInfo", OutputGroupInfo.class); } @Override - protected OutputGroupInfo createInstanceFromSkylark( - Object[] args, Environment env, Location loc) throws EvalException { - - @SuppressWarnings("unchecked") - Map<String, Object> kwargs = (Map<String, Object>) args[0]; + public OutputGroupInfoApi constructor(SkylarkDict<?, ?> kwargs, Location loc) + throws EvalException { + Map<String, Object> kwargsMap = kwargs.getContents(String.class, Object.class, "kwargs"); ImmutableMap.Builder<String, NestedSet<Artifact>> builder = ImmutableMap.builder(); - for (Map.Entry<String, Object> entry : kwargs.entrySet()) { + for (Map.Entry<String, Object> entry : kwargsMap.entrySet()) { builder.put( entry.getKey(), SkylarkRuleConfiguredTargetUtil.convertToOutputGroupValue( @@ -281,10 +282,5 @@ public final class OutputGroupInfo extends NativeInfo } return new OutputGroupInfo(builder.build()); } - - @Override - public String getErrorMessageFormatForUnknownField() { - return "Output group '%s' not present"; - } } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java index 49bd743e68..93387fa6cc 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java @@ -69,6 +69,7 @@ import com.google.devtools.build.lib.packages.AspectDescriptor; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.BuiltinProvider; import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy; import com.google.devtools.build.lib.packages.ConfiguredAttributeMapper; import com.google.devtools.build.lib.packages.FileTarget; @@ -932,6 +933,15 @@ public final class RuleContext extends TargetContext } /** + * Returns all the declared providers (native and Skylark) for the specified constructor under the + * specified attribute of this target in the BUILD file. + */ + public <T extends Info> Iterable<T> getPrerequisites( + String attributeName, Mode mode, final BuiltinProvider<T> skylarkKey) { + return AnalysisUtils.getProviders(getPrerequisites(attributeName, mode), skylarkKey); + } + + /** * Returns the declared provider (native and Skylark) for the specified constructor under the * specified attribute of this target in the BUILD file. May return null if there is no * TransitiveInfoCollection under the specified attribute. diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkModules.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkModules.java index 3450283635..4ea908d134 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkModules.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkModules.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.analysis.skylark; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.analysis.OutputGroupInfo; import com.google.devtools.build.lib.packages.BazelLibrary; import com.google.devtools.build.lib.packages.SkylarkNativeModule; import com.google.devtools.build.lib.packages.StructProvider; @@ -35,7 +36,8 @@ public final class SkylarkModules { SkylarkCommandLine.class, SkylarkNativeModule.class, SkylarkRuleClassFunctions.class, - StructProvider.STRUCT); + StructProvider.STRUCT, + OutputGroupInfo.SKYLARK_CONSTRUCTOR); /** * Adds bindings for skylark built-ins and non-rules-specific globals of the build API to diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java index b995abf65b..b8c7471065 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java @@ -36,7 +36,6 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ActionsProvider; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.DefaultInfo; -import com.google.devtools.build.lib.analysis.OutputGroupInfo; import com.google.devtools.build.lib.analysis.config.ConfigAwareRuleClassBuilder; import com.google.devtools.build.lib.analysis.config.HostTransition; import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition; @@ -243,19 +242,6 @@ public class SkylarkRuleClassFunctions implements SkylarkRuleFunctionsApi<Artifa ) private static final NativeProvider<?> defaultInfo = DefaultInfo.PROVIDER; - @SkylarkSignature( - name = "OutputGroupInfo", - returnType = Provider.class, - doc = - "A provider that indicates what output groups a rule has.<br>" - + "Instantiate this provider with <br>" - + "<pre class=language-python>" - + "OutputGroupInfo(group1 = <files>, group2 = <files>...)</pre>" - + "See <a href=\"../rules.$DOC_EXT#requesting-output-files\">Requesting output files" - + "</a> for more information." - ) - private static final NativeProvider<?> outputGroupInfo = OutputGroupInfo.SKYLARK_CONSTRUCTOR; - // TODO(bazel-team): Move to a "testing" namespace module. Normally we'd pass an objectType // to @SkylarkSignature to do this, but that doesn't work here because we're exposing an already- // configured BaseFunction, rather than defining a new BuiltinFunction. This should wait for diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java index 1ebd4abd9f..56d4cb76d2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java @@ -38,6 +38,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.BuiltinProvider; import com.google.devtools.build.lib.packages.Info; import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.packages.Rule; @@ -112,6 +113,18 @@ public class AndroidCommon { return builder.build(); } + public static final <T extends Info> Iterable<T> getTransitivePrerequisites( + RuleContext ruleContext, Mode mode, BuiltinProvider<T> key) { + IterablesChain.Builder<T> builder = IterablesChain.builder(); + AttributeMap attributes = ruleContext.attributes(); + for (String attr : TRANSITIVE_ATTRIBUTES) { + if (attributes.has(attr, BuildType.LABEL_LIST)) { + builder.add(ruleContext.getPrerequisites(attr, mode, key)); + } + } + return builder.build(); + } + private final RuleContext ruleContext; private final JavaCommon javaCommon; private final boolean asNeverLink; diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/OutputGroupInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/OutputGroupInfoApi.java new file mode 100644 index 0000000000..13c1f263d3 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/OutputGroupInfoApi.java @@ -0,0 +1,65 @@ +// Copyright 2018 The Bazel Authors. 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.skylarkbuildapi; + +import com.google.devtools.build.lib.events.Location; +import com.google.devtools.build.lib.skylarkinterface.Param; +import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkConstructor; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.SkylarkDict; + +/** + * Interface for an info object that indicates what output groups a rule has. + */ +@SkylarkModule( + name = "OutputGroupInfo", + category = SkylarkModuleCategory.PROVIDER, + doc = "A provider that indicates what output groups a rule has.<br>" + + "See <a href=\"../rules.$DOC_EXT#requesting-output-files\">Requesting output files" + + "</a> for more information." +) +public interface OutputGroupInfoApi extends StructApi { + + /** + * Provider for {@link OutputGroupInfoApi}. + */ + @SkylarkModule(name = "Provider", documented = false, doc = "") + public static interface OutputGroupInfoApiProvider extends ProviderApi { + + @SkylarkCallable( + name = "OutputGroupInfo", + doc = + "Instantiate this provider with <br>" + + "<pre class=language-python>" + + "OutputGroupInfo(group1 = <files>, group2 = <files>...)</pre>" + + "See <a href=\"../rules.$DOC_EXT#requesting-output-files\">Requesting output " + + "files </a> for more information.", + extraKeywords = + @Param( + name = "kwargs", + type = SkylarkDict.class, + defaultValue = "{}", + doc = "Dictionary of arguments."), + useLocation = true, + selfCall = true) + @SkylarkConstructor(objectType = OutputGroupInfoApi.class, + receiverNameForDoc = "OutputGroupInfo") + public OutputGroupInfoApi constructor( + SkylarkDict<?, ?> kwargs, Location loc) throws EvalException; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TopLevelBootstrap.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TopLevelBootstrap.java index 881b5fc2fa..b64d50c477 100644 --- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TopLevelBootstrap.java +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TopLevelBootstrap.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.skylarkbuildapi; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.skylarkbuildapi.OutputGroupInfoApi.OutputGroupInfoApiProvider; import com.google.devtools.build.lib.syntax.Runtime; /** @@ -27,6 +28,7 @@ public class TopLevelBootstrap implements Bootstrap { private final Class<? extends SkylarkNativeModuleApi> skylarkNativeModuleApi; private final Class<? extends SkylarkRuleFunctionsApi<?>> skylarkRuleFunctionsApi; private final StructApi.StructProviderApi structProvider; + private final OutputGroupInfoApiProvider outputGroupInfoProvider; public TopLevelBootstrap( Class<? extends SkylarkBuildApiGlobals> skylarkBuildApiGlobals, @@ -34,13 +36,15 @@ public class TopLevelBootstrap implements Bootstrap { Class<? extends SkylarkCommandLineApi> skylarkCommandLineApi, Class<? extends SkylarkNativeModuleApi> skylarkNativeModuleApi, Class<? extends SkylarkRuleFunctionsApi<?>> skylarkRuleFunctionsApi, - StructApi.StructProviderApi structProvider) { + StructApi.StructProviderApi structProvider, + OutputGroupInfoApiProvider outputGroupInfoProvider) { this.skylarkAttrApi = skylarkAttrApi; this.skylarkBuildApiGlobals = skylarkBuildApiGlobals; this.skylarkCommandLineApi = skylarkCommandLineApi; this.skylarkNativeModuleApi = skylarkNativeModuleApi; this.skylarkRuleFunctionsApi = skylarkRuleFunctionsApi; this.structProvider = structProvider; + this.outputGroupInfoProvider = outputGroupInfoProvider; } @Override @@ -51,5 +55,6 @@ public class TopLevelBootstrap implements Bootstrap { Runtime.setupModuleGlobals(builder, skylarkNativeModuleApi); Runtime.setupModuleGlobals(builder, skylarkRuleFunctionsApi); builder.put("struct", structProvider); + builder.put("OutputGroupInfo", outputGroupInfoProvider); } } |