diff options
author | Dmitry Lomov <dslomov@google.com> | 2015-12-23 15:50:20 +0000 |
---|---|---|
committer | Kristina Chodorow <kchodorow@google.com> | 2015-12-28 19:43:59 +0000 |
commit | bcaeb6430046aa4cdb5b7bf7c83d2e20d311334a (patch) | |
tree | 87970a4bc8c8dea0f6c29b020845dd32c19d1347 | |
parent | 3d776afc73370d667c271e20ca9c0d885b629fb7 (diff) |
Allow Skylark rules and aspects to contribute to output groups.
--
MOS_MIGRATED_REVID=110840166
3 files changed, 94 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java index ad7ff5e088..124f0f22c7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java @@ -41,6 +41,8 @@ import com.google.devtools.build.lib.syntax.SkylarkNestedSet; import com.google.devtools.build.lib.syntax.SkylarkType; import com.google.devtools.build.lib.syntax.Type; +import java.util.Map; + /** * A helper class to build Rule Configured Targets via runtime loaded rule implementations * defined using the Skylark Build Extension Language. @@ -148,6 +150,20 @@ public final class SkylarkRuleConfiguredTargetBuilder { return executable; } + private static void addOutputGroups(Object value, Location loc, + RuleConfiguredTargetBuilder builder) + throws EvalException { + Map<String, SkylarkNestedSet> outputGroups = SkylarkType + .castMap(value, String.class, SkylarkNestedSet.class, "output_groups"); + + for (String outputGroup : outputGroups.keySet()) { + SkylarkNestedSet objects = outputGroups.get(outputGroup); + builder.addOutputGroup(outputGroup, + SkylarkType.cast(objects, SkylarkNestedSet.class, Artifact.class, loc, + "Output group '%s'", outputGroup).getSet(Artifact.class)); + } + } + private static ConfiguredTarget addStructFields(RuleContext ruleContext, RuleConfiguredTargetBuilder builder, Object target, Artifact executable) throws EvalException { @@ -169,6 +185,8 @@ public final class SkylarkRuleConfiguredTargetBuilder { dataRunfiles = cast("data_runfiles", struct, Runfiles.class, loc); } else if (key.equals("default_runfiles")) { defaultRunfiles = cast("default_runfiles", struct, Runfiles.class, loc); + } else if (key.equals("output_groups")) { + addOutputGroups(struct.getValue(key), loc, builder); } else if (!key.equals("executable")) { // We handled executable already. builder.addSkylarkTransitiveInfo(key, struct.getValue(key), loc); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java index c2d489cf86..ee77e007e8 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredAspect; import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -30,6 +31,10 @@ import com.google.devtools.build.lib.syntax.Environment; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.EvalExceptionWithStackTrace; import com.google.devtools.build.lib.syntax.Mutability; +import com.google.devtools.build.lib.syntax.SkylarkNestedSet; +import com.google.devtools.build.lib.syntax.SkylarkType; + +import java.util.Map; /** * A factory for aspects that are defined in Skylark. @@ -86,6 +91,9 @@ public class SkylarkAspectFactory implements ConfiguredAspectFactory { SkylarkClassObject struct = (SkylarkClassObject) aspectSkylarkObject; Location loc = struct.getCreationLoc(); for (String key : struct.getKeys()) { + if (key.equals("output_groups")) { + addOutputGroups(struct.getValue(key), loc, builder); + } builder.addSkylarkTransitiveInfo(key, struct.getValue(key), loc); } ConfiguredAspect configuredAspect = builder.build(); @@ -100,6 +108,20 @@ public class SkylarkAspectFactory implements ConfiguredAspectFactory { } } + private static void addOutputGroups(Object value, Location loc, + ConfiguredAspect.Builder builder) + throws EvalException { + Map<String, SkylarkNestedSet> outputGroups = SkylarkType + .castMap(value, String.class, SkylarkNestedSet.class, "output_groups"); + + for (String outputGroup : outputGroups.keySet()) { + SkylarkNestedSet objects = outputGroups.get(outputGroup); + builder.addOutputGroup(outputGroup, + SkylarkType.cast(objects, SkylarkNestedSet.class, Artifact.class, loc, + "Output group '%s'", outputGroup).getSet(Artifact.class)); + } + } + private void addAspectToStackTrace(ConfiguredTarget base, EvalException e) { if (e instanceof EvalExceptionWithStackTrace) { ((EvalExceptionWithStackTrace) e) diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java index ab9c57ae0f..a831c73b9c 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java @@ -19,12 +19,15 @@ import static com.google.common.truth.Truth.assertThat; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.eventbus.EventBus; +import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.BuildView.AnalysisResult; import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.OutputGroupProvider; import com.google.devtools.build.lib.analysis.SkylarkProviders; import com.google.devtools.build.lib.analysis.ViewCreationFailedException; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.skyframe.AspectValue; import com.google.devtools.build.lib.syntax.SkylarkNestedSet; @@ -149,6 +152,57 @@ public class SkylarkAspectsTest extends BuildViewTestCase { } @Test + public void testAspectWithOutputGroups() throws Exception { + scratch.file( + "test/aspect.bzl", + "def _impl(target, ctx):", + " f = target.output_group('_hidden_top_level')", + " return struct(output_groups = { 'my_result' : f })", + "", + "MyAspect = aspect(", + " implementation=_impl,", + " attr_aspects=['deps'],", + ")"); + scratch.file( + "test/BUILD", + "java_library(", + " name = 'xxx',", + " srcs = ['A.java'],", + ")"); + + AnalysisResult analysisResult = + update( + ImmutableList.of("//test:xxx"), + ImmutableList.of("test/aspect.bzl%MyAspect"), + false, + LOADING_PHASE_THREADS, + true, + new EventBus()); + assertThat( + transform( + analysisResult.getTargetsToBuild(), + new Function<ConfiguredTarget, String>() { + @Nullable + @Override + public String apply(ConfiguredTarget configuredTarget) { + return configuredTarget.getLabel().toString(); + } + })) + .containsExactly("//test:xxx"); + AspectValue aspectValue = analysisResult.getAspects().iterator().next(); + OutputGroupProvider outputGroupProvider = + aspectValue.getConfiguredAspect().getProvider(OutputGroupProvider.class); + assertThat(outputGroupProvider).isNotNull(); + NestedSet<Artifact> names = outputGroupProvider.getOutputGroup("my_result"); + assertThat(names).isNotEmpty(); + NestedSet<Artifact> expectedSet = getConfiguredTarget("//test:xxx") + .getProvider(OutputGroupProvider.class) + .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); + assertThat(names).containsExactlyElementsIn(expectedSet); + } + + + @Test public void testAspectsFromSkylarkRules() throws Exception { scratch.file( "test/aspect.bzl", |