diff options
author | 2016-07-20 17:47:49 +0000 | |
---|---|---|
committer | 2016-07-20 19:54:32 +0000 | |
commit | ebf601d340c570d2666a1293a144975938a063f2 (patch) | |
tree | eea31029e94770d552faeb7e427f93435e338bc5 /src/main/java/com/google | |
parent | ff8ea95fb2e4c77104263bebbf21c7e4e7a00d00 (diff) |
Add target names for mergee manifests to generate more helpful error messages from manifest merging when using manifest_merger="android" on android_binary rules.
--
MOS_MIGRATED_REVID=127962630
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java | 19 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java | 45 |
2 files changed, 47 insertions, 17 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java index 8992776ec2..1511af5b5e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java @@ -19,7 +19,7 @@ import static com.google.devtools.build.lib.syntax.Type.STRING; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSortedSet; +import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.devtools.build.lib.actions.Artifact; @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.actions.FileWriteAction; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.config.CompilationMode; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidManifestMerger; import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer; import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceType; @@ -202,7 +203,7 @@ public final class ApplicationManifest { } public ApplicationManifest mergeWith(RuleContext ruleContext, ResourceDependencies resourceDeps) { - Iterable<Artifact> mergeeManifests = getMergeeManifests(resourceDeps.getResources()); + Map<Artifact, Label> mergeeManifests = getMergeeManifests(resourceDeps.getResources()); boolean legacy = true; if (ruleContext.isLegalFragment(AndroidConfiguration.class) @@ -216,16 +217,16 @@ public final class ApplicationManifest { } if (legacy) { - if (!Iterables.isEmpty(mergeeManifests)) { + if (!mergeeManifests.isEmpty()) { Artifact outputManifest = ruleContext.getUniqueDirectoryArtifact( ruleContext.getRule().getName() + "_merged", "AndroidManifest.xml", ruleContext.getBinOrGenfilesDirectory()); AndroidManifestMergeHelper.createMergeManifestAction(ruleContext, getManifest(), - mergeeManifests, ImmutableList.of("all"), outputManifest); + mergeeManifests.keySet(), ImmutableList.of("all"), outputManifest); return new ApplicationManifest(ruleContext, outputManifest); } } else { - if (!Iterables.isEmpty(mergeeManifests) || !manifestValues.isEmpty()) { + if (!mergeeManifests.isEmpty() || !manifestValues.isEmpty()) { Artifact outputManifest = ruleContext.getUniqueDirectoryArtifact( ruleContext.getRule().getName() + "_merged", "AndroidManifest.xml", ruleContext.getBinOrGenfilesDirectory()); @@ -243,13 +244,13 @@ public final class ApplicationManifest { return this; } - private static Iterable<Artifact> getMergeeManifests( + private static Map<Artifact, Label> getMergeeManifests( Iterable<ResourceContainer> resourceContainers) { - ImmutableSortedSet.Builder<Artifact> builder = - ImmutableSortedSet.orderedBy(Artifact.EXEC_PATH_COMPARATOR); + ImmutableSortedMap.Builder<Artifact, Label> builder = + ImmutableSortedMap.orderedBy(Artifact.EXEC_PATH_COMPARATOR); for (ResourceContainer r : resourceContainers) { if (r.isManifestExported()) { - builder.add(r.getManifest()); + builder.put(r.getManifest(), r.getLabel()); } } return builder.build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java index 21174401a0..4d480579df 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java @@ -13,17 +13,20 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; +import com.google.common.base.Function; +import com.google.common.base.Functions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; 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 java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -35,7 +38,7 @@ public class ManifestMergerActionBuilder { private final SpawnAction.Builder spawnActionBuilder; private Artifact manifest; - private List<Artifact> mergeeManifests; + private Map<Artifact, Label> mergeeManifests; private boolean isLibrary; private Map<String, String> manifestValues; private String customPackage; @@ -51,8 +54,8 @@ public class ManifestMergerActionBuilder { return this; } - public ManifestMergerActionBuilder setMergeeManifests(Iterable<Artifact> mergeeManifests) { - this.mergeeManifests = ImmutableList.copyOf(mergeeManifests); + public ManifestMergerActionBuilder setMergeeManifests(Map<Artifact, Label> mergeeManifests) { + this.mergeeManifests = ImmutableMap.copyOf(mergeeManifests); return this; } @@ -89,8 +92,15 @@ public class ManifestMergerActionBuilder { inputs.add(manifest); if (mergeeManifests != null && !mergeeManifests.isEmpty()) { - builder.addJoinExecPaths("--mergeeManifests", ":", mergeeManifests); - inputs.addAll(mergeeManifests); + builder.add("--mergeeManifests") + .add(mapToDictionaryString(mergeeManifests, + new Function<Artifact, String>() { + @Override public String apply(Artifact input) { + return input.getExecPathString(); + } + }, + null /* valueConverter */)); + inputs.addAll(mergeeManifests.keySet()); } if (isLibrary) { @@ -120,14 +130,33 @@ public class ManifestMergerActionBuilder { .build(context)); } + private static final Function<String, String> ESCAPER = new Function<String, String>() { + @Override public String apply(String value) { + return value.replace(":", "\\:").replace(",", "\\,"); + } + }; + private <K, V> String mapToDictionaryString(Map<K, V> map) { + return mapToDictionaryString(map, Functions.toStringFunction(), Functions.toStringFunction()); + } + + private <K, V> String mapToDictionaryString(Map<K, V> map, + Function<? super K, String> keyConverter, + Function<? super V, String> valueConverter) { + if (keyConverter == null) { + keyConverter = Functions.toStringFunction(); + } + if (valueConverter == null) { + valueConverter = Functions.toStringFunction(); + } + StringBuilder sb = new StringBuilder(); Iterator<Entry<K, V>> iter = map.entrySet().iterator(); while (iter.hasNext()) { Entry<K, V> entry = iter.next(); - sb.append(entry.getKey().toString().replace(":", "\\:").replace(",", "\\,")); + sb.append(Functions.compose(ESCAPER, keyConverter).apply(entry.getKey())); sb.append(':'); - sb.append(entry.getValue().toString().replace(":", "\\:").replace(",", "\\,")); + sb.append(Functions.compose(ESCAPER, valueConverter).apply(entry.getValue())); if (iter.hasNext()) { sb.append(','); } |