aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar ajmichael <ajmichael@google.com>2018-01-29 13:43:24 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-29 13:47:36 -0800
commit29f2ba82ca7581a68b4cc760d15fc9f89b0ea9b9 (patch)
treea652563efbdea7e433959406780cd00706c5054b /src/main/java/com/google/devtools/build
parent131189ebce1454578abf0b669807af4cc5f3b1b6 (diff)
Expose ApkInfo and AndroidInstrumentationInfo to Skylark.
This will enable us to write testing rules in Skylark. RELNOTES: None PiperOrigin-RevId: 183719720
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java25
-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/ApkInfo.java90
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApkProvider.java53
7 files changed, 125 insertions, 67 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 1fd72c0450..7b290df5a9 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -82,6 +82,7 @@ import com.google.devtools.build.lib.rules.android.AndroidConfiguration;
import com.google.devtools.build.lib.rules.android.AndroidDeviceRule;
import com.google.devtools.build.lib.rules.android.AndroidDeviceScriptFixtureRule;
import com.google.devtools.build.lib.rules.android.AndroidHostServiceFixtureRule;
+import com.google.devtools.build.lib.rules.android.AndroidInstrumentationInfo;
import com.google.devtools.build.lib.rules.android.AndroidInstrumentationTestRule;
import com.google.devtools.build.lib.rules.android.AndroidLibraryBaseRule;
import com.google.devtools.build.lib.rules.android.AndroidLocalTestBaseRule;
@@ -89,6 +90,7 @@ import com.google.devtools.build.lib.rules.android.AndroidNeverlinkAspect;
import com.google.devtools.build.lib.rules.android.AndroidRuleClasses;
import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidToolsDefaultsJarRule;
import com.google.devtools.build.lib.rules.android.AndroidSkylarkCommon;
+import com.google.devtools.build.lib.rules.android.ApkInfo;
import com.google.devtools.build.lib.rules.android.DexArchiveAspect;
import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
@@ -478,6 +480,9 @@ public class BazelRuleClassProvider {
builder.addRuleDefinition(new AndroidHostServiceFixtureRule());
builder.addSkylarkAccessibleTopLevels("android_common", new AndroidSkylarkCommon());
+ builder.addSkylarkAccessibleTopLevels(ApkInfo.PROVIDER.getName(), ApkInfo.PROVIDER);
+ builder.addSkylarkAccessibleTopLevels(
+ AndroidInstrumentationInfo.PROVIDER.getName(), AndroidInstrumentationInfo.PROVIDER);
try {
builder.addWorkspaceFilePrefix(
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 00e8210c66..8792e18faf 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
@@ -180,12 +180,12 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
Artifact featureOfArtifact =
ruleContext.attributes().isAttributeValueExplicitlySpecified("feature_of")
- ? ruleContext.getPrerequisite("feature_of", Mode.TARGET, ApkProvider.class).getApk()
+ ? ruleContext.getPrerequisite("feature_of", Mode.TARGET, ApkInfo.PROVIDER).getApk()
: null;
Artifact featureAfterArtifact =
ruleContext.attributes().isAttributeValueExplicitlySpecified("feature_after")
? ruleContext
- .getPrerequisite("feature_after", Mode.TARGET, ApkProvider.class)
+ .getPrerequisite("feature_after", Mode.TARGET, ApkInfo.PROVIDER)
.getApk()
: null;
@@ -424,8 +424,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
// If this is an instrumentation APK, create the provider for android_instrumentation_test.
if (isInstrumentation(ruleContext)) {
- ApkProvider targetApkProvider =
- ruleContext.getPrerequisite("instruments", Mode.TARGET, ApkProvider.class);
+ ApkInfo targetApkProvider =
+ ruleContext.getPrerequisite("instruments", Mode.TARGET, ApkInfo.PROVIDER);
Artifact targetApk = targetApkProvider.getApk();
Artifact instrumentationApk = zipAlignedApk;
@@ -517,9 +517,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.addProvider(
JavaSourceInfoProvider.class,
JavaSourceInfoProvider.fromJavaTargetAttributes(resourceClasses, javaSemantics))
- .addProvider(
- ApkProvider.class,
- ApkProvider.create(
+ .addNativeDeclaredProvider(
+ new ApkInfo(
zipAlignedApk,
unsignedApk,
androidCommon.getInstrumentedJar(),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 6c8e0401e4..e9064e9400 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -940,9 +940,9 @@ public class AndroidCommon {
static NestedSet<Artifact> getSupportApks(RuleContext ruleContext) {
NestedSetBuilder<Artifact> supportApks = NestedSetBuilder.stableOrder();
for (TransitiveInfoCollection dep : ruleContext.getPrerequisites("support_apks", Mode.TARGET)) {
- ApkProvider apkProvider = dep.getProvider(ApkProvider.class);
+ ApkInfo apkProvider = dep.get(ApkInfo.PROVIDER);
FileProvider fileProvider = dep.getProvider(FileProvider.class);
- // If ApkProvider is present, do not check FileProvider for .apk files. For example,
+ // If ApkInfo is present, do not check FileProvider for .apk files. For example,
// android_binary creates a FileProvider containing both the signed and unsigned APKs.
if (apkProvider != null) {
supportApks.add(apkProvider.getApk());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java
index d7e53f79ee..b588861ab5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java
@@ -17,32 +17,49 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.packages.NativeInfo;
import com.google.devtools.build.lib.packages.NativeProvider;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
/**
- * A provider for targets that create Android instrumentations. Consumed by {@link
- * AndroidInstrumentationTest}.
+ * A provider for targets that create Android instrumentations. Consumed by Android testing rules.
*/
+ @SkylarkModule(
+ name = "AndroidInstrumentationInfo",
+ doc = "Android instrumentation and target APKs to run in a test",
+ category = SkylarkModuleCategory.PROVIDER
+)
@Immutable
public class AndroidInstrumentationInfo extends NativeInfo {
private static final String SKYLARK_NAME = "AndroidInstrumentationInfo";
- static final NativeProvider<AndroidInstrumentationInfo> PROVIDER =
+ public static final NativeProvider<AndroidInstrumentationInfo> PROVIDER =
new NativeProvider<AndroidInstrumentationInfo>(
AndroidInstrumentationInfo.class, SKYLARK_NAME) {};
private final Artifact targetApk;
private final Artifact instrumentationApk;
- public AndroidInstrumentationInfo(Artifact targetApk, Artifact instrumentationApk) {
+ AndroidInstrumentationInfo(Artifact targetApk, Artifact instrumentationApk) {
super(PROVIDER);
this.targetApk = targetApk;
this.instrumentationApk = instrumentationApk;
}
+ @SkylarkCallable(
+ name = "target_apk",
+ doc = "Returns the target APK of the instrumentation test.",
+ structField = true
+ )
public Artifact getTargetApk() {
return targetApk;
}
+ @SkylarkCallable(
+ name = "instrumentation_apk",
+ doc = "Returns the instrumentation APK that should be executed.",
+ structField = true
+ )
public Artifact getInstrumentationApk() {
return instrumentationApk;
}
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 b084e0f60f..937dee2664 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
@@ -1033,7 +1033,7 @@ public final class AndroidRuleClasses {
.exec()
.value(env.getToolsLabel("//tools/android:zip_filter")))
.removeAttribute("data")
- .advertiseProvider(ApkProvider.class)
+ .advertiseSkylarkProvider(ApkInfo.PROVIDER.id())
.advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java
new file mode 100644
index 0000000000..0e2556f672
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java
@@ -0,0 +1,90 @@
+// Copyright 2015 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.rules.android;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.NativeInfo;
+import com.google.devtools.build.lib.packages.NativeProvider;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import javax.annotation.Nullable;
+
+/** A provider for targets that produce an apk file. */
+@SkylarkModule(
+ name = "ApkInfo",
+ doc = "APKs provided by a rule",
+ category = SkylarkModuleCategory.PROVIDER
+)
+@Immutable
+public class ApkInfo extends NativeInfo {
+
+ private static final String SKYLARK_NAME = "ApkInfo";
+ public static final NativeProvider<ApkInfo> PROVIDER =
+ new NativeProvider<ApkInfo>(ApkInfo.class, SKYLARK_NAME) {};
+
+ private final Artifact apk;
+ private final Artifact unsignedApk;
+ @Nullable
+ private final Artifact coverageMetadata;
+ private final Artifact mergedManifest;
+ private final Artifact keystore;
+
+ ApkInfo(
+ Artifact apk,
+ Artifact unsignedApk,
+ @Nullable Artifact coverageMetadata,
+ Artifact mergedManifest,
+ Artifact keystore) {
+ super(PROVIDER);
+ this.apk = apk;
+ this.unsignedApk = unsignedApk;
+ this.coverageMetadata = coverageMetadata;
+ this.mergedManifest = mergedManifest;
+ this.keystore = keystore;
+ }
+
+ /** Returns the APK file built in the transitive closure. */
+ @SkylarkCallable(
+ name = "signed_apk",
+ doc = "Returns a signed APK built from the target.",
+ structField = true
+
+ )
+ public Artifact getApk() {
+ return apk;
+ }
+
+ /** Returns the unsigned APK file built in the transitive closure. */
+ public Artifact getUnsignedApk() {
+ return unsignedApk;
+ }
+
+ /** Returns the coverage metadata artifacts generated in the transitive closure. */
+ @Nullable
+ public Artifact getCoverageMetadata() {
+ return coverageMetadata;
+ }
+
+ /** Returns the merged manifest. */
+ public Artifact getMergedManifest() {
+ return mergedManifest;
+ }
+
+ /* The keystore that was used to sign the apk returned from {@see getApk() */
+ public Artifact getKeystore() {
+ return keystore;
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkProvider.java
deleted file mode 100644
index 534e24ad3e..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkProvider.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2015 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.google.devtools.build.lib.rules.android;
-
-import com.google.auto.value.AutoValue;
-import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import javax.annotation.Nullable;
-
-/** A provider for targets that produce an apk file. */
-@AutoValue
-@Immutable
-public abstract class ApkProvider implements TransitiveInfoProvider {
-
- public static ApkProvider create(
- Artifact apk,
- Artifact unsignedApk,
- @Nullable Artifact coverageMetadata,
- Artifact mergedManifest,
- Artifact keystore) {
- return new AutoValue_ApkProvider(apk, unsignedApk, coverageMetadata, mergedManifest, keystore);
- }
-
- /** Returns the APK file built in the transitive closure. */
- public abstract Artifact getApk();
-
- /** Returns the unsigned APK file built in the transitive closure. */
- public abstract Artifact getUnsignedApk();
-
- /** Returns the coverage metadata artifacts generated in the transitive closure. */
- @Nullable
- public abstract Artifact getCoverageMetadata();
-
- /** Returns the merged manifest. */
- public abstract Artifact getMergedManifest();
-
- /* The keystore that was used to sign the apk returned from {@see getApk() */
- public abstract Artifact getKeystore();
-
- ApkProvider() {}
-}