From ca43c878a28bfd183933a6228cbad937d9c79f2a Mon Sep 17 00:00:00 2001 From: Googler Date: Mon, 23 Jan 2017 18:29:47 +0000 Subject: [PATCH] Add getImplicitOutputArtifact to BuildViewTestCase. This vastly simplifies finding actions based on intermediate artifacts. -- PiperOrigin-RevId: 145303065 MOS_MIGRATED_REVID=145303065 --- .../AndroidResourceParsingActionBuilder.java | 19 +++++++++----- .../lib/rules/android/AndroidRuleClasses.java | 2 ++ .../rules/android/ApplicationManifest.java | 1 + .../lib/analysis/util/BuildViewTestCase.java | 26 +++++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java index 9b6edbaff694d6..024fb104b6d6aa 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java @@ -31,10 +31,8 @@ import java.util.ArrayList; import java.util.List; -/** - * Builder for creating $android_resource_parser action. - */ -class AndroidResourceParsingActionBuilder { +/** Builder for creating $android_resource_parser action. */ +public class AndroidResourceParsingActionBuilder { private static final ResourceContainerToArtifacts RESOURCE_CONTAINER_TO_ARTIFACTS = new ResourceContainerToArtifacts(); @@ -46,6 +44,8 @@ class AndroidResourceParsingActionBuilder { private LocalResourceContainer primary; private Artifact output; + private ResourceContainer resourceContainer; + /** * @param ruleContext The RuleContext that was used to create the SpawnAction.Builder. */ @@ -69,6 +69,12 @@ public AndroidResourceParsingActionBuilder setOutput(Artifact output) { return this; } + /** Set the primary resources. */ + public AndroidResourceParsingActionBuilder withPrimary(ResourceContainer resourceContainer) { + this.resourceContainer = resourceContainer; + return this; + } + private static class ResourceContainerToArg implements Function { public ResourceContainerToArg() { @@ -103,7 +109,7 @@ private static String convertRoots(Iterable roots) { return Joiner.on("#").join(Iterables.transform(roots, Functions.toStringFunction())); } - public Artifact build(ActionConstructionContext context) { + public ResourceContainer build(ActionConstructionContext context) { CustomCommandLine.Builder builder = new CustomCommandLine.Builder(); NestedSetBuilder inputs = NestedSetBuilder.naiveLinkOrder(); @@ -132,6 +138,7 @@ public Artifact build(ActionConstructionContext context) { .setProgressMessage("Parsing Android resources for " + ruleContext.getLabel()) .setMnemonic("AndroidResourceParser") .build(context)); - return output; + + return resourceContainer.toBuilder().setSymbols(output).build(); } } 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 786fde860d2938..9148e849f97079 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 @@ -114,6 +114,8 @@ public final class AndroidRuleClasses { fromTemplates("%{name}_filtered.jar"); public static final SafeImplicitOutputsFunction ANDROID_R_TXT = fromTemplates("%{name}_symbols/R.txt"); + public static final SafeImplicitOutputsFunction ANDROID_LOCAL_SYMBOLS = + fromTemplates("%{name}_symbols/local.bin"); public static final SafeImplicitOutputsFunction ANDROID_SYMBOLS = fromTemplates("%{name}_symbols/symbols.bin"); public static final ImplicitOutputsFunction ANDROID_PROCESSED_MANIFEST = 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 7c6ba63296bc5a..05c896a96fa0c0 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 @@ -453,6 +453,7 @@ private ResourceApk createApk( if (resourceContainer.getSymbols() != null) { new AndroidResourceParsingActionBuilder(ruleContext) + .withPrimary(resourceContainer) .setParse(data) .setOutput(resourceContainer.getSymbols()) .build(ruleContext); diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java index 476f90dd6740b1..3121bfcb5b577b 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java @@ -99,6 +99,7 @@ import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition; import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.ConstantRuleVisibility; +import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; @@ -106,6 +107,7 @@ import com.google.devtools.build.lib.packages.PackageFactory; import com.google.devtools.build.lib.packages.PackageFactory.EnvironmentExtension; import com.google.devtools.build.lib.packages.Preprocessor; +import com.google.devtools.build.lib.packages.RawAttributeMapper; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.util.MockToolsConfig; @@ -1811,4 +1813,28 @@ protected Map getSymlinkTreeManifest(Artifact outputManifest) th return result.build(); } + + protected Artifact getImplicitOutputArtifact( + ConfiguredTarget target, SafeImplicitOutputsFunction outputFunction) { + Rule associatedRule = target.getTarget().getAssociatedRule(); + RepositoryName repository = associatedRule.getRepository(); + BuildConfiguration configuration = target.getConfiguration(); + + Root root; + if (associatedRule.hasBinaryOutput()) { + root = configuration.getBinDirectory(repository); + } else { + root = configuration.getGenfilesDirectory(repository); + } + ArtifactOwner owner = + new ConfiguredTargetKey(target.getTarget().getLabel(), target.getConfiguration()); + + RawAttributeMapper attr = RawAttributeMapper.of(associatedRule); + + String path = Iterables.getOnlyElement(outputFunction.getImplicitOutputs(attr)); + + return view.getArtifactFactory() + .getDerivedArtifact( + target.getTarget().getLabel().getPackageFragment().getRelative(path), root, owner); + } }