in src/com/facebook/buck/cxx/toolchain/impl/DefaultCxxPlatforms.java [88:279]
public static CxxPlatform build(Platform platform, CxxBuckConfig config) {
String sharedLibraryExtension;
String sharedLibraryVersionedExtensionFormat;
String staticLibraryExtension;
String objectFileExtension;
Path defaultCFrontend;
Path defaultCxxFrontend;
Path defaultLinker;
LinkerProvider.Type linkerType;
Archiver archiver;
DebugPathSanitizer compilerSanitizer;
Optional<String> binaryExtension;
ImmutableMap<String, String> env = config.getEnvironment();
Optional<Type> defaultToolType = Optional.empty();
Optional<ToolProvider> ranlib;
PicType picTypeForSharedLinking;
switch (platform) {
case LINUX:
sharedLibraryExtension = "so";
sharedLibraryVersionedExtensionFormat = "so.%s";
staticLibraryExtension = "a";
objectFileExtension = "o";
defaultCFrontend = getExecutablePath("gcc", DEFAULT_C_FRONTEND, env);
defaultCxxFrontend = getExecutablePath("g++", DEFAULT_CXX_FRONTEND, env);
defaultLinker = defaultCxxFrontend;
linkerType = LinkerProvider.Type.GNU;
archiver = new GnuArchiver(getHashedFileTool(config, "ar", DEFAULT_AR, env));
compilerSanitizer = new PrefixMapDebugPathSanitizer(".", ImmutableBiMap.of());
binaryExtension = Optional.empty();
ranlib =
Optional.of(
new ConstantToolProvider(
getHashedFileTool(config, DEFAULT_UNIX_RANLIB, DEFAULT_RANLIB, env)));
picTypeForSharedLinking = PicType.PIC;
break;
case MACOS:
sharedLibraryExtension = "dylib";
sharedLibraryVersionedExtensionFormat = "%s.dylib";
staticLibraryExtension = "a";
objectFileExtension = "o";
defaultCFrontend = getExecutablePath("clang", DEFAULT_OSX_C_FRONTEND, env);
defaultCxxFrontend = getExecutablePath("clang++", DEFAULT_OSX_CXX_FRONTEND, env);
defaultLinker = defaultCxxFrontend;
linkerType = LinkerProvider.Type.DARWIN;
archiver = new BsdArchiver(getHashedFileTool(config, "ar", DEFAULT_AR, env));
compilerSanitizer = new PrefixMapDebugPathSanitizer(".", ImmutableBiMap.of());
binaryExtension = Optional.empty();
ranlib =
Optional.of(
new ConstantToolProvider(
getHashedFileTool(config, DEFAULT_UNIX_RANLIB, DEFAULT_RANLIB, env)));
picTypeForSharedLinking = PicType.PIC;
break;
case WINDOWS:
sharedLibraryExtension = "dll";
sharedLibraryVersionedExtensionFormat = "dll";
staticLibraryExtension = "lib";
objectFileExtension = "obj";
defaultCFrontend =
getExecutablePath(
DEFAULT_WINDOWS_CXX_FRONTEND, Paths.get(DEFAULT_WINDOWS_CXX_FRONTEND), env);
defaultCxxFrontend =
getExecutablePath(
DEFAULT_WINDOWS_CXX_FRONTEND, Paths.get(DEFAULT_WINDOWS_CXX_FRONTEND), env);
defaultLinker =
getExecutablePath(DEFAULT_WINDOWS_LINK, Paths.get(DEFAULT_WINDOWS_LINK), env);
linkerType = LinkerProvider.Type.WINDOWS;
archiver =
new WindowsArchiver(
getHashedFileTool(
config, DEFAULT_WINDOWS_LIB, Paths.get(DEFAULT_WINDOWS_LIB), env));
compilerSanitizer = new PrefixMapDebugPathSanitizer(".", ImmutableBiMap.of());
binaryExtension = Optional.of("exe");
defaultToolType = Optional.of(CxxToolProvider.Type.WINDOWS);
ranlib = Optional.empty();
picTypeForSharedLinking = PicType.PDC;
break;
case FREEBSD:
sharedLibraryExtension = "so";
sharedLibraryVersionedExtensionFormat = "so.%s";
staticLibraryExtension = "a";
objectFileExtension = "o";
defaultCFrontend = getExecutablePath("gcc", DEFAULT_C_FRONTEND, env);
defaultCxxFrontend = getExecutablePath("g++", DEFAULT_CXX_FRONTEND, env);
defaultLinker = defaultCxxFrontend;
linkerType = LinkerProvider.Type.GNU;
archiver = new BsdArchiver(getHashedFileTool(config, "ar", DEFAULT_AR, env));
compilerSanitizer = new PrefixMapDebugPathSanitizer(".", ImmutableBiMap.of());
binaryExtension = Optional.empty();
ranlib =
Optional.of(
new ConstantToolProvider(
getHashedFileTool(config, DEFAULT_UNIX_RANLIB, DEFAULT_RANLIB, env)));
picTypeForSharedLinking = PicType.PIC;
break;
// $CASES-OMITTED$
default:
throw new RuntimeException(String.format("Unsupported platform: %s", platform));
}
// These are wrapped behind suppliers because config.getSourcePath() verifies that the path
// exists and we only want to do that verification if the tool is actually needed.
Supplier<PathSourcePath> cFrontendPath =
MoreSuppliers.memoize(() -> config.getSourcePath(defaultCFrontend));
ToolProvider defaultCFrontendSupplier =
new ConstantToolProvider(getToolchainTool(cFrontendPath));
Supplier<PathSourcePath> cxxFrontendPath =
MoreSuppliers.memoize(() -> config.getSourcePath(defaultCxxFrontend));
ToolProvider defaultCxxFrontendSupplier =
new ConstantToolProvider(getToolchainTool(cxxFrontendPath));
Optional<Type> finalDefaultToolType = defaultToolType;
Supplier<Type> cFrontendType =
MoreSuppliers.memoize(
() ->
finalDefaultToolType.orElseGet(
() -> CxxToolTypeInferer.getTypeFromPath(cFrontendPath.get())));
Supplier<Type> cxxFrontendType =
MoreSuppliers.memoize(
() ->
finalDefaultToolType.orElseGet(
() -> CxxToolTypeInferer.getTypeFromPath(cxxFrontendPath.get())));
PreprocessorProvider aspp =
new PreprocessorProvider(defaultCFrontendSupplier, cFrontendType, ToolType.ASPP);
CompilerProvider as =
new CompilerProvider(
defaultCFrontendSupplier,
cFrontendType,
ToolType.AS,
config.getUseDetailedUntrackedHeaderMessages());
PreprocessorProvider cpp =
new PreprocessorProvider(defaultCFrontendSupplier, cFrontendType, ToolType.CPP);
CompilerProvider cc =
new CompilerProvider(
defaultCFrontendSupplier,
cFrontendType,
ToolType.CC,
config.getUseDetailedUntrackedHeaderMessages());
PreprocessorProvider cxxpp =
new PreprocessorProvider(defaultCxxFrontendSupplier, cxxFrontendType, ToolType.CXXPP);
CompilerProvider cxx =
new CompilerProvider(
defaultCxxFrontendSupplier,
cxxFrontendType,
ToolType.CXX,
config.getUseDetailedUntrackedHeaderMessages());
return CxxPlatforms.build(
FLAVOR,
platform,
config,
as,
aspp,
cc,
cxx,
cpp,
cxxpp,
new DefaultLinkerProvider(
linkerType,
new ConstantToolProvider(getToolchainTool(() -> config.getSourcePath(defaultLinker))),
config.shouldCacheLinks()),
ImmutableList.of(),
ImmutableMultimap.of(),
getHashedFileTool(config, "strip", DEFAULT_STRIP, env),
ArchiverProvider.from(archiver),
ArchiveContents.NORMAL,
ranlib,
new PosixNmSymbolNameTool(
new ConstantToolProvider(getHashedFileTool(config, "nm", DEFAULT_NM, env))),
ImmutableList.of(),
ImmutableList.of(),
ImmutableList.of(),
ImmutableList.of(),
ImmutableList.of(),
ImmutableList.of(),
sharedLibraryExtension,
sharedLibraryVersionedExtensionFormat,
staticLibraryExtension,
objectFileExtension,
Optional.empty(),
compilerSanitizer,
ImmutableMap.of(),
binaryExtension,
config.getHeaderVerificationOrIgnore(),
config.getPublicHeadersSymlinksEnabled(),
config.getPrivateHeadersSymlinksEnabled(),
picTypeForSharedLinking);
}