blob: 26521fec529884ac71ad916126d176d757694648 [file] [log] [blame]
/*
* Copyright 2014-present Facebook, Inc.
*
* 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.facebook.buck.android;
import com.facebook.buck.model.BuildTargets;
import com.facebook.buck.rules.AbstractBuildRule;
import com.facebook.buck.rules.BuildContext;
import com.facebook.buck.rules.BuildOutputInitializer;
import com.facebook.buck.rules.BuildRuleParams;
import com.facebook.buck.rules.BuildableContext;
import com.facebook.buck.rules.InitializableFromDisk;
import com.facebook.buck.rules.OnDiskBuildInfo;
import com.facebook.buck.rules.RecordFileSha1Step;
import com.facebook.buck.rules.RuleKey;
import com.facebook.buck.rules.Sha1HashCode;
import com.facebook.buck.rules.SourcePathResolver;
import com.facebook.buck.step.Step;
import com.facebook.buck.step.fs.MakeCleanDirectoryStep;
import com.facebook.buck.zip.ZipStep;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.hash.Hashing;
import java.nio.file.Path;
import javax.annotation.Nullable;
/**
* Buildable responsible for compiling non-english string resources to {@code .fbstr} files stored
* as assets. Only applicable for {@code android_binary} rules with {@code resource_compression}
* parameter set to {@link com.facebook.buck.android.ResourcesFilter.ResourceCompressionMode
* #ENABLED_WITH_STRINGS_AS_ASSETS}.
*/
public class PackageStringAssets extends AbstractBuildRule
implements InitializableFromDisk<PackageStringAssets.BuildOutput> {
private static final String STRING_ASSETS_ZIP_HASH = "STRING_ASSETS_ZIP_HASH";
private final FilteredResourcesProvider filteredResourcesProvider;
private final AaptPackageResources aaptPackageResources;
private final BuildOutputInitializer<BuildOutput> buildOutputInitializer;
public PackageStringAssets(
BuildRuleParams params,
SourcePathResolver resolver,
FilteredResourcesProvider filteredResourcesProvider,
AaptPackageResources aaptPackageResources) {
super(params, resolver);
this.filteredResourcesProvider = filteredResourcesProvider;
this.aaptPackageResources = aaptPackageResources;
this.buildOutputInitializer = new BuildOutputInitializer<>(params.getBuildTarget(), this);
}
@Override
public ImmutableCollection<Path> getInputsToCompareToOutput() {
return ImmutableSet.of();
}
@Override
public ImmutableList<Step> getBuildSteps(
BuildContext context,
BuildableContext buildableContext) {
if (filteredResourcesProvider.getResDirectories().isEmpty()) {
// There is no zip file, but we still need to provide a consistent hash to
// ComputeExopackageDepsAbi in this case.
buildableContext.addMetadata(
STRING_ASSETS_ZIP_HASH,
Hashing.sha1().hashInt(0).toString());
return ImmutableList.of();
}
ImmutableList.Builder<Step> steps = ImmutableList.builder();
// We need to generate a zip file with the following dir structure:
// /assets/strings/*.fbstr
Path pathToBaseDir = getPathToStringAssetsDir();
steps.add(new MakeCleanDirectoryStep(pathToBaseDir));
Path pathToDirContainingAssetsDir = pathToBaseDir.resolve("string_assets");
steps.add(new MakeCleanDirectoryStep(pathToDirContainingAssetsDir));
Path pathToStrings = pathToDirContainingAssetsDir.resolve("assets").resolve("strings");
Path pathToStringAssetsZip = getPathToStringAssetsZip();
steps.add(new MakeCleanDirectoryStep(pathToStrings));
steps.add(new CompileStringsStep(
filteredResourcesProvider.getNonEnglishStringFiles(),
aaptPackageResources.getPathToRDotTxtDir(),
pathToStrings));
steps.add(new ZipStep(
pathToStringAssetsZip,
ImmutableSet.<Path>of(),
false,
ZipStep.MAX_COMPRESSION_LEVEL,
pathToDirContainingAssetsDir));
steps.add(
new RecordFileSha1Step(pathToStringAssetsZip, STRING_ASSETS_ZIP_HASH, buildableContext));
buildableContext.recordArtifact(pathToStringAssetsZip);
return steps.build();
}
public Path getPathToStringAssetsZip() {
return getPathToStringAssetsDir().resolve("string_assets.zip");
}
public Sha1HashCode getStringAssetsZipHash() {
return buildOutputInitializer.getBuildOutput().stringAssetsZipHash;
}
@Override
public BuildOutput initializeFromDisk(OnDiskBuildInfo onDiskBuildInfo) {
return new BuildOutput(onDiskBuildInfo.getHash(STRING_ASSETS_ZIP_HASH).get());
}
@Override
public BuildOutputInitializer<BuildOutput> getBuildOutputInitializer() {
return buildOutputInitializer;
}
public static class BuildOutput {
private final Sha1HashCode stringAssetsZipHash;
public BuildOutput(Sha1HashCode stringAssetsZipHash) {
this.stringAssetsZipHash = stringAssetsZipHash;
}
}
@Override
public RuleKey.Builder appendDetailsToRuleKey(RuleKey.Builder builder) {
return builder;
}
@Nullable
@Override
public Path getPathToOutputFile() {
return null;
}
private Path getPathToStringAssetsDir() {
return BuildTargets.getBinPath(getBuildTarget(), "__strings_%s__");
}
}