blob: 776f2152cd0ad03e340b1d235a14615f0e57f472 [file] [log] [blame]
// 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.common.base.Functions;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
import com.google.devtools.build.lib.actions.Action;
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.CommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer;
import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceType;
import java.util.ArrayList;
import java.util.List;
/**
* Builder for creating aar generator action.
*/
public class AarGeneratorBuilder {
private ResourceContainer primary;
private Artifact manifest;
private Artifact rTxt;
private Artifact classes;
private Artifact aarOut;
private final RuleContext ruleContext;
private final SpawnAction.Builder builder;
/**
* Creates an {@link AarGeneratorBuilder}.
*
* @param ruleContext The {@link RuleContext} that is used to register the {@link Action}.
*/
public AarGeneratorBuilder(RuleContext ruleContext) {
this.ruleContext = ruleContext;
this.builder = new SpawnAction.Builder();
}
public AarGeneratorBuilder withPrimary(ResourceContainer primary) {
this.primary = primary;
return this;
}
public AarGeneratorBuilder withManifest(Artifact manifest) {
this.manifest = manifest;
return this;
}
public AarGeneratorBuilder withRtxt(Artifact rTxt) {
this.rTxt = rTxt;
return this;
}
public AarGeneratorBuilder withClasses(Artifact classes) {
this.classes = classes;
return this;
}
public AarGeneratorBuilder setAAROut(Artifact aarOut) {
this.aarOut = aarOut;
return this;
}
public void build(ActionConstructionContext context) {
List<Artifact> outs = new ArrayList<>();
List<Artifact> ins = new ArrayList<>();
List<String> args = new ArrayList<>();
args.add("--mainData");
addPrimaryResourceContainer(ins, args, primary);
if (manifest != null) {
args.add("--manifest");
args.add(manifest.getExecPathString());
ins.add(manifest);
}
if (rTxt != null) {
args.add("--rtxt");
args.add(rTxt.getExecPathString());
ins.add(rTxt);
}
if (classes != null) {
args.add("--classes");
args.add(classes.getExecPathString());
ins.add(classes);
}
args.add("--aarOutput");
args.add(aarOut.getExecPathString());
outs.add(aarOut);
ruleContext.registerAction(this.builder
.addInputs(ImmutableList.<Artifact>copyOf(ins))
.addOutputs(ImmutableList.<Artifact>copyOf(outs))
.setCommandLine(CommandLine.of(args, false))
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_aar_generator", Mode.HOST))
.setProgressMessage("Building AAR package for " + ruleContext.getLabel())
.setMnemonic("AARGenerator")
.build(context));
}
private void addPrimaryResourceContainer(List<Artifact> inputs, List<String> args,
ResourceContainer container) {
Iterables.addAll(inputs, container.getArtifacts());
inputs.add(container.getManifest());
// no R.txt, because it will be generated from this action.
args.add(String.format("%s:%s:%s",
convertRoots(container, ResourceType.RESOURCES),
convertRoots(container, ResourceType.ASSETS),
container.getManifest().getExecPathString()
));
}
private static String convertRoots(ResourceContainer container, ResourceType resourceType) {
return Joiner.on("#").join(
Iterators.transform(
container.getRoots(resourceType).iterator(), Functions.toStringFunction()));
}
}