aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2015-12-23 15:50:20 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-12-28 19:43:59 +0000
commitbcaeb6430046aa4cdb5b7bf7c83d2e20d311334a (patch)
tree87970a4bc8c8dea0f6c29b020845dd32c19d1347
parent3d776afc73370d667c271e20ca9c0d885b629fb7 (diff)
Allow Skylark rules and aspects to contribute to output groups.
-- MOS_MIGRATED_REVID=110840166
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java22
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java54
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",