diff options
author | Googler <noreply@google.com> | 2016-02-09 21:53:57 +0000 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2016-02-10 10:26:16 +0000 |
commit | 492472fc8232775109a7bc9fae28dd2d4c752e63 (patch) | |
tree | a513de825efa68e329c1d0ec0ef77f11f3414785 /src | |
parent | 7cee125f30e3a483cef6cb0ec3117533af41ecef (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.java | 41 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java | 45 |
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); |