public static CxxPlatform build()

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);
  }