/*
* Copyright 2012-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.rules;
import com.facebook.buck.android.AndroidAarDescription;
import com.facebook.buck.android.AndroidBinaryDescription;
import com.facebook.buck.android.AndroidBuckConfig;
import com.facebook.buck.android.AndroidBuildConfigDescription;
import com.facebook.buck.android.AndroidDirectoryResolver;
import com.facebook.buck.android.AndroidInstrumentationApkDescription;
import com.facebook.buck.android.AndroidInstrumentationTestDescription;
import com.facebook.buck.android.AndroidLibraryDescription;
import com.facebook.buck.android.AndroidManifestDescription;
import com.facebook.buck.android.AndroidPrebuiltAarDescription;
import com.facebook.buck.android.AndroidResourceDescription;
import com.facebook.buck.android.ApkGenruleDescription;
import com.facebook.buck.android.DefaultAndroidLibraryCompilerFactory;
import com.facebook.buck.android.DxConfig;
import com.facebook.buck.android.GenAidlDescription;
import com.facebook.buck.android.NdkCxxPlatform;
import com.facebook.buck.android.NdkCxxPlatformCompiler;
import com.facebook.buck.android.NdkCxxPlatforms;
import com.facebook.buck.android.NdkLibraryDescription;
import com.facebook.buck.android.PrebuiltNativeLibraryDescription;
import com.facebook.buck.android.ProGuardConfig;
import com.facebook.buck.android.RobolectricTestDescription;
import com.facebook.buck.android.SmartDexingStep;
import com.facebook.buck.apple.AppleAssetCatalogDescription;
import com.facebook.buck.apple.AppleBinaryDescription;
import com.facebook.buck.apple.AppleBundleDescription;
import com.facebook.buck.apple.AppleConfig;
import com.facebook.buck.apple.AppleCxxPlatform;
import com.facebook.buck.apple.AppleCxxPlatforms;
import com.facebook.buck.apple.AppleLibraryDescription;
import com.facebook.buck.apple.ApplePackageDescription;
import com.facebook.buck.apple.AppleResourceDescription;
import com.facebook.buck.apple.AppleTestDescription;
import com.facebook.buck.apple.CodeSignIdentityStore;
import com.facebook.buck.apple.CoreDataModelDescription;
import com.facebook.buck.apple.PrebuiltAppleFrameworkDescription;
import com.facebook.buck.apple.ProvisioningProfileStore;
import com.facebook.buck.apple.SceneKitAssetsDescription;
import com.facebook.buck.apple.XcodePostbuildScriptDescription;
import com.facebook.buck.apple.XcodePrebuildScriptDescription;
import com.facebook.buck.apple.XcodeWorkspaceConfigDescription;
import com.facebook.buck.cli.BuckConfig;
import com.facebook.buck.cli.DownloadConfig;
import com.facebook.buck.cxx.CxxBinaryDescription;
import com.facebook.buck.cxx.CxxBuckConfig;
import com.facebook.buck.cxx.CxxGenruleDescription;
import com.facebook.buck.cxx.CxxLibraryDescription;
import com.facebook.buck.cxx.CxxPlatform;
import com.facebook.buck.cxx.CxxPlatforms;
import com.facebook.buck.cxx.CxxPrecompiledHeaderDescription;
import com.facebook.buck.cxx.CxxTestDescription;
import com.facebook.buck.cxx.DefaultCxxPlatforms;
import com.facebook.buck.cxx.InferBuckConfig;
import com.facebook.buck.cxx.PrebuiltCxxLibraryDescription;
import com.facebook.buck.cxx.PrebuiltCxxLibraryGroupDescription;
import com.facebook.buck.d.DBinaryDescription;
import com.facebook.buck.d.DBuckConfig;
import com.facebook.buck.d.DLibraryDescription;
import com.facebook.buck.d.DTestDescription;
import com.facebook.buck.dotnet.CsharpLibraryDescription;
import com.facebook.buck.dotnet.PrebuiltDotnetLibraryDescription;
import com.facebook.buck.file.Downloader;
import com.facebook.buck.file.ExplodingDownloader;
import com.facebook.buck.file.RemoteFileDescription;
import com.facebook.buck.file.StackedDownloader;
import com.facebook.buck.go.GoBinaryDescription;
import com.facebook.buck.go.GoBuckConfig;
import com.facebook.buck.go.GoLibraryDescription;
import com.facebook.buck.go.GoTestDescription;
import com.facebook.buck.graphql.GraphqlLibraryDescription;
import com.facebook.buck.gwt.GwtBinaryDescription;
import com.facebook.buck.halide.HalideBuckConfig;
import com.facebook.buck.halide.HalideLibraryDescription;
import com.facebook.buck.haskell.HaskellBinaryDescription;
import com.facebook.buck.haskell.HaskellBuckConfig;
import com.facebook.buck.haskell.HaskellLibraryDescription;
import com.facebook.buck.haskell.HaskellPrebuiltLibraryDescription;
import com.facebook.buck.io.ExecutableFinder;
import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.js.AndroidReactNativeLibraryDescription;
import com.facebook.buck.js.IosReactNativeLibraryDescription;
import com.facebook.buck.js.JsBundleDescription;
import com.facebook.buck.js.JsLibraryDescription;
import com.facebook.buck.js.ReactNativeBuckConfig;
import com.facebook.buck.jvm.groovy.GroovyBuckConfig;
import com.facebook.buck.jvm.groovy.GroovyLibraryDescription;
import com.facebook.buck.jvm.groovy.GroovyTestDescription;
import com.facebook.buck.jvm.java.JavaAnnotationProcessorDescription;
import com.facebook.buck.jvm.java.JavaBinaryDescription;
import com.facebook.buck.jvm.java.JavaBuckConfig;
import com.facebook.buck.jvm.java.JavaLibraryDescription;
import com.facebook.buck.jvm.java.JavaOptions;
import com.facebook.buck.jvm.java.JavaTestDescription;
import com.facebook.buck.jvm.java.JavacOptions;
import com.facebook.buck.jvm.java.KeystoreDescription;
import com.facebook.buck.jvm.java.PrebuiltJarDescription;
import com.facebook.buck.jvm.kotlin.KotlinBuckConfig;
import com.facebook.buck.jvm.kotlin.KotlinLibraryDescription;
import com.facebook.buck.jvm.kotlin.KotlinTestDescription;
import com.facebook.buck.jvm.scala.ScalaBuckConfig;
import com.facebook.buck.jvm.scala.ScalaLibraryDescription;
import com.facebook.buck.jvm.scala.ScalaTestDescription;
import com.facebook.buck.log.CommandThreadFactory;
import com.facebook.buck.log.Logger;
import com.facebook.buck.lua.CxxLuaExtensionDescription;
import com.facebook.buck.lua.LuaBinaryDescription;
import com.facebook.buck.lua.LuaBuckConfig;
import com.facebook.buck.lua.LuaConfig;
import com.facebook.buck.lua.LuaLibraryDescription;
import com.facebook.buck.model.Flavor;
import com.facebook.buck.model.FlavorDomain;
import com.facebook.buck.model.InternalFlavor;
import com.facebook.buck.ocaml.OcamlBinaryDescription;
import com.facebook.buck.ocaml.OcamlBuckConfig;
import com.facebook.buck.ocaml.OcamlLibraryDescription;
import com.facebook.buck.ocaml.PrebuiltOcamlLibraryDescription;
import com.facebook.buck.python.CxxPythonExtensionDescription;
import com.facebook.buck.python.PrebuiltPythonLibraryDescription;
import com.facebook.buck.python.PythonBinaryDescription;
import com.facebook.buck.python.PythonBuckConfig;
import com.facebook.buck.python.PythonLibraryDescription;
import com.facebook.buck.python.PythonPlatform;
import com.facebook.buck.python.PythonTestDescription;
import com.facebook.buck.rust.PrebuiltRustLibraryDescription;
import com.facebook.buck.rust.RustBinaryDescription;
import com.facebook.buck.rust.RustBuckConfig;
import com.facebook.buck.rust.RustLibraryDescription;
import com.facebook.buck.rust.RustTestDescription;
import com.facebook.buck.shell.ExportFileDescription;
import com.facebook.buck.shell.GenruleDescription;
import com.facebook.buck.shell.ShBinaryDescription;
import com.facebook.buck.shell.ShTestDescription;
import com.facebook.buck.shell.WorkerToolDescription;
import com.facebook.buck.swift.SwiftBuckConfig;
import com.facebook.buck.swift.SwiftLibraryDescription;
import com.facebook.buck.swift.SwiftPlatform;
import com.facebook.buck.util.HumanReadableException;
import com.facebook.buck.util.ProcessExecutor;
import com.facebook.buck.util.environment.Platform;
import com.facebook.buck.versions.VersionedAliasDescription;
import com.facebook.buck.zip.ZipFileDescription;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Executors;
import javax.annotation.Nullable;
/** A registry of all the build rules types understood by Buck. */
public class KnownBuildRuleTypes {
private static final Logger LOG = Logger.get(KnownBuildRuleTypes.class);
private final ImmutableMap<BuildRuleType, Description<?>> descriptions;
private final ImmutableMap<String, BuildRuleType> types;
private final FlavorDomain<CxxPlatform> cxxPlatforms;
private final CxxPlatform defaultCxxPlatforms;
private KnownBuildRuleTypes(
Map<BuildRuleType, Description<?>> descriptions,
Map<String, BuildRuleType> types,
FlavorDomain<CxxPlatform> cxxPlatforms,
CxxPlatform defaultCxxPlatforms) {
this.descriptions = ImmutableMap.copyOf(descriptions);
this.types = ImmutableMap.copyOf(types);
this.cxxPlatforms = cxxPlatforms;
this.defaultCxxPlatforms = defaultCxxPlatforms;
}
public BuildRuleType getBuildRuleType(String named) {
BuildRuleType type = types.get(named);
if (type == null) {
throw new HumanReadableException("Unable to find build rule type: " + named);
}
return type;
}
public Description<?> getDescription(BuildRuleType buildRuleType) {
Description<?> description = descriptions.get(buildRuleType);
if (description == null) {
throw new HumanReadableException(
"Unable to find description for build rule type: " + buildRuleType);
}
return description;
}
public ImmutableSet<Description<?>> getAllDescriptions() {
return ImmutableSet.copyOf(descriptions.values());
}
public FlavorDomain<CxxPlatform> getCxxPlatforms() {
return cxxPlatforms;
}
public CxxPlatform getDefaultCxxPlatforms() {
return defaultCxxPlatforms;
}
public static Builder builder() {
return new Builder();
}
public static KnownBuildRuleTypes createInstance(
BuckConfig config,
ProjectFilesystem filesystem,
ProcessExecutor processExecutor,
AndroidDirectoryResolver androidDirectoryResolver)
throws InterruptedException, IOException {
return createBuilder(config, filesystem, processExecutor, androidDirectoryResolver).build();
}
@VisibleForTesting
static Builder createBuilder(
BuckConfig config,
ProjectFilesystem filesystem,
ProcessExecutor processExecutor,
AndroidDirectoryResolver androidDirectoryResolver)
throws InterruptedException, IOException {
Platform platform = Platform.detect();
AndroidBuckConfig androidConfig = new AndroidBuckConfig(config, platform);
Optional<String> ndkVersion = androidConfig.getNdkVersion();
// If a NDK version isn't specified, we've got to reach into the runtime environment to find
// out which one we will end up using.
if (!ndkVersion.isPresent()) {
ndkVersion = androidDirectoryResolver.getNdkVersion();
}
SwiftBuckConfig swiftBuckConfig = new SwiftBuckConfig(config);
FlavorDomain<AppleCxxPlatform> platformFlavorsToAppleCxxPlatforms =
FlavorDomain.from(
"Apple C++ Platform",
AppleCxxPlatforms.buildAppleCxxPlatforms(
filesystem, config, swiftBuckConfig, processExecutor));
ImmutableMap.Builder<Flavor, SwiftPlatform> swiftPlatforms = ImmutableMap.builder();
for (Flavor flavor : platformFlavorsToAppleCxxPlatforms.getFlavors()) {
platformFlavorsToAppleCxxPlatforms
.getValue(flavor)
.getSwiftPlatform()
.ifPresent(swiftPlatform -> swiftPlatforms.put(flavor, swiftPlatform));
}
FlavorDomain<SwiftPlatform> platformFlavorsToSwiftPlatforms =
new FlavorDomain<>("Swift Platform", swiftPlatforms.build());
CxxBuckConfig cxxBuckConfig = new CxxBuckConfig(config);
// Setup the NDK C/C++ platforms.
Optional<Path> ndkRoot = androidDirectoryResolver.getNdkOrAbsent();
ImmutableMap.Builder<NdkCxxPlatforms.TargetCpuType, NdkCxxPlatform> ndkCxxPlatformsBuilder =
ImmutableMap.builder();
if (ndkRoot.isPresent()) {
NdkCxxPlatformCompiler.Type compilerType =
androidConfig.getNdkCompiler().orElse(NdkCxxPlatforms.DEFAULT_COMPILER_TYPE);
String gccVersion =
androidConfig
.getNdkGccVersion()
.orElse(NdkCxxPlatforms.getDefaultGccVersionForNdk(ndkVersion));
String clangVersion =
androidConfig
.getNdkClangVersion()
.orElse(NdkCxxPlatforms.getDefaultClangVersionForNdk(ndkVersion));
String compilerVersion =
compilerType == NdkCxxPlatformCompiler.Type.GCC ? gccVersion : clangVersion;
NdkCxxPlatformCompiler compiler =
NdkCxxPlatformCompiler.builder()
.setType(compilerType)
.setVersion(compilerVersion)
.setGccVersion(gccVersion)
.build();
ndkCxxPlatformsBuilder.putAll(
NdkCxxPlatforms.getPlatforms(
cxxBuckConfig,
androidConfig,
filesystem,
ndkRoot.get(),
compiler,
androidConfig.getNdkCxxRuntime().orElse(NdkCxxPlatforms.DEFAULT_CXX_RUNTIME),
androidConfig.getNdkAppPlatform().orElse(NdkCxxPlatforms.DEFAULT_TARGET_APP_PLATFORM),
androidConfig.getNdkCpuAbis().orElse(NdkCxxPlatforms.DEFAULT_CPU_ABIS),
platform));
}
ImmutableMap<NdkCxxPlatforms.TargetCpuType, NdkCxxPlatform> ndkCxxPlatforms =
ndkCxxPlatformsBuilder.build();
// Create a map of system platforms.
ImmutableMap.Builder<Flavor, CxxPlatform> cxxSystemPlatformsBuilder = ImmutableMap.builder();
// If an Android NDK is present, add platforms for that. This is mostly useful for
// testing our Android NDK support for right now.
for (NdkCxxPlatform ndkCxxPlatform : ndkCxxPlatforms.values()) {
cxxSystemPlatformsBuilder.put(
ndkCxxPlatform.getCxxPlatform().getFlavor(), ndkCxxPlatform.getCxxPlatform());
}
for (AppleCxxPlatform appleCxxPlatform : platformFlavorsToAppleCxxPlatforms.getValues()) {
cxxSystemPlatformsBuilder.put(
appleCxxPlatform.getCxxPlatform().getFlavor(), appleCxxPlatform.getCxxPlatform());
}
CxxPlatform defaultHostCxxPlatform =
DefaultCxxPlatforms.build(platform, filesystem, cxxBuckConfig);
cxxSystemPlatformsBuilder.put(defaultHostCxxPlatform.getFlavor(), defaultHostCxxPlatform);
ImmutableMap<Flavor, CxxPlatform> cxxSystemPlatformsMap = cxxSystemPlatformsBuilder.build();
// Add the host platform if needed (for example, when building on Linux).
Flavor hostFlavor = CxxPlatforms.getHostFlavor();
if (!cxxSystemPlatformsMap.containsKey(hostFlavor)) {
cxxSystemPlatformsBuilder.put(
hostFlavor,
CxxPlatform.builder().from(defaultHostCxxPlatform).setFlavor(hostFlavor).build());
cxxSystemPlatformsMap = cxxSystemPlatformsBuilder.build();
}
// Add platforms for each cxx flavor obtained from the buck config files
// from sections of the form cxx#{flavor name}.
// These platforms are overrides for existing system platforms.
ImmutableSet<Flavor> possibleHostFlavors = CxxPlatforms.getAllPossibleHostFlavors();
HashMap<Flavor, CxxPlatform> cxxOverridePlatformsMap =
new HashMap<Flavor, CxxPlatform>(cxxSystemPlatformsMap);
ImmutableSet<Flavor> cxxFlavors = CxxBuckConfig.getCxxFlavors(config);
for (Flavor flavor : cxxFlavors) {
CxxPlatform baseCxxPlatform = cxxSystemPlatformsMap.get(flavor);
if (baseCxxPlatform == null) {
if (possibleHostFlavors.contains(flavor)) {
// If a flavor is for an alternate host, it's safe to skip.
continue;
}
LOG.info("Applying \"%s\" overrides to default host platform", flavor);
baseCxxPlatform = defaultHostCxxPlatform;
}
cxxOverridePlatformsMap.put(
flavor,
CxxPlatforms.copyPlatformWithFlavorAndConfig(
baseCxxPlatform, platform, new CxxBuckConfig(config, flavor), flavor));
}
// Finalize our "default" host.
// TODO(kelliem) The host flavor should default to a concrete flavor
// like "linux-x86_64", not "default".
hostFlavor = DefaultCxxPlatforms.FLAVOR;
Optional<String> hostCxxPlatformOverride = cxxBuckConfig.getHostPlatform();
if (hostCxxPlatformOverride.isPresent()) {
Flavor overrideFlavor = InternalFlavor.of(hostCxxPlatformOverride.get());
if (cxxOverridePlatformsMap.containsKey(overrideFlavor)) {
hostFlavor = overrideFlavor;
}
}
CxxPlatform hostCxxPlatform =
CxxPlatform.builder()
.from(cxxOverridePlatformsMap.get(hostFlavor))
.setFlavor(DefaultCxxPlatforms.FLAVOR)
.build();
cxxOverridePlatformsMap.put(DefaultCxxPlatforms.FLAVOR, hostCxxPlatform);
ImmutableMap<Flavor, CxxPlatform> cxxPlatformsMap =
ImmutableMap.<Flavor, CxxPlatform>builder().putAll(cxxOverridePlatformsMap).build();
ExecutableFinder executableFinder = new ExecutableFinder();
// Build up the final list of C/C++ platforms.
FlavorDomain<CxxPlatform> cxxPlatforms = new FlavorDomain<>("C/C++ platform", cxxPlatformsMap);
// Get the default target platform from config.
CxxPlatform defaultCxxPlatform =
CxxPlatforms.getConfigDefaultCxxPlatform(cxxBuckConfig, cxxPlatformsMap, hostCxxPlatform);
DBuckConfig dBuckConfig = new DBuckConfig(config);
ReactNativeBuckConfig reactNativeBuckConfig = new ReactNativeBuckConfig(config);
RustBuckConfig rustBuckConfig = new RustBuckConfig(config);
GoBuckConfig goBuckConfig = new GoBuckConfig(config, processExecutor, cxxPlatforms);
HalideBuckConfig halideBuckConfig = new HalideBuckConfig(config);
ProGuardConfig proGuardConfig = new ProGuardConfig(config);
DxConfig dxConfig = new DxConfig(config);
PythonBuckConfig pyConfig = new PythonBuckConfig(config, executableFinder);
ImmutableList<PythonPlatform> pythonPlatformsList =
pyConfig.getPythonPlatforms(processExecutor);
FlavorDomain<PythonPlatform> pythonPlatforms =
FlavorDomain.from("Python Platform", pythonPlatformsList);
PythonBinaryDescription pythonBinaryDescription =
new PythonBinaryDescription(
pyConfig, pythonPlatforms, cxxBuckConfig, defaultCxxPlatform, cxxPlatforms);
// Look up the timeout to apply to entire test rules.
Optional<Long> defaultTestRuleTimeoutMs = config.getLong("test", "rule_timeout");
// Prepare the downloader if we're allowing mid-build downloads
Downloader downloader;
DownloadConfig downloadConfig = new DownloadConfig(config);
if (downloadConfig.isDownloadAtRuntimeOk()) {
downloader =
StackedDownloader.createFromConfig(config, androidDirectoryResolver.getSdkOrAbsent());
} else {
// Or just set one that blows up
downloader = new ExplodingDownloader();
}
Builder builder = builder();
JavaBuckConfig javaConfig = config.getView(JavaBuckConfig.class);
JavacOptions defaultJavacOptions = javaConfig.getDefaultJavacOptions();
JavaOptions defaultJavaOptions = javaConfig.getDefaultJavaOptions();
JavaOptions defaultJavaOptionsForTests = javaConfig.getDefaultJavaOptionsForTests();
KotlinBuckConfig kotlinBuckConfig = new KotlinBuckConfig(config);
ScalaBuckConfig scalaConfig = new ScalaBuckConfig(config);
InferBuckConfig inferBuckConfig = new InferBuckConfig(config);
LuaConfig luaConfig = new LuaBuckConfig(config, executableFinder);
CxxBinaryDescription cxxBinaryDescription =
new CxxBinaryDescription(cxxBuckConfig, inferBuckConfig, defaultCxxPlatform, cxxPlatforms);
CxxLibraryDescription cxxLibraryDescription =
new CxxLibraryDescription(cxxBuckConfig, defaultCxxPlatform, inferBuckConfig, cxxPlatforms);
SwiftLibraryDescription swiftLibraryDescription =
new SwiftLibraryDescription(
cxxBuckConfig, swiftBuckConfig, cxxPlatforms, platformFlavorsToSwiftPlatforms);
builder.register(swiftLibraryDescription);
AppleConfig appleConfig = config.getView(AppleConfig.class);
CodeSignIdentityStore codeSignIdentityStore =
CodeSignIdentityStore.fromSystem(
processExecutor, appleConfig.getCodeSignIdentitiesCommand());
ProvisioningProfileStore provisioningProfileStore =
ProvisioningProfileStore.fromSearchPath(
processExecutor,
appleConfig.getProvisioningProfileReadCommand(),
appleConfig.getProvisioningProfileSearchPath());
AppleLibraryDescription appleLibraryDescription =
new AppleLibraryDescription(
cxxLibraryDescription,
swiftLibraryDescription,
platformFlavorsToAppleCxxPlatforms,
defaultCxxPlatform,
codeSignIdentityStore,
provisioningProfileStore,
appleConfig);
builder.register(appleLibraryDescription);
PrebuiltAppleFrameworkDescription appleFrameworkDescription =
new PrebuiltAppleFrameworkDescription(platformFlavorsToAppleCxxPlatforms);
builder.register(appleFrameworkDescription);
AppleBinaryDescription appleBinaryDescription =
new AppleBinaryDescription(
cxxBinaryDescription,
swiftLibraryDescription,
platformFlavorsToAppleCxxPlatforms,
codeSignIdentityStore,
provisioningProfileStore,
appleConfig);
builder.register(appleBinaryDescription);
HaskellBuckConfig haskellBuckConfig = new HaskellBuckConfig(config, executableFinder);
builder.register(new HaskellLibraryDescription(haskellBuckConfig, cxxBuckConfig, cxxPlatforms));
builder.register(
new HaskellBinaryDescription(haskellBuckConfig, cxxPlatforms, defaultCxxPlatform));
builder.register(new HaskellPrebuiltLibraryDescription());
if (javaConfig.getDxThreadCount().isPresent()) {
LOG.warn("java.dx_threads has been deprecated. Use dx.max_threads instead");
}
// Create an executor service exclusively for the smart dexing step.
ListeningExecutorService dxExecutorService =
MoreExecutors.listeningDecorator(
Executors.newFixedThreadPool(
dxConfig
.getDxMaxThreadCount()
.orElse(
javaConfig
.getDxThreadCount()
.orElse(SmartDexingStep.determineOptimalThreadCount())),
new CommandThreadFactory("SmartDexing")));
builder.register(
new AndroidAarDescription(
new AndroidManifestDescription(),
cxxBuckConfig,
javaConfig,
defaultJavacOptions,
ndkCxxPlatforms));
builder.register(
new AndroidBinaryDescription(
javaConfig,
defaultJavaOptions,
defaultJavacOptions,
proGuardConfig,
ndkCxxPlatforms,
dxExecutorService,
config,
cxxBuckConfig,
dxConfig));
builder.register(new AndroidBuildConfigDescription(javaConfig, defaultJavacOptions));
builder.register(
new AndroidInstrumentationApkDescription(
javaConfig,
proGuardConfig,
defaultJavacOptions,
ndkCxxPlatforms,
dxExecutorService,
cxxBuckConfig,
dxConfig));
builder.register(
new AndroidInstrumentationTestDescription(defaultJavaOptions, defaultTestRuleTimeoutMs));
builder.register(
new AndroidLibraryDescription(
javaConfig,
defaultJavacOptions,
new DefaultAndroidLibraryCompilerFactory(javaConfig, scalaConfig, kotlinBuckConfig)));
builder.register(new AndroidManifestDescription());
builder.register(new AndroidPrebuiltAarDescription(javaConfig, defaultJavacOptions));
builder.register(new AndroidReactNativeLibraryDescription(reactNativeBuckConfig));
builder.register(new AndroidResourceDescription(config.isGrayscaleImageProcessingEnabled()));
builder.register(new ApkGenruleDescription());
builder.register(new AppleAssetCatalogDescription());
builder.register(
new ApplePackageDescription(
appleConfig, defaultCxxPlatform, platformFlavorsToAppleCxxPlatforms));
AppleBundleDescription appleBundleDescription =
new AppleBundleDescription(
appleBinaryDescription,
appleLibraryDescription,
cxxPlatforms,
platformFlavorsToAppleCxxPlatforms,
defaultCxxPlatform,
codeSignIdentityStore,
provisioningProfileStore,
appleConfig);
builder.register(appleBundleDescription);
builder.register(new AppleResourceDescription());
builder.register(
new AppleTestDescription(
appleConfig,
appleLibraryDescription,
cxxPlatforms,
platformFlavorsToAppleCxxPlatforms,
defaultCxxPlatform,
codeSignIdentityStore,
provisioningProfileStore,
appleConfig.getAppleDeveloperDirectorySupplierForTests(processExecutor),
defaultTestRuleTimeoutMs));
builder.register(new CoreDataModelDescription());
builder.register(new CsharpLibraryDescription());
builder.register(cxxBinaryDescription);
builder.register(cxxLibraryDescription);
builder.register(new CxxGenruleDescription(cxxPlatforms));
builder.register(new CxxLuaExtensionDescription(luaConfig, cxxBuckConfig, cxxPlatforms));
builder.register(
new CxxPythonExtensionDescription(pythonPlatforms, cxxBuckConfig, cxxPlatforms));
builder.register(
new CxxTestDescription(
cxxBuckConfig, defaultCxxPlatform, cxxPlatforms, defaultTestRuleTimeoutMs));
builder.register(new DBinaryDescription(dBuckConfig, cxxBuckConfig, defaultCxxPlatform));
builder.register(new DLibraryDescription(dBuckConfig, cxxBuckConfig, defaultCxxPlatform));
builder.register(
new DTestDescription(
dBuckConfig, cxxBuckConfig, defaultCxxPlatform, defaultTestRuleTimeoutMs));
builder.register(new ExportFileDescription());
builder.register(new GenruleDescription());
builder.register(new GenAidlDescription());
builder.register(new GoBinaryDescription(goBuckConfig));
builder.register(new GoLibraryDescription(goBuckConfig));
builder.register(new GoTestDescription(goBuckConfig, defaultTestRuleTimeoutMs));
builder.register(new GraphqlLibraryDescription());
GroovyBuckConfig groovyBuckConfig = new GroovyBuckConfig(config);
builder.register(new GroovyLibraryDescription(groovyBuckConfig, defaultJavacOptions));
builder.register(
new GroovyTestDescription(
groovyBuckConfig,
defaultJavaOptionsForTests,
defaultJavacOptions,
defaultTestRuleTimeoutMs));
builder.register(new GwtBinaryDescription(defaultJavaOptions));
builder.register(
new HalideLibraryDescription(
cxxBuckConfig, defaultCxxPlatform, cxxPlatforms, halideBuckConfig));
builder.register(new IosReactNativeLibraryDescription(reactNativeBuckConfig));
builder.register(
new JavaBinaryDescription(
defaultJavaOptions, defaultJavacOptions, defaultCxxPlatform, javaConfig));
builder.register(new JavaAnnotationProcessorDescription());
builder.register(new JavaLibraryDescription(javaConfig, defaultJavacOptions));
builder.register(
new JavaTestDescription(
javaConfig,
defaultJavaOptionsForTests,
defaultJavacOptions,
defaultTestRuleTimeoutMs,
defaultCxxPlatform));
builder.register(new JsBundleDescription());
builder.register(new JsLibraryDescription());
builder.register(new KeystoreDescription());
builder.register(new KotlinLibraryDescription(kotlinBuckConfig));
builder.register(
new KotlinTestDescription(
kotlinBuckConfig,
defaultJavaOptionsForTests,
defaultJavacOptions,
defaultTestRuleTimeoutMs));
builder.register(
new LuaBinaryDescription(
luaConfig, cxxBuckConfig, defaultCxxPlatform, cxxPlatforms, pythonPlatforms));
builder.register(new LuaLibraryDescription());
builder.register(new NdkLibraryDescription(ndkVersion, ndkCxxPlatforms));
OcamlBuckConfig ocamlBuckConfig = new OcamlBuckConfig(config, defaultCxxPlatform);
builder.register(new OcamlBinaryDescription(ocamlBuckConfig));
builder.register(new OcamlLibraryDescription(ocamlBuckConfig));
builder.register(new PrebuiltCxxLibraryDescription(cxxBuckConfig, cxxPlatforms));
builder.register(PrebuiltCxxLibraryGroupDescription.of());
builder.register(new CxxPrecompiledHeaderDescription());
builder.register(new PrebuiltDotnetLibraryDescription());
builder.register(new PrebuiltJarDescription());
builder.register(new PrebuiltNativeLibraryDescription());
builder.register(new PrebuiltOcamlLibraryDescription());
builder.register(new PrebuiltPythonLibraryDescription());
builder.register(pythonBinaryDescription);
PythonLibraryDescription pythonLibraryDescription =
new PythonLibraryDescription(pythonPlatforms, cxxPlatforms);
builder.register(pythonLibraryDescription);
builder.register(
new PythonTestDescription(
pythonBinaryDescription,
pyConfig,
pythonPlatforms,
cxxBuckConfig,
defaultCxxPlatform,
defaultTestRuleTimeoutMs,
cxxPlatforms));
builder.register(new RemoteFileDescription(downloader));
builder.register(
new RobolectricTestDescription(
javaConfig,
defaultJavaOptionsForTests,
defaultJavacOptions,
defaultTestRuleTimeoutMs,
defaultCxxPlatform));
builder.register(new RustBinaryDescription(rustBuckConfig, cxxPlatforms, defaultCxxPlatform));
builder.register(new RustLibraryDescription(rustBuckConfig, cxxPlatforms, defaultCxxPlatform));
builder.register(new RustTestDescription(rustBuckConfig, cxxPlatforms, defaultCxxPlatform));
builder.register(new PrebuiltRustLibraryDescription());
builder.register(new ScalaLibraryDescription(scalaConfig));
builder.register(
new ScalaTestDescription(
scalaConfig, defaultJavaOptionsForTests, defaultTestRuleTimeoutMs, defaultCxxPlatform));
builder.register(new SceneKitAssetsDescription());
builder.register(new ShBinaryDescription());
builder.register(new ShTestDescription(defaultTestRuleTimeoutMs));
builder.register(new WorkerToolDescription(config));
builder.register(new XcodePostbuildScriptDescription());
builder.register(new XcodePrebuildScriptDescription());
builder.register(new XcodeWorkspaceConfigDescription());
builder.register(new ZipFileDescription());
builder.setCxxPlatforms(cxxPlatforms);
builder.setDefaultCxxPlatform(defaultCxxPlatform);
builder.register(VersionedAliasDescription.of());
return builder;
}
public static class Builder {
private final Map<BuildRuleType, Description<?>> descriptions;
private final Map<String, BuildRuleType> types;
@Nullable private FlavorDomain<CxxPlatform> cxxPlatforms;
@Nullable private CxxPlatform defaultCxxPlatform;
protected Builder() {
this.descriptions = Maps.newConcurrentMap();
this.types = Maps.newConcurrentMap();
}
public Builder register(Description<?> description) {
BuildRuleType type = Description.getBuildRuleType(description);
types.put(type.getName(), type);
descriptions.put(type, description);
return this;
}
public Builder setCxxPlatforms(FlavorDomain<CxxPlatform> cxxPlatforms) {
this.cxxPlatforms = cxxPlatforms;
return this;
}
public Builder setDefaultCxxPlatform(CxxPlatform defaultCxxPlatform) {
this.defaultCxxPlatform = defaultCxxPlatform;
return this;
}
public KnownBuildRuleTypes build() {
return new KnownBuildRuleTypes(
descriptions,
types,
Preconditions.checkNotNull(cxxPlatforms),
Preconditions.checkNotNull(defaultCxxPlatform));
}
}
}