Skip to content

Commit

Permalink
Add getImplicitOutputArtifact to BuildViewTestCase. This vastly simpl…
Browse files Browse the repository at this point in the history
…ifies

finding actions based on intermediate artifacts.

--
PiperOrigin-RevId: 145303065
MOS_MIGRATED_REVID=145303065
  • Loading branch information
Googler authored and katre committed Jan 23, 2017
1 parent 7a089cf commit ca43c87
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 6 deletions.
Expand Up @@ -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();
Expand All @@ -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.
*/
Expand All @@ -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<LocalResourceContainer, String> {

public ResourceContainerToArg() {
Expand Down Expand Up @@ -103,7 +109,7 @@ private static String convertRoots(Iterable<PathFragment> 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<Artifact> inputs = NestedSetBuilder.naiveLinkOrder();
Expand Down Expand Up @@ -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();
}
}
Expand Up @@ -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 =
Expand Down
Expand Up @@ -453,6 +453,7 @@ private ResourceApk createApk(

if (resourceContainer.getSymbols() != null) {
new AndroidResourceParsingActionBuilder(ruleContext)
.withPrimary(resourceContainer)
.setParse(data)
.setOutput(resourceContainer.getSymbols())
.build(ruleContext);
Expand Down
Expand Up @@ -99,13 +99,15 @@
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;
import com.google.devtools.build.lib.packages.OutputFile;
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;
Expand Down Expand Up @@ -1811,4 +1813,28 @@ protected Map<String, String> 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);
}
}

0 comments on commit ca43c87

Please sign in to comment.