aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java44
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java50
6 files changed, 106 insertions, 1 deletions
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 21fcb618ba..b5ce0c123a 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
@@ -114,6 +114,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
validateRuleContext(ruleContext);
JavaSemantics javaSemantics = createJavaSemantics();
AndroidSemantics androidSemantics = createAndroidSemantics();
+ androidSemantics.validateAndroidLibraryRuleContext(ruleContext);
AndroidSdkProvider.verifyPresence(ruleContext);
NestedSetBuilder<Aar> transitiveAars = NestedSetBuilder.naiveLinkOrder();
NestedSetBuilder<Artifact> transitiveAarArtifacts = NestedSetBuilder.stableOrder();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java
index 0c053e06cf..e3dda1f31a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java
@@ -29,6 +29,7 @@ import com.google.devtools.build.lib.packages.TriState;
import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidResourceSupportRule;
import com.google.devtools.build.lib.rules.java.JavaConfiguration;
import com.google.devtools.build.lib.rules.java.JavaInfo;
+import com.google.devtools.build.lib.rules.java.JavaRuleClasses;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.ProguardLibraryRule;
import com.google.devtools.build.lib.util.FileTypeSet;
@@ -84,6 +85,7 @@ public final class AndroidLibraryBaseRule implements RuleDefinition {
.copy("deps")
.allowedRuleClasses(AndroidRuleClasses.ALLOWED_DEPENDENCIES)
.allowedFileTypes()
+ .mandatoryProviders(JavaRuleClasses.CONTAINS_JAVA_PROVIDER)
.aspect(androidNeverlinkAspect))
/* <!-- #BLAZE_RULE(android_library).ATTRIBUTE(exports) -->
The closure of all rules reached via <code>exports</code> attributes
@@ -94,7 +96,8 @@ public final class AndroidLibraryBaseRule implements RuleDefinition {
.add(
attr("exports", LABEL_LIST)
.allowedRuleClasses(AndroidRuleClasses.ALLOWED_DEPENDENCIES)
- .allowedFileTypes(/*May not have files in exports!*/ )
+ .allowedFileTypes(/*May not have files in exports!*/)
+ .mandatoryProviders(JavaRuleClasses.CONTAINS_JAVA_PROVIDER)
.aspect(androidNeverlinkAspect))
/* <!-- #BLAZE_RULE(android_library).ATTRIBUTE(exports_manifest) -->
Whether to export manifest entries to <code>android_binary</code> targets
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 b564337e56..bda2847eba 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
@@ -62,6 +62,7 @@ import com.google.devtools.build.lib.rules.cpp.CppOptions;
import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
import com.google.devtools.build.lib.rules.java.JavaConfiguration;
import com.google.devtools.build.lib.rules.java.JavaInfo;
+import com.google.devtools.build.lib.rules.java.JavaRuleClasses;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.ProguardHelper;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
@@ -703,6 +704,7 @@ public final class AndroidRuleClasses {
.cfg(ANDROID_SPLIT_TRANSITION)
.allowedRuleClasses(ALLOWED_DEPENDENCIES)
.allowedFileTypes()
+ .mandatoryProviders(JavaRuleClasses.CONTAINS_JAVA_PROVIDER)
.aspect(androidNeverlinkAspect)
.aspect(dexArchiveAspect, DexArchiveAspect.PARAM_EXTRACTOR))
/* <!-- #BLAZE_RULE($android_binary_base).ATTRIBUTE(debug_key) -->
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 fde6c409e1..87130b7351 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
@@ -110,6 +110,11 @@ public interface AndroidSemantics {
default void validateAndroidBinaryRuleContext(RuleContext ruleContext) throws RuleErrorException {
}
+ /** A hook for checks of internal-only or external-only attributes of {@code android_library}. */
+ default void validateAndroidLibraryRuleContext(RuleContext ruleContext)
+ throws RuleErrorException {
+ }
+
/** The artifact for the map that proguard will output. */
Artifact getProguardOutputMap(RuleContext ruleContext) throws InterruptedException;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
index e839a35278..5c292fb7fe 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
@@ -36,6 +36,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
+import com.google.devtools.build.lib.analysis.OutputGroupInfo;
import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.cmdline.RepositoryName;
@@ -59,6 +60,7 @@ import com.google.devtools.build.lib.vfs.Path;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.junit.Before;
@@ -4364,4 +4366,46 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
getGeneratingSpawnActionArgs(getFirstArtifactEndingWith(artifacts, "resource_files.zip"));
assertThat(parsedResourceMergingArgs).contains("MERGE");
}
+
+ @Test
+ public void skylarkJavaInfoToAndroidBinaryAttributes() throws Exception {
+ scratch.file(
+ "java/r/android/extension.bzl",
+ "def _impl(ctx):",
+ " dep_params = ctx.attr.dep[JavaInfo]",
+ " return [dep_params]",
+ "my_rule = rule(",
+ " _impl,",
+ " attrs = {",
+ " 'dep': attr.label(),",
+ " },",
+ ")");
+ scratch.file(
+ "java/r/android/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "android_library(",
+ " name = 'al_bottom_for_deps',",
+ " srcs = ['java/A.java'],",
+ ")",
+ "my_rule(",
+ " name = 'mya',",
+ " dep = ':al_bottom_for_deps',",
+ ")",
+ "android_binary(",
+ " name = 'foo_app',",
+ " srcs = ['java/B.java'],",
+ " deps = [':mya'],",
+ " manifest = 'AndroidManifest.xml',",
+ // TODO(b/75051107): Remove the following line when fixed.
+ " incremental_dexing = 0,",
+ ")");
+ // Test that all bottom jars are on the runtime classpath of the app.
+ ConfiguredTarget target = getConfiguredTarget("//java/r/android:foo_app");
+ Collection<Artifact> transitiveSrcJars =
+ OutputGroupInfo.get(target).getOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP)
+ .toCollection();
+ assertThat(ActionsTestUtil.baseArtifactNames(transitiveSrcJars)).containsExactly(
+ "libal_bottom_for_deps-src.jar",
+ "libfoo_app-src.jar");
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
index ce677f1f2d..d1a3954e94 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
@@ -52,6 +52,7 @@ import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.junit.Test;
@@ -1869,4 +1870,53 @@ public class AndroidLibraryTest extends AndroidBuildViewTestCase {
Artifact paramFile = getFirstArtifactEndingWith(action.getInputs(), "-2.params");
return ((ParameterFileWriteAction) getGeneratingAction(paramFile)).getContents();
}
+
+ @Test
+ public void skylarkJavaInfoToAndroidLibraryAttributes() throws Exception {
+ scratch.file(
+ "foo/extension.bzl",
+ "def _impl(ctx):",
+ " dep_params = ctx.attr.dep[JavaInfo]",
+ " return [dep_params]",
+ "my_rule = rule(",
+ " _impl,",
+ " attrs = {",
+ " 'dep': attr.label(),",
+ " },",
+ ")");
+ scratch.file(
+ "foo/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "android_library(",
+ " name = 'al_bottom_for_deps',",
+ " srcs = ['java/A.java'],",
+ ")",
+ "java_library(",
+ " name = 'jl_bottom_for_exports',",
+ " srcs = ['java/A2.java'],",
+ ")",
+ "my_rule(",
+ " name = 'mya',",
+ " dep = ':al_bottom_for_deps',",
+ ")",
+ "my_rule(",
+ " name = 'myb',",
+ " dep = ':jl_bottom_for_exports',",
+ ")",
+ "android_library(",
+ " name = 'lib_foo',",
+ " srcs = ['java/B.java'],",
+ " deps = [':mya'],",
+ " exports = [':myb'],",
+ ")");
+ // Test that all bottom jars are on the runtime classpath of lib_android.
+ ConfiguredTarget target = getConfiguredTarget("//foo:lib_foo");
+ Collection<Artifact> transitiveSrcJars =
+ OutputGroupInfo.get(target).getOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP)
+ .toCollection();
+ assertThat(ActionsTestUtil.baseArtifactNames(transitiveSrcJars)).containsExactly(
+ "libjl_bottom_for_exports-src.jar",
+ "libal_bottom_for_deps-src.jar",
+ "liblib_foo-src.jar");
+ }
}