From 6d1393d5b907f0d2c1ae6f831d44db0fa0eca06a Mon Sep 17 00:00:00 2001 From: ajmichael Date: Mon, 2 Apr 2018 15:43:57 -0700 Subject: Remove Android jar from android_local_test bootclasspath Instead, treat it as a regular compile-time library dependency. This fixes Java8 compilation in android_local_test. RELNOTES: None PiperOrigin-RevId: 191359834 --- .../bazel/rules/android/BazelAndroidLocalTest.java | 26 -------------- .../rules/android/BazelAndroidLocalTestRule.java | 3 ++ .../lib/rules/android/AndroidLocalTestBase.java | 40 ++++++++++++++++------ 3 files changed, 33 insertions(+), 36 deletions(-) (limited to 'src/main/java/com/google/devtools') diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTest.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTest.java index 0f1ef839f1..7906fcc10c 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTest.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTest.java @@ -23,10 +23,8 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.bazel.rules.java.BazelJavaSemantics; import com.google.devtools.build.lib.rules.android.AndroidLocalTestBase; -import com.google.devtools.build.lib.rules.android.AndroidSdkProvider; import com.google.devtools.build.lib.rules.android.AndroidSemantics; import com.google.devtools.build.lib.rules.java.JavaCommon; -import com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType; import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts.Builder; import com.google.devtools.build.lib.rules.java.JavaCompilationHelper; import com.google.devtools.build.lib.rules.java.JavaSemantics; @@ -81,30 +79,6 @@ public class BazelAndroidLocalTest extends AndroidLocalTestBase { return "com.google.testing.junit.runner.BazelTestRunner"; } - @Override - protected JavaCompilationHelper getJavaCompilationHelperWithDependencies( - RuleContext ruleContext, - JavaSemantics javaSemantics, - JavaCommon javaCommon, - JavaTargetAttributes.Builder javaTargetAttributesBuilder) { - - JavaCompilationHelper javaCompilationHelper = - new JavaCompilationHelper( - ruleContext, javaSemantics, javaCommon.getJavacOpts(), javaTargetAttributesBuilder); - javaCompilationHelper.addLibrariesToAttributes( - ImmutableList.copyOf(javaCommon.targetsTreatedAsDeps(ClasspathType.COMPILE_ONLY))); - - javaCompilationHelper.addLibrariesToAttributes( - ImmutableList.of(getAndCheckTestSupport(ruleContext))); - - javaTargetAttributesBuilder.setBootClassPath( - ImmutableList.of(AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar())); - javaTargetAttributesBuilder.addRuntimeClassPathEntry( - AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar()); - - return javaCompilationHelper; - } - @Override protected TransitiveInfoCollection getAndCheckTestSupport(RuleContext ruleContext) { // Add the unit test support to the list of dependencies. diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java index 67228a5292..2d91a65c1f 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java @@ -69,6 +69,9 @@ public class BazelAndroidLocalTestRule implements RuleDefinition { ImmutableList.of( SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))))) .override(attr("$testsupport", LABEL).value(environment.getToolsLabel(JUNIT_TESTRUNNER))) + .add( + attr("$robolectric_implicit_classpath", LABEL_LIST) + .value(ImmutableList.of(environment.getToolsLabel("//tools/android:android_jar")))) .override(attr("stamp", TRISTATE).value(TriState.NO)) .removeAttribute("$experimental_testsupport") .removeAttribute("classpath_resources") diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java index dca5a7f142..ff90341fe6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java @@ -13,7 +13,6 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; -import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -36,6 +35,7 @@ import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTa import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; import com.google.devtools.build.lib.rules.java.ClasspathConfiguredFragment; import com.google.devtools.build.lib.rules.java.JavaCommon; @@ -447,19 +447,17 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor builder.addRunfiles(ruleContext, RunfilesProvider.DEFAULT_RUNFILES); builder.add(ruleContext, JavaRunfilesProvider.TO_RUNFILES); - List depsForRunfiles = new ArrayList<>(); - - if (ruleContext.isAttrDefined("$robolectric", LABEL_LIST)) { - depsForRunfiles.addAll(ruleContext.getPrerequisites("$robolectric", Mode.TARGET)); - } + ImmutableList depsForRunfiles = + ImmutableList.builder() + .addAll(ruleContext.getPrerequisites("$robolectric_implicit_classpath", Mode.TARGET)) + .addAll(ruleContext.getPrerequisites("runtime_deps", Mode.TARGET)) + .build(); Artifact androidAllJarsPropertiesFile = getAndroidAllJarsPropertiesFile(ruleContext); if (androidAllJarsPropertiesFile != null) { builder.addArtifact(androidAllJarsPropertiesFile); } - depsForRunfiles.addAll(ruleContext.getPrerequisites("runtime_deps", Mode.TARGET)); - builder.addArtifacts(getRuntimeJarsForTargets(getAndCheckTestSupport(ruleContext))); builder.addTargets(depsForRunfiles, JavaRunfilesProvider.TO_RUNFILES); @@ -566,12 +564,34 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor * * @throws RuleErrorException */ - protected abstract JavaCompilationHelper getJavaCompilationHelperWithDependencies( + private JavaCompilationHelper getJavaCompilationHelperWithDependencies( RuleContext ruleContext, JavaSemantics javaSemantics, JavaCommon javaCommon, JavaTargetAttributes.Builder javaTargetAttributesBuilder) - throws RuleErrorException; + throws RuleErrorException { + JavaCompilationHelper javaCompilationHelper = + new JavaCompilationHelper( + ruleContext, javaSemantics, javaCommon.getJavacOpts(), javaTargetAttributesBuilder); + + if (ruleContext.isAttrDefined("$junit", BuildType.LABEL)) { + // JUnit jar must be ahead of android runtime jars since these contain stubbed definitions + // for framework.junit.* classes which Robolectric does not re-write. + javaCompilationHelper.addLibrariesToAttributes( + ruleContext.getPrerequisites("$junit", Mode.TARGET)); + } + // Robolectric jars must be ahead of other potentially conflicting jars + // (e.g., Android runtime jars) in the classpath to make sure they always take precedence. + javaCompilationHelper.addLibrariesToAttributes( + ruleContext.getPrerequisites("$robolectric_implicit_classpath", Mode.TARGET)); + + javaCompilationHelper.addLibrariesToAttributes( + javaCommon.targetsTreatedAsDeps(ClasspathType.COMPILE_ONLY)); + + javaCompilationHelper.addLibrariesToAttributes( + ImmutableList.of(getAndCheckTestSupport(ruleContext))); + return javaCompilationHelper; + } /** Get the testrunner from the rule */ protected abstract TransitiveInfoCollection getAndCheckTestSupport(RuleContext ruleContext) -- cgit v1.2.3