diff options
Diffstat (limited to 'src')
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"); + } } |