diff options
author | Googler <noreply@google.com> | 2017-04-15 02:04:07 +0200 |
---|---|---|
committer | Klaus Aehlig <aehlig@google.com> | 2017-04-18 11:28:34 +0200 |
commit | 6fc43c0549efc109301630f69f59488ee0793f90 (patch) | |
tree | 721fcfc71cc857ad9cc390f42c51a1212babec24 | |
parent | c52d73e9a76989e483d2998250a132e8d5e10098 (diff) |
Expose the native libs of the android_binary rule to skylark.
RELNOTES: none
PiperOrigin-RevId: 153223511
8 files changed, 85 insertions, 31 deletions
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 52c1b52a56..7fbe3a24b9 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 @@ -799,7 +799,13 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { debugKeystore); androidCommon.addTransitiveInfoProviders( - builder, androidSemantics, null /* aar */, resourceApk, zipAlignedApk, apksUnderTest); + builder, + androidSemantics, + null /* aar */, + resourceApk, + zipAlignedApk, + apksUnderTest, + nativeLibs); androidSemantics.addTransitiveInfoProviders(builder, ruleContext, javaCommon, androidCommon); if (proguardOutput.getMapping() != null) { @@ -909,7 +915,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } if (ruleContext.getFragment(AndroidConfiguration.class).useIncrementalNativeLibs()) { - for (Map.Entry<String, Iterable<Artifact>> arch : nativeLibs.getMap().entrySet()) { + for (Map.Entry<String, NestedSet<Artifact>> arch : nativeLibs.getMap().entrySet()) { for (Artifact lib : arch.getValue()) { builder .addArgument("--native_lib") 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 ab6878c824..279f252fac 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 @@ -233,13 +233,15 @@ public class AndroidCommon { Artifact aar, ResourceApk resourceApk, Artifact zipAlignedApk, - Iterable<Artifact> apksUnderTest) { + Iterable<Artifact> apksUnderTest, + NativeLibs nativeLibs) { AndroidIdeInfoProvider.Builder ideInfoProviderBuilder = new AndroidIdeInfoProvider.Builder() .setIdlClassJar(idlHelper.getIdlClassJar()) .setIdlSourceJar(idlHelper.getIdlSourceJar()) .setResourceJar(resourceJar) .setAar(aar) + .setNativeLibs(nativeLibs.getMap()) .addIdlImportRoot(idlHelper.getIdlImportRoot()) .addIdlParcelables(idlHelper.getIdlParcelables()) .addIdlSrcs(idlHelper.getIdlSources()) @@ -703,7 +705,8 @@ public class AndroidCommon { Artifact aar, ResourceApk resourceApk, Artifact zipAlignedApk, - Iterable<Artifact> apksUnderTest) { + Iterable<Artifact> apksUnderTest, + NativeLibs nativeLibs) { idlHelper.addTransitiveInfoProviders(builder, classJar, manifestProtoOutput); @@ -757,7 +760,8 @@ public class AndroidCommon { aar, resourceApk, zipAlignedApk, - apksUnderTest)) + apksUnderTest, + nativeLibs)) .add(JavaCompilationArgsProvider.class, compilationArgsProvider) .addSkylarkTransitiveInfo(AndroidSkylarkApiProvider.NAME, new AndroidSkylarkApiProvider()) .addOutputGroup( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java index c73eb96137..cc5b9bb4be 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java @@ -16,21 +16,22 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Root; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; - import java.util.Collection; import java.util.LinkedHashSet; +import java.util.Map; import java.util.Objects; import java.util.Set; - import javax.annotation.Nullable; /** @@ -140,6 +141,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { private final Set<Artifact> apksUnderTest = new LinkedHashSet<>(); private boolean definesAndroidResources; private Artifact aar = null; + private Map<String, NestedSet<Artifact>> nativeLibs = null; public AndroidIdeInfoProvider build() { return new AndroidIdeInfoProvider( @@ -158,7 +160,10 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { ImmutableList.copyOf(idlDirs), ImmutableList.copyOf(idlSrcs), ImmutableList.copyOf(idlGeneratedJavaFiles), - ImmutableList.copyOf(apksUnderTest)); + ImmutableList.copyOf(apksUnderTest), + nativeLibs != null + ? ImmutableMap.copyOf(nativeLibs) + : ImmutableMap.<String, NestedSet<Artifact>>of()); } public Builder setJavaPackage(String javaPackage) { @@ -211,6 +216,12 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { return this; } + public Builder setNativeLibs(Map<String, NestedSet<Artifact>> nativeLibs) { + this.nativeLibs = nativeLibs; + return this; + } + + public Builder addIdlImportRoot(String idlImportRoot) { this.idlImportRoot = idlImportRoot; return this; @@ -293,7 +304,6 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { Iterables.addAll(apksUnderTest, apks); return this; } - } private final String javaPackage; @@ -312,6 +322,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { private final ImmutableCollection<Artifact> idlSrcs; private final ImmutableCollection<Artifact> idlGeneratedJavaFiles; private final ImmutableCollection<Artifact> apksUnderTest; + private final ImmutableMap<String, NestedSet<Artifact>> nativeLibs; AndroidIdeInfoProvider( String javaPackage, @@ -329,7 +340,8 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { ImmutableCollection<SourceDirectory> idlImports, ImmutableCollection<Artifact> idlSrcs, ImmutableCollection<Artifact> idlGeneratedJavaFiles, - ImmutableCollection<Artifact> apksUnderTest) { + ImmutableCollection<Artifact> apksUnderTest, + ImmutableMap<String, NestedSet<Artifact>> nativeLibs) { this.javaPackage = javaPackage; this.idlImportRoot = idlImportRoot; this.manifest = manifest; @@ -346,6 +358,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { this.idlSrcs = idlSrcs; this.idlGeneratedJavaFiles = idlGeneratedJavaFiles; this.apksUnderTest = apksUnderTest; + this.nativeLibs = nativeLibs; } /** Returns java package for this target. */ @@ -433,4 +446,9 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { public ImmutableCollection<Artifact> getApksUnderTest() { return apksUnderTest; } + + /** A map, keyed on architecture, of the native libs for the app, if any. */ + public ImmutableMap<String, NestedSet<Artifact>> getNativeLibs() { + return nativeLibs; + } } 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 5f0da5fbc8..0648e10f40 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 @@ -195,8 +195,14 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { .build(ruleContext); RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext); - androidCommon.addTransitiveInfoProviders(builder, androidSemantics, aarOut, - resourceApk, null, ImmutableList.<Artifact>of()); + androidCommon.addTransitiveInfoProviders( + builder, + androidSemantics, + aarOut, + resourceApk, + null, + ImmutableList.<Artifact>of(), + NativeLibs.EMPTY); androidSemantics.addTransitiveInfoProviders(builder, ruleContext, javaCommon, androidCommon); NestedSetBuilder<Artifact> transitiveResourcesJars = collectTransitiveResourceJars(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java index 4ca0f5beb1..90d102911c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.base.Function; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.nestedset.NestedSet; @@ -95,6 +96,18 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider { } @SkylarkCallable( + name = "native_libs", + structField = true, + doc = + "Returns the native libraries as a map of the libraries' architecture as a String to a " + + "set of the native library artifacts, or the empty map if there are no native " + + "libraries." + ) + public ImmutableMap<String, NestedSet<Artifact>> getNativeLibs() { + return getIdeInfoProvider().getNativeLibs(); + } + + @SkylarkCallable( name = "apks_under_test", structField = true, allowReturnNones = true, diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkManifestAction.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkManifestAction.java index e8753ce543..4ab7f74dcd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkManifestAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkManifestAction.java @@ -23,13 +23,13 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.actions.AbstractFileWriteAction; import com.google.devtools.build.lib.collect.CollectionUtils; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.android.apkmanifest.ApkManifestOuterClass; import com.google.devtools.build.lib.rules.android.apkmanifest.ApkManifestOuterClass.ApkManifest; import com.google.devtools.build.lib.util.Fingerprint; import com.google.protobuf.ByteString; import com.google.protobuf.TextFormat; - import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; @@ -59,7 +59,6 @@ public final class ApkManifestAction extends AbstractFileWriteAction { .add(sdk.getResourceExtractor().getExecutable()) .add(sdk.getShrinkedAndroidJar()) .add(sdk.getZipalign().getExecutable()) - .addAll(jars) .add(resourceApk.getArtifact()) .add(resourceApk.getManifest()) @@ -185,7 +184,7 @@ public final class ApkManifestAction extends AbstractFileWriteAction { manifestBuilder.setResourceApk(makeArtifactProto(resourceApk.getArtifact())); manifestBuilder.setAndroidManifest(makeArtifactProto(resourceApk.getManifest())); - for (Map.Entry<String, Iterable<Artifact>> nativeLib : nativeLibs.getMap().entrySet()) { + for (Map.Entry<String, NestedSet<Artifact>> nativeLib : nativeLibs.getMap().entrySet()) { if (!Iterables.isEmpty(nativeLib.getValue())) { manifestBuilder.addNativeLibBuilder() .setArch(nativeLib.getKey()) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java index 48783e68a7..32a7c721d5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java @@ -28,6 +28,7 @@ import com.google.devtools.build.lib.analysis.actions.FileWriteAction; import com.google.devtools.build.lib.analysis.actions.SymlinkTreeAction; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; @@ -48,7 +49,7 @@ import javax.annotation.Nullable; @Immutable public final class NativeLibs { public static final NativeLibs EMPTY = - new NativeLibs(ImmutableMap.<String, Iterable<Artifact>>of(), null); + new NativeLibs(ImmutableMap.<String, NestedSet<Artifact>>of(), null); public static NativeLibs fromLinkedNativeDeps( RuleContext ruleContext, @@ -57,7 +58,7 @@ public final class NativeLibs { Map<String, CcToolchainProvider> toolchainMap, Map<String, BuildConfiguration> configurationMap) throws InterruptedException { - Map<String, Iterable<Artifact>> result = new LinkedHashMap<>(); + Map<String, NestedSet<Artifact>> result = new LinkedHashMap<>(); String nativeDepsLibraryBasename = null; for (Map.Entry<String, Collection<TransitiveInfoCollection>> entry : depsByArchitecture.asMap().entrySet()) { @@ -74,14 +75,14 @@ public final class NativeLibs { configurationMap.get(entry.getKey()), toolchainMap.get(entry.getKey())); - ImmutableList.Builder<Artifact> librariesBuilder = ImmutableList.builder(); + NestedSetBuilder<Artifact> librariesBuilder = NestedSetBuilder.stableOrder(); if (nativeDepsLibrary != null) { librariesBuilder.add(nativeDepsLibrary); nativeDepsLibraryBasename = nativeDepsLibrary.getExecPath().getBaseName(); } librariesBuilder.addAll( filterUniqueSharedLibraries(ruleContext, nativeDepsLibrary, linkParams.getLibraries())); - ImmutableList<Artifact> libraries = librariesBuilder.build(); + NestedSet<Artifact> libraries = librariesBuilder.build(); if (!libraries.isEmpty()) { result.put(entry.getKey(), libraries); @@ -106,21 +107,21 @@ public final class NativeLibs { } // Map from architecture (CPU folder to place the library in) to libraries for that CPU - private final ImmutableMap<String, Iterable<Artifact>> nativeLibs; + private final ImmutableMap<String, NestedSet<Artifact>> nativeLibs; @Nullable private final Artifact nativeLibsName; @VisibleForTesting - NativeLibs(ImmutableMap<String, Iterable<Artifact>> nativeLibs, - @Nullable Artifact nativeLibsName) { + NativeLibs( + ImmutableMap<String, NestedSet<Artifact>> nativeLibs, @Nullable Artifact nativeLibsName) { this.nativeLibs = nativeLibs; this.nativeLibsName = nativeLibsName; } /** * Returns a map from the name of the architecture (CPU folder to place the library in) to the - * set of libraries for that architecture. + * nested set of libraries for that architecture. */ - public Map<String, Iterable<Artifact>> getMap() { + public Map<String, NestedSet<Artifact>> getMap() { return nativeLibs; } @@ -136,7 +137,7 @@ public final class NativeLibs { public Pair<Artifact, Runfiles> createApkBuilderSymlinks(RuleContext ruleContext) { Map<PathFragment, Artifact> symlinks = new LinkedHashMap<>(); - for (Map.Entry<String, Iterable<Artifact>> entry : nativeLibs.entrySet()) { + for (Map.Entry<String, NestedSet<Artifact>> entry : nativeLibs.entrySet()) { String arch = entry.getKey(); for (Artifact lib : entry.getValue()) { symlinks.put(PathFragment.create(arch + "/" + lib.getExecPath().getBaseName()), lib); @@ -216,7 +217,7 @@ public final class NativeLibs { + artifact.prettyPrint() + " and " + oldArtifact.prettyPrint() - + ((oldArtifact == linkedLibrary) + + ((oldArtifact.equals(linkedLibrary)) ? " (the library compiled for this target)" : "")); } diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/ApkManifestActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/ApkManifestActionTest.java index 392c9e6453..63d0589c93 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/ApkManifestActionTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/ApkManifestActionTest.java @@ -24,6 +24,8 @@ import com.google.devtools.build.lib.actions.util.LabelArtifactOwner; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.util.FileSystems; @@ -87,11 +89,16 @@ public class ApkManifestActionTest { null, // mainDexProguardConfig false /* legacy */); - NativeLibs nativeLibs = new NativeLibs( - ImmutableMap.<String, Iterable<Artifact>>of( - "x86", ImmutableList.of(createArtifact("/workspace/java/test/x86.so")), - "arm", ImmutableList.of(createArtifact("/workspace/java/test/arm.so"))), - null /* nativeLibsName */); + NativeLibs nativeLibs = + new NativeLibs( + ImmutableMap.<String, NestedSet<Artifact>>of( + "x86", NestedSetBuilder.<Artifact>stableOrder() + .add(createArtifact("/workspace/java/test/x86.so")) + .build(), + "arm", NestedSetBuilder.<Artifact>stableOrder() + .add(createArtifact("/workspace/java/test/arm.so")) + .build()), + null /* nativeLibsName */); Artifact debugKeystore = createArtifact("/workspace/tools/android/debug_keystore"); |