From 7d10999fc0357596824f2b6022bbbd895f245a3c Mon Sep 17 00:00:00 2001 From: Googler Date: Fri, 24 Nov 2023 06:05:48 -0800 Subject: [PATCH] Move more android only fields & methods from `JavaSemantics` to `AndroidSemantics` PiperOrigin-RevId: 585076985 Change-Id: I5f400c6ab5ff8166258e0d623f2694c64344b13b --- .../rules/android/BazelAndroidSemantics.java | 11 +++++ .../bazel/rules/java/BazelJavaSemantics.java | 12 ------ .../build/lib/rules/android/AarImport.java | 2 +- .../lib/rules/android/AndroidBinary.java | 2 +- .../lib/rules/android/AndroidLibrary.java | 2 +- .../rules/android/AndroidLocalTestBase.java | 4 +- .../lib/rules/android/AndroidRuleClasses.java | 2 +- .../lib/rules/android/AndroidSdkBaseRule.java | 2 +- .../lib/rules/android/AndroidSemantics.java | 40 +++++++++++++++++++ .../build/lib/rules/java/JavaSemantics.java | 37 ----------------- 10 files changed, 58 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java index 92d6ae1fee95b5..06d2178f0c82a2 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.rules.android.AndroidDataContext; import com.google.devtools.build.lib.rules.android.AndroidSemantics; import com.google.devtools.build.lib.rules.android.ProguardHelper.ProguardOutput; +import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaTargetAttributes; /** @@ -45,6 +46,8 @@ public class BazelAndroidSemantics implements AndroidSemantics { "src/tools/android/java/com/google/devtools/build/android/incrementaldeployment")) .add(PackageIdentifier.createUnchecked("bazel_tools", "tools/android")) .build(); + private static final String BAZEL_TEST_RUNNER_MAIN_CLASS = + "com.google.testing.junit.runner.BazelTestRunner"; private BazelAndroidSemantics() {} @@ -182,4 +185,12 @@ public Artifact getObfuscatedConstantStringMap(RuleContext ruleContext) throws InterruptedException { return null; } + + @Override + public void checkRule(RuleContext ruleContext, JavaCommon javaCommon) {} + + @Override + public String getTestRunnerMainClass() { + return BAZEL_TEST_RUNNER_MAIN_CLASS; + } } 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 635fa0dd9011b5..e32157229142c6 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 @@ -71,9 +71,6 @@ public class BazelJavaSemantics implements JavaSemantics { Template.forResource(BazelJavaSemantics.class, "java_stub_template.txt"); private static final String CLASSPATH_PLACEHOLDER = "%classpath%"; - private static final String BAZEL_TEST_RUNNER_MAIN_CLASS = - "com.google.testing.junit.runner.BazelTestRunner"; - private BazelJavaSemantics() {} private static final String JAVA_TOOLCHAIN_TYPE = @@ -91,19 +88,10 @@ public Label getJavaRuntimeToolchainType() { return JAVA_RUNITME_TOOLCHAIN_TYPE; } - @Override - public void checkRule(RuleContext ruleContext, JavaCommon javaCommon) { - } - @Override public void checkForProtoLibraryAndJavaProtoLibraryOnSameProto( RuleContext ruleContext, JavaCommon javaCommon) {} - @Override - public String getTestRunnerMainClass() { - return BAZEL_TEST_RUNNER_MAIN_CLASS; - } - @Override public ImmutableList collectResources(RuleContext ruleContext) { if (!ruleContext.getRule().isAttrDefined("resources", BuildType.LABEL_LIST)) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java index d70439041c161e..1ae49a04b697fe 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java @@ -161,7 +161,7 @@ public ConfiguredTarget create(RuleContext ruleContext) /* compileDeps = */ targets, /* runtimeDeps = */ targets, /* bothDeps = */ targets); - javaSemantics.checkRule(ruleContext, common); + androidSemantics.checkRule(ruleContext, common); JavaConfiguration javaConfig = ruleContext.getFragment(JavaConfiguration.class); JavaCompilationArtifacts.Builder javaCompilationArtifactsBuilder = diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index 7592decc0212ea..8aaf7f93b2932d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -310,7 +310,7 @@ private static RuleConfiguredTargetBuilder init( resourceApk.asDataBindingContext(), /* isLibrary */ false, shouldCompileJavaSrcs); - javaSemantics.checkRule(ruleContext, javaCommon); + androidSemantics.checkRule(ruleContext, javaCommon); javaSemantics.checkForProtoLibraryAndJavaProtoLibraryOnSameProto(ruleContext, javaCommon); AndroidCommon androidCommon = new AndroidCommon(javaCommon, /* asNeverLink= */ true); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index bb211a696a2063..d8cd62db75251f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -188,7 +188,7 @@ public ConfiguredTarget create(RuleContext ruleContext) resourceApk.asDataBindingContext(), /* isLibrary */ true, /* shouldCompileJavaSrcs */ true); - javaSemantics.checkRule(ruleContext, javaCommon); + androidSemantics.checkRule(ruleContext, javaCommon); AndroidCommon androidCommon = new AndroidCommon(javaCommon); // As android_library makes use of the Java rule compilation pipeline, we collect all 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 2bda20e8ef41b1..8b6dc312ff376f 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 @@ -117,7 +117,7 @@ public ConfiguredTarget create(RuleContext ruleContext) resourceApk.asDataBindingContext(), /* isLibrary */ false, /* shouldCompileJavaSrcs */ true); - javaSemantics.checkRule(ruleContext, javaCommon); + androidSemantics.checkRule(ruleContext, javaCommon); // Use the regular Java javacopts, plus any extra needed for databinding. Enforcing // android-compatible Java (-source 7 -target 7 and no TWR) is unnecessary for robolectric tests @@ -223,7 +223,7 @@ public ConfiguredTarget create(RuleContext ruleContext) executable = ruleContext.createOutputArtifact(); } - String mainClass = javaSemantics.getTestRunnerMainClass(); + String mainClass = androidSemantics.getTestRunnerMainClass(); String originalMainClass = mainClass; if (ruleContext.getConfiguration().isCodeCoverageEnabled()) { mainClass = diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java index e155dd861f22cb..b043fbd960eb74 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java @@ -814,7 +814,7 @@ is exceeded. Assumes multidex classes are loaded through application code (i.e. .add( attr(":bytecode_optimizer", LABEL) .cfg(ExecutionTransitionFactory.createFactory()) - .value(JavaSemantics.BYTECODE_OPTIMIZER)) + .value(AndroidSemantics.BYTECODE_OPTIMIZER)) // We need the C++ toolchain for every sub-configuration to get the correct linker. .add( attr("$cc_toolchain_split", LABEL) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBaseRule.java index 0083bdd67b0f0a..348f28d26b76b7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBaseRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBaseRule.java @@ -42,7 +42,7 @@ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment envi .add( attr(":proguard", LABEL) .cfg(ExecutionTransitionFactory.createFactory()) - .value(JavaSemantics.PROGUARD) + .value(AndroidSemantics.PROGUARD) .exec()) // This is the Proguard in the BUILD file that contains the android_sdk rule. Used when // --proguard_top is not specified. diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java index 40f225e5d483f0..fd1b99f9bbf893 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java @@ -13,6 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; +import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates; import com.google.common.collect.ImmutableList; @@ -23,12 +24,16 @@ import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.rules.android.ProguardHelper.ProguardOutput; import com.google.devtools.build.lib.rules.java.BootClassPathInfo; +import com.google.devtools.build.lib.rules.java.JavaCommon; +import com.google.devtools.build.lib.rules.java.JavaConfiguration; import com.google.devtools.build.lib.rules.java.JavaTargetAttributes; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationConstant; import java.util.Map; import java.util.Optional; @@ -53,6 +58,32 @@ public interface AndroidSemantics { SafeImplicitOutputsFunction ANDROID_BINARY_PROGUARD_CONFIG = fromTemplates("%{name}_proguard.config"); + /** Implementation for the :proguard attribute. */ + @SerializationConstant + LabelLateBoundDefault PROGUARD = + LabelLateBoundDefault.fromTargetConfiguration( + JavaConfiguration.class, + null, + (rule, attributes, javaConfig) -> javaConfig.getProguardBinary()); + + @SerializationConstant + LabelLateBoundDefault BYTECODE_OPTIMIZER = + LabelLateBoundDefault.fromTargetConfiguration( + JavaConfiguration.class, + null, + (rule, attributes, javaConfig) -> { + // Use a modicum of smarts to avoid implicit dependencies where we don't need them. + boolean hasProguardSpecs = + attributes.has("proguard_specs") + && !attributes.get("proguard_specs", LABEL_LIST).isEmpty(); + JavaConfiguration.NamedLabel optimizer = javaConfig.getBytecodeOptimizer(); + if ((!hasProguardSpecs && !javaConfig.runLocalJavaOptimizations()) + || !optimizer.label().isPresent()) { + return null; + } + return optimizer.label().get(); + }); + default AndroidManifest renameManifest( AndroidDataContext dataContext, AndroidManifest rawManifest) throws InterruptedException { return rawManifest.renameManifestIfNeeded(dataContext); @@ -222,4 +253,13 @@ default BootClassPathInfo getBootClassPathInfo(RuleContext ruleContext) Artifact getProtoMapping(RuleContext ruleContext) throws InterruptedException; Artifact getObfuscatedConstantStringMap(RuleContext ruleContext) throws InterruptedException; + + /** + * Verifies if the rule contains any errors. + * + *

Errors should be signaled through {@link RuleContext}. + */ + void checkRule(RuleContext ruleContext, JavaCommon javaCommon) throws RuleErrorException; + + String getTestRunnerMainClass(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java index e29407076bef64..d42256f9391511 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java @@ -14,7 +14,6 @@ package com.google.devtools.build.lib.rules.java; -import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates; import com.google.common.collect.ImmutableList; @@ -28,7 +27,6 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; -import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault; import com.google.devtools.build.lib.packages.Attribute.LabelListLateBoundDefault; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; @@ -81,43 +79,10 @@ static Label javaToolchainAttribute(RuleDefinitionEnvironment environment) { JavaConfiguration.class, (rule, attributes, javaConfig) -> ImmutableList.copyOf(javaConfig.getPlugins())); - /** Implementation for the :proguard attribute. */ - @SerializationConstant - LabelLateBoundDefault PROGUARD = - LabelLateBoundDefault.fromTargetConfiguration( - JavaConfiguration.class, - null, - (rule, attributes, javaConfig) -> javaConfig.getProguardBinary()); - - @SerializationConstant - LabelLateBoundDefault BYTECODE_OPTIMIZER = - LabelLateBoundDefault.fromTargetConfiguration( - JavaConfiguration.class, - null, - (rule, attributes, javaConfig) -> { - // Use a modicum of smarts to avoid implicit dependencies where we don't need them. - boolean hasProguardSpecs = - attributes.has("proguard_specs") - && !attributes.get("proguard_specs", LABEL_LIST).isEmpty(); - JavaConfiguration.NamedLabel optimizer = javaConfig.getBytecodeOptimizer(); - if ((!hasProguardSpecs && !javaConfig.runLocalJavaOptimizations()) - || !optimizer.label().isPresent()) { - return null; - } - return optimizer.label().get(); - }); - String JACOCO_METADATA_PLACEHOLDER = "%set_jacoco_metadata%"; String JACOCO_MAIN_CLASS_PLACEHOLDER = "%set_jacoco_main_class%"; String JACOCO_JAVA_RUNFILES_ROOT_PLACEHOLDER = "%set_jacoco_java_runfiles_root%"; - /** - * Verifies if the rule contains any errors. - * - *

Errors should be signaled through {@link RuleContext}. - */ - void checkRule(RuleContext ruleContext, JavaCommon javaCommon) throws RuleErrorException; - /** * Verifies there are no conflicts in protos. * @@ -132,8 +97,6 @@ void checkForProtoLibraryAndJavaProtoLibraryOnSameProto( */ ImmutableList collectResources(RuleContext ruleContext) throws RuleErrorException; - String getTestRunnerMainClass(); - /** * Constructs the command line to call SingleJar to join all artifacts from {@code classpath} * (java code) and {@code resources} into {@code output}.