diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java index cba7b1d8393af0..bdf0befe20a0f9 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java @@ -670,19 +670,22 @@ public Iterable getJvmFlags( public String addCoverageSupport(JavaCompilationHelper helper, Artifact executable) { // This method can be called only for *_binary/*_test targets. Preconditions.checkNotNull(executable); - - // Add the coverage runner to the list of dependencies when compiling in coverage mode. - TransitiveInfoCollection runnerTarget = - helper.getRuleContext().getPrerequisite("$jacocorunner", Mode.TARGET); - if (JavaInfo.getProvider(JavaCompilationArgsProvider.class, runnerTarget) != null) { - helper.addLibrariesToAttributes(ImmutableList.of(runnerTarget)); - } else { - helper - .getRuleContext() - .ruleError( - "this rule depends on " - + helper.getRuleContext().attributes().get("$jacocorunner", BuildType.LABEL) - + " which is not a java_library rule, or contains errors"); + if (!helper.addCoverageSupport()) { + // Fallback to $jacocorunner attribute if no jacocorunner was found in the toolchain. + + // Add the coverage runner to the list of dependencies when compiling in coverage mode. + TransitiveInfoCollection runnerTarget = + helper.getRuleContext().getPrerequisite("$jacocorunner", Mode.TARGET); + if (JavaInfo.getProvider(JavaCompilationArgsProvider.class, runnerTarget) != null) { + helper.addLibrariesToAttributes(ImmutableList.of(runnerTarget)); + } else { + helper + .getRuleContext() + .ruleError( + "this rule depends on " + + helper.getRuleContext().attributes().get("$jacocorunner", BuildType.LABEL) + + " which is not a java_library rule, or contains errors"); + } } // We do not add the instrumented jar to the runtime classpath, but provide it in the shell diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java index 451b08358226c6..40730bfc8a48e2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java @@ -267,6 +267,16 @@ public ImmutableList getBootclasspathOrDefault() { } } + public boolean addCoverageSupport() { + TransitiveInfoCollection jacocoRunner = javaToolchain.getJacocoRunner(); + if (jacocoRunner != null + && JavaInfo.getProvider(JavaCompilationArgsProvider.class, jacocoRunner) != null) { + addLibrariesToAttributes(ImmutableList.of(jacocoRunner)); + return true; + } + return false; + } + /** * Creates an {@link Artifact} needed by {@code JacocoCoverageRunner}. * diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java index 6a73bfa7bf03e0..79c4fe356fface 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java @@ -106,6 +106,8 @@ public ConfiguredTarget create(RuleContext ruleContext) ruleContext.getPrerequisites( "package_configuration", Mode.HOST, JavaPackageConfigurationProvider.class)); + TransitiveInfoCollection jacocoRunner = ruleContext.getPrerequisite("jacocorunner", Mode.HOST); + JavaToolchainProvider provider = JavaToolchainProvider.create( ruleContext.getLabel(), @@ -130,6 +132,7 @@ public ConfiguredTarget create(RuleContext ruleContext) ijar, compatibleJavacOptions, packageConfiguration, + jacocoRunner, semantics); RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext) diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java index dfb36f48da1c56..a947a32f91c89e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java @@ -91,6 +91,7 @@ public static JavaToolchainProvider create( FilesToRunProvider ijar, ImmutableListMultimap compatibleJavacOptions, ImmutableList packageConfiguration, + TransitiveInfoCollection jacocoRunner, JavaSemantics javaSemantics) { return new JavaToolchainProvider( label, @@ -115,6 +116,7 @@ public static JavaToolchainProvider create( javabuilderJvmOptions, javacSupportsWorkers, packageConfiguration, + jacocoRunner, javaSemantics); } @@ -140,6 +142,7 @@ public static JavaToolchainProvider create( private final ImmutableList javabuilderJvmOptions; private final boolean javacSupportsWorkers; private final ImmutableList packageConfiguration; + private final TransitiveInfoCollection jacocoRunner; private final JavaSemantics javaSemantics; @VisibleForSerialization @@ -166,6 +169,7 @@ public static JavaToolchainProvider create( ImmutableList javabuilderJvmOptions, boolean javacSupportsWorkers, ImmutableList packageConfiguration, + TransitiveInfoCollection jacocoRunner, JavaSemantics javaSemantics) { super(ImmutableMap.of(), Location.BUILTIN); @@ -191,6 +195,7 @@ public static JavaToolchainProvider create( this.javabuilderJvmOptions = javabuilderJvmOptions; this.javacSupportsWorkers = javacSupportsWorkers; this.packageConfiguration = packageConfiguration; + this.jacocoRunner = jacocoRunner; this.javaSemantics = javaSemantics; } @@ -334,6 +339,10 @@ public ImmutableList packageConfiguration() { return packageConfiguration; } + public TransitiveInfoCollection getJacocoRunner() { + return jacocoRunner; + } + public JavaSemantics getJavaSemantics() { return javaSemantics; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java index 49bfde5a5844ca..4c58b6ef489b3a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java @@ -232,6 +232,14 @@ The Java target version (e.g., '6' or '7'). It specifies for which Java runtime .cfg(HostTransition.createFactory()) .allowedFileTypes() .mandatoryNativeProviders(ImmutableList.of(JavaPackageConfigurationProvider.class))) + /* + Label of the JacocoCoverageRunner deploy jar. + */ + .add( + attr("jacocorunner", LABEL) + .cfg(HostTransition.createFactory()) + .allowedFileTypes(FileTypeSet.ANY_FILE) + .exec()) .build(); } diff --git a/tools/jdk/BUILD.java_tools b/tools/jdk/BUILD.java_tools index 5b5022184196ee..861774937223f3 100644 --- a/tools/jdk/BUILD.java_tools +++ b/tools/jdk/BUILD.java_tools @@ -59,6 +59,8 @@ java_toolchain( ":java_compiler_jar", ":jdk_compiler_jar", ], + # TODO(iirina): Re-enable this after #8378 is merged. + # jacocorunner = ":jacoco_coverage_runner" ) filegroup( @@ -71,6 +73,11 @@ filegroup( srcs = ["java_tools/GenClass_deploy.jar"], ) +java_import( + name = "jacoco_coverage_runner", + jars = ["java_tools/JacocoCoverage_jarjar_deploy.jar"], +) + filegroup( name = "JacocoCoverage", srcs = ["java_tools/JacocoCoverage_jarjar_deploy.jar"],