aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-02-09 21:53:57 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-02-10 10:26:16 +0000
commit492472fc8232775109a7bc9fae28dd2d4c752e63 (patch)
treea513de825efa68e329c1d0ec0ef77f11f3414785 /src
parent7cee125f30e3a483cef6cb0ec3117533af41ecef (diff)
Add instrumented file provider support to Skylark rules.
RELNOTES: Add instrumented file provider support to Skylark rules. -- MOS_MIGRATED_REVID=114255963
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java45
2 files changed, 86 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
index 5fb0bc5db1..3c38f3ff98 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
@@ -52,6 +52,7 @@ import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundLabelList;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SkylarkImplicitOutputsFunctionWithCallback;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SkylarkImplicitOutputsFunctionWithMap;
@@ -93,6 +94,7 @@ import com.google.devtools.build.lib.syntax.Type.ConversionException;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.util.Preconditions;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
@@ -120,6 +122,39 @@ public class SkylarkRuleClassFunctions {
}
};
+ private static final Label COVERAGE_SUPPORT_LABEL =
+ Label.parseAbsoluteUnchecked("//tools/defaults:coverage");
+
+ private static final LateBoundLabelList<BuildConfiguration> GCOV =
+ new LateBoundLabelList<BuildConfiguration>(ImmutableList.of(COVERAGE_SUPPORT_LABEL)) {
+ @Override
+ public List<Label> getDefault(Rule rule, BuildConfiguration configuration) {
+ return configuration.isCodeCoverageEnabled()
+ ? ImmutableList.copyOf(configuration.getGcovLabels())
+ : ImmutableList.<Label>of();
+ }
+ };
+
+ private static final LateBoundLabelList<BuildConfiguration> COVERAGE_REPORT_GENERATOR =
+ new LateBoundLabelList<BuildConfiguration>(ImmutableList.of(COVERAGE_SUPPORT_LABEL)) {
+ @Override
+ public List<Label> getDefault(Rule rule, BuildConfiguration configuration) {
+ return configuration.isCodeCoverageEnabled()
+ ? ImmutableList.copyOf(configuration.getCoverageReportGeneratorLabels())
+ : ImmutableList.<Label>of();
+ }
+ };
+
+ private static final LateBoundLabelList<BuildConfiguration> COVERAGE_SUPPORT =
+ new LateBoundLabelList<BuildConfiguration>(ImmutableList.of(COVERAGE_SUPPORT_LABEL)) {
+ @Override
+ public List<Label> getDefault(Rule rule, BuildConfiguration configuration) {
+ return configuration.isCodeCoverageEnabled()
+ ? ImmutableList.copyOf(configuration.getCoverageLabels())
+ : ImmutableList.<Label>of();
+ }
+ };
+
// TODO(bazel-team): Copied from ConfiguredRuleClassProvider for the transition from built-in
// rules to skylark extensions. Using the same instance would require a large refactoring.
// If we don't want to support old built-in rules and Skylark simultaneously
@@ -183,6 +218,12 @@ public class SkylarkRuleClassFunctions {
.add(attr("$test_runtime", LABEL_LIST).cfg(HOST).value(ImmutableList.of(
labelCache.getUnchecked(Constants.TOOLS_REPOSITORY + "//tools/test:runtime"))))
.add(attr(":run_under", LABEL).cfg(DATA).value(RUN_UNDER))
+ .add(attr(":gcov", LABEL_LIST).cfg(HOST).value(GCOV))
+ .add(attr(":coverage_support", LABEL_LIST).cfg(HOST).value(COVERAGE_SUPPORT))
+ .add(
+ attr(":coverage_report_generator", LABEL_LIST)
+ .cfg(HOST)
+ .value(COVERAGE_REPORT_GENERATOR))
.build();
/**
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 a07fb061af..309e68ac1a 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
@@ -29,6 +29,9 @@ import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.rules.SkylarkRuleContext.Kind;
+import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector;
+import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector.InstrumentationSpec;
+import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
import com.google.devtools.build.lib.syntax.BaseFunction;
import com.google.devtools.build.lib.syntax.ClassObject;
@@ -43,7 +46,11 @@ import com.google.devtools.build.lib.syntax.SkylarkList;
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 com.google.devtools.build.lib.util.FileType;
+import com.google.devtools.build.lib.util.FileTypeSet;
+import java.util.Collections;
+import java.util.List;
import java.util.Map;
/**
@@ -221,6 +228,44 @@ public final class SkylarkRuleConfiguredTargetBuilder {
defaultRunfiles = cast("default_runfiles", struct, Runfiles.class, loc);
} else if (key.equals("output_groups")) {
addOutputGroups(struct.getValue(key), loc, builder);
+ } else if (key.equals("instrumented_files")) {
+ SkylarkClassObject insStruct =
+ cast("instrumented_files", struct, SkylarkClassObject.class, loc);
+ Location insLoc = insStruct.getCreationLoc();
+ FileTypeSet fileTypeSet = FileTypeSet.ANY_FILE;
+ if (insStruct.getKeys().contains("extensions")) {
+ List<String> exts = cast("extensions", insStruct, List.class, String.class, insLoc);
+ if (exts.isEmpty()) {
+ fileTypeSet = FileTypeSet.NO_FILE;
+ } else {
+ FileType[] fileTypes = new FileType[exts.size()];
+ for (int i = 0; i < fileTypes.length; i++) {
+ fileTypes[i] = FileType.of(exts.get(i));
+ }
+ fileTypeSet = FileTypeSet.of(fileTypes);
+ }
+ }
+ List<String> dependencyAttributes = Collections.emptyList();
+ if (insStruct.getKeys().contains("dependency_attributes")) {
+ dependencyAttributes =
+ cast("dependency_attributes", insStruct, List.class, String.class, insLoc);
+ }
+ List<String> sourceAttributes = Collections.emptyList();
+ if (insStruct.getKeys().contains("source_attributes")) {
+ sourceAttributes =
+ cast("source_attributes", insStruct, List.class, String.class, insLoc);
+ }
+ InstrumentationSpec instrumentationSpec =
+ new InstrumentationSpec(fileTypeSet)
+ .withSourceAttributes(sourceAttributes.toArray(new String[0]))
+ .withDependencyAttributes(dependencyAttributes.toArray(new String[0]));
+ InstrumentedFilesProvider instrumentedFilesProvider =
+ InstrumentedFilesCollector.collect(
+ ruleContext,
+ instrumentationSpec,
+ InstrumentedFilesCollector.NO_METADATA_COLLECTOR,
+ Collections.<Artifact>emptySet());
+ builder.addProvider(InstrumentedFilesProvider.class, instrumentedFilesProvider);
} else if (!key.equals("executable")) {
// We handled executable already.
builder.addSkylarkTransitiveInfo(key, struct.getValue(key), loc);