Example usage for com.google.common.collect Streams stream

List of usage examples for com.google.common.collect Streams stream

Introduction

In this page you can find the example usage for com.google.common.collect Streams stream.

Prototype

public static DoubleStream stream(OptionalDouble optional) 

Source Link

Document

If a value is present in optional , returns a stream containing only that element, otherwise returns an empty stream.

Usage

From source file:org.onosproject.store.flow.impl.ECFlowRuleStore.java

@Override
public int getFlowRuleCount() {
    return Streams.stream(deviceService.getDevices()).parallel()
            .mapToInt(device -> getFlowRuleCount(device.id())).sum();
}

From source file:io.prestosql.plugin.hive.BackgroundHiveSplitLoader.java

private Iterator<InternalHiveSplit> createInternalHiveSplitIterator(Path path, FileSystem fileSystem,
        InternalHiveSplitFactory splitFactory, boolean splittable) {
    return Streams
            .stream(new HiveFileIterator(path, fileSystem, directoryLister, namenodeStats,
                    recursiveDirWalkerEnabled ? RECURSE : IGNORED))
            .map(status -> splitFactory.createInternalHiveSplit(status, splittable)).filter(Optional::isPresent)
            .map(Optional::get).iterator();
}

From source file:com.google.devtools.build.lib.rules.cpp.CcLinkingHelper.java

/**
 * Create the C++ link actions, and the corresponding linking related providers.
 *
 * @throws RuleErrorException/*  ww w .  j a  va 2 s  .c  om*/
 */
// TODO(b/73997894): Try to remove CcCompilationContext. Right now headers are passed as non
// code
// inputs to the linker.
public LinkingInfo link(CcCompilationOutputs ccOutputs, CcCompilationContext ccCompilationContext)
        throws RuleErrorException, InterruptedException {
    Preconditions.checkNotNull(ccOutputs);
    Preconditions.checkNotNull(ccCompilationContext);

    if (checkDepsGenerateCpp) {
        for (LanguageDependentFragment dep : AnalysisUtils.getProviders(deps,
                LanguageDependentFragment.class)) {
            LanguageDependentFragment.Checker.depSupportsLanguage(ruleContext, dep, CppRuleClasses.LANGUAGE,
                    "deps");
        }
    }

    // Create link actions (only if there are object files or if explicitly requested).
    CcLinkingOutputs ccLinkingOutputs = CcLinkingOutputs.EMPTY;
    if (emitLinkActionsIfEmpty || !ccOutputs.isEmpty()) {
        // On some systems, the linker gives an error message if there are no input files. Even with
        // the check above, this can still happen if there is a .nopic.o or .o files in srcs, but no
        // other files. To fix that, we'd have to check for each link action individually.
        //
        // An additional pre-existing issue is that the header check tokens are dropped if we don't
        // generate any link actions, effectively disabling header checking in some cases.
        if (linkType.linkerOrArchiver() == LinkerOrArchiver.ARCHIVER) {
            // TODO(bazel-team): This can't create the link action for a cc_binary yet.
            ccLinkingOutputs = createCcLinkActions(ccOutputs, nonCodeLinkerInputs);
        }
    }
    CcLinkingOutputs originalLinkingOutputs = ccLinkingOutputs;
    if (!(staticLibraries.isEmpty() && picStaticLibraries.isEmpty() && dynamicLibraries.isEmpty()
            && executionDynamicLibraries.isEmpty())) {

        CcLinkingOutputs.Builder newOutputsBuilder = new CcLinkingOutputs.Builder();
        if (!ccOutputs.isEmpty()) {
            // Add the linked outputs of this rule iff we had anything to put in them, but then
            // make sure we're not colliding with some library added from the inputs.
            newOutputsBuilder.merge(originalLinkingOutputs);
            ImmutableSetMultimap<String, LibraryToLink> precompiledLibraryMap = CcLinkingOutputs
                    .getLibrariesByIdentifier(Iterables.concat(staticLibraries, picStaticLibraries,
                            dynamicLibraries, executionDynamicLibraries));
            ImmutableSetMultimap<String, LibraryToLink> linkedLibraryMap = originalLinkingOutputs
                    .getLibrariesByIdentifier();
            for (String matchingIdentifier : Sets.intersection(precompiledLibraryMap.keySet(),
                    linkedLibraryMap.keySet())) {
                Iterable<Artifact> matchingInputLibs = LinkerInputs
                        .toNonSolibArtifacts(precompiledLibraryMap.get(matchingIdentifier));
                Iterable<Artifact> matchingOutputLibs = LinkerInputs
                        .toNonSolibArtifacts(linkedLibraryMap.get(matchingIdentifier));
                ruleContext.ruleError("Can't put "
                        + Streams.stream(matchingInputLibs).map(Artifact::getFilename).collect(joining(", "))
                        + " into the srcs of a " + ruleContext.getRuleClassNameForLogging()
                        + " with the same name (" + ruleContext.getRule().getName()
                        + ") which also contains other code or objects to link; it shares a name with "
                        + Streams.stream(matchingOutputLibs).map(Artifact::getFilename).collect(joining(", "))
                        + " (output compiled and linked from the non-library sources of this rule), "
                        + "which could cause confusion");
            }
        }

        // Merge the pre-compiled libraries (static & dynamic) into the linker outputs.
        ccLinkingOutputs = newOutputsBuilder.addStaticLibraries(staticLibraries)
                .addPicStaticLibraries(picStaticLibraries).addDynamicLibraries(dynamicLibraries)
                .addExecutionDynamicLibraries(executionDynamicLibraries).build();
    }

    Map<String, NestedSet<Artifact>> outputGroups = new TreeMap<>();

    if (shouldAddLinkerOutputArtifacts(ruleContext, ccOutputs)) {
        addLinkerOutputArtifacts(outputGroups, ccOutputs);
    }

    // Be very careful when adding new providers here - it can potentially affect a lot of rules.
    // We should consider merging most of these providers into a single provider.
    TransitiveInfoProviderMapBuilder providers = new TransitiveInfoProviderMapBuilder();

    // TODO(bazel-team): Maybe we can infer these from other data at the places where they are
    // used.
    if (emitCcNativeLibrariesProvider) {
        providers.add(new CcNativeLibraryProvider(collectNativeCcLibraries(ccLinkingOutputs)));
    }

    Runfiles cppStaticRunfiles = collectCppRunfiles(ccLinkingOutputs, true);
    Runfiles cppSharedRunfiles = collectCppRunfiles(ccLinkingOutputs, false);

    CcLinkingInfo.Builder ccLinkingInfoBuilder = CcLinkingInfo.Builder.create();
    ccLinkingInfoBuilder.setCcRunfiles(new CcRunfiles(cppStaticRunfiles, cppSharedRunfiles));
    ccLinkingInfoBuilder.setCcExecutionDynamicLibraries(
            collectExecutionDynamicLibraryArtifacts(ccLinkingOutputs.getDynamicLibrariesForRuntime()));

    CppConfiguration cppConfiguration = ruleContext.getFragment(CppConfiguration.class);
    boolean forcePic = cppConfiguration.forcePic();
    if (emitCcSpecificLinkParamsProvider) {
        providers.add(new CcSpecificLinkParamsProvider(
                createCcLinkParamsStore(ccLinkingOutputs, ccCompilationContext, forcePic)));
    } else {
        ccLinkingInfoBuilder.setCcLinkParamsStore(new CcLinkParamsStore(
                createCcLinkParamsStore(ccLinkingOutputs, ccCompilationContext, forcePic)));
    }
    providers.put(ccLinkingInfoBuilder.build());
    return new LinkingInfo(providers.build(), outputGroups, ccLinkingOutputs, originalLinkingOutputs);
}

From source file:org.onosproject.store.flow.impl.ECFlowRuleStore.java

@Override
public long getActiveFlowRuleCount(DeviceId deviceId) {
    return Streams.stream(getTableStatistics(deviceId)).mapToLong(TableStatisticsEntry::activeFlowEntries)
            .sum();//from  www.  j av a2s .  c  om
}

From source file:io.prestosql.sql.planner.planPrinter.PlanPrinter.java

private static String formatOutputs(TypeProvider types, Iterable<Symbol> outputs) {
    return Streams.stream(outputs).map(input -> input + ":" + types.get(input).getDisplayName())
            .collect(Collectors.joining(", "));
}

From source file:com.facebook.buck.features.apple.project.ProjectGenerator.java

private PBXNativeTarget generateBinaryTarget(PBXProject project,
        Optional<? extends TargetNode<? extends HasAppleBundleFields>> bundle,
        TargetNode<? extends CxxLibraryDescription.CommonArg> targetNode, ProductType productType,
        String productOutputFormat, Optional<Path> infoPlistOptional, boolean includeFrameworks,
        ImmutableSet<AppleResourceDescriptionArg> recursiveResources,
        ImmutableSet<AppleResourceDescriptionArg> directResources,
        ImmutableSet<AppleAssetCatalogDescriptionArg> recursiveAssetCatalogs,
        ImmutableSet<AppleAssetCatalogDescriptionArg> directAssetCatalogs,
        ImmutableSet<AppleWrapperResourceArg> wrapperResources,
        Optional<Iterable<PBXBuildPhase>> copyFilesPhases,
        Optional<TargetNode<AppleBundleDescriptionArg>> bundleLoaderNode) throws IOException {

    LOG.debug("Generating binary target for node %s", targetNode);

    TargetNode<?> buildTargetNode = bundle.isPresent() ? bundle.get() : targetNode;
    BuildTarget buildTarget = buildTargetNode.getBuildTarget();
    boolean containsSwiftCode = projGenerationStateCache.targetContainsSwiftSourceCode(targetNode);

    String buildTargetName = getProductNameForBuildTargetNode(buildTargetNode);
    CxxLibraryDescription.CommonArg arg = targetNode.getConstructorArg();
    NewNativeTargetProjectMutator mutator = new NewNativeTargetProjectMutator(pathRelativizer,
            this::resolveSourcePath);

    // Both exported headers and exported platform headers will be put into the symlink tree
    // exported platform headers will be excluded and then included by platform
    ImmutableSet.Builder<SourcePath> exportedHeadersBuilder = ImmutableSet.builder();
    exportedHeadersBuilder.addAll(getHeaderSourcePaths(arg.getExportedHeaders()));
    PatternMatchedCollection<SourceSortedSet> exportedPlatformHeaders = arg.getExportedPlatformHeaders();
    for (SourceSortedSet headersSet : exportedPlatformHeaders.getValues()) {
        exportedHeadersBuilder.addAll(getHeaderSourcePaths(headersSet));
    }/*  w ww. j  a va  2 s . co m*/

    ImmutableSet<SourcePath> exportedHeaders = exportedHeadersBuilder.build();
    ImmutableSet.Builder<SourcePath> headersBuilder = ImmutableSet.builder();
    headersBuilder.addAll(getHeaderSourcePaths(arg.getHeaders()));
    for (SourceSortedSet headersSet : arg.getPlatformHeaders().getValues()) {
        headersBuilder.addAll(getHeaderSourcePaths(headersSet));
    }
    ImmutableSet<SourcePath> headers = headersBuilder.build();
    ImmutableMap<CxxSource.Type, ImmutableList<StringWithMacros>> langPreprocessorFlags = targetNode
            .getConstructorArg().getLangPreprocessorFlags();
    boolean isFocusedOnTarget = focusModules.isFocusedOn(buildTarget);

    Optional<String> swiftVersion = getSwiftVersionForTargetNode(targetNode);
    boolean hasSwiftVersionArg = swiftVersion.isPresent();
    if (!swiftVersion.isPresent()) {
        swiftVersion = swiftBuckConfig.getVersion();
    }

    mutator.setTargetName(getXcodeTargetName(buildTarget)).setProduct(productType, buildTargetName,
            Paths.get(String.format(productOutputFormat, buildTargetName)));

    boolean isModularAppleLibrary = isModularAppleLibrary(targetNode) && isFocusedOnTarget;
    mutator.setFrameworkHeadersEnabled(isModularAppleLibrary);

    ImmutableMap.Builder<String, String> swiftDepsSettingsBuilder = ImmutableMap.builder();
    ImmutableList.Builder<String> swiftDebugLinkerFlagsBuilder = ImmutableList.builder();

    ImmutableMap.Builder<String, String> extraSettingsBuilder = ImmutableMap.builder();
    ImmutableMap.Builder<String, String> defaultSettingsBuilder = ImmutableMap.builder();

    ImmutableList<Pair<Pattern, SourceSortedSet>> platformHeaders = arg.getPlatformHeaders()
            .getPatternsAndValues();
    ImmutableList.Builder<Pair<Pattern, Iterable<SourcePath>>> platformHeadersIterableBuilder = ImmutableList
            .builder();
    for (Pair<Pattern, SourceSortedSet> platformHeader : platformHeaders) {
        platformHeadersIterableBuilder
                .add(new Pair<>(platformHeader.getFirst(), getHeaderSourcePaths(platformHeader.getSecond())));
    }

    ImmutableList<Pair<Pattern, SourceSortedSet>> exportedPlatformHeadersPatternsAndValues = exportedPlatformHeaders
            .getPatternsAndValues();
    for (Pair<Pattern, SourceSortedSet> exportedPlatformHeader : exportedPlatformHeadersPatternsAndValues) {
        platformHeadersIterableBuilder.add(new Pair<>(exportedPlatformHeader.getFirst(),
                getHeaderSourcePaths(exportedPlatformHeader.getSecond())));
    }

    ImmutableList<Pair<Pattern, Iterable<SourcePath>>> platformHeadersIterable = platformHeadersIterableBuilder
            .build();

    ImmutableList<Pair<Pattern, ImmutableSortedSet<SourceWithFlags>>> platformSources = arg.getPlatformSrcs()
            .getPatternsAndValues();
    ImmutableMap<String, ImmutableSortedSet<String>> platformExcludedSourcesMapping = ProjectGenerator
            .gatherExcludedSources(
                    appleCxxFlavors.stream().map(f -> applePlatformAndArchitecture(f).getFirst())
                            .collect(ImmutableSet.toImmutableSet()),
                    platformSources, platformHeadersIterable, outputDirectory, defaultPathResolver);
    for (Map.Entry<String, ImmutableSortedSet<String>> platformExcludedSources : platformExcludedSourcesMapping
            .entrySet()) {
        if (platformExcludedSources.getValue().size() > 0) {
            extraSettingsBuilder.put(platformExcludedSources.getKey(),
                    String.join(" ", platformExcludedSources.getValue()));
        }
    }

    ImmutableSortedSet<SourceWithFlags> nonPlatformSrcs = arg.getSrcs();
    ImmutableSortedSet.Builder<SourceWithFlags> allSrcsBuilder = ImmutableSortedSet.naturalOrder();
    allSrcsBuilder.addAll(nonPlatformSrcs);
    for (Pair<Pattern, ImmutableSortedSet<SourceWithFlags>> platformSource : platformSources) {
        allSrcsBuilder.addAll(platformSource.getSecond());
    }

    ImmutableSortedSet<SourceWithFlags> allSrcs = allSrcsBuilder.build();

    if (!options.shouldGenerateHeaderSymlinkTreesOnly()) {
        if (isFocusedOnTarget) {
            filesAddedBuilder.addAll(
                    allSrcs.stream().map(s -> s.getSourcePath()).collect(ImmutableList.toImmutableList()));
            mutator.setLangPreprocessorFlags(ImmutableMap.copyOf(
                    Maps.transformValues(langPreprocessorFlags, f -> convertStringWithMacros(targetNode, f))))
                    .setPublicHeaders(exportedHeaders).setPrefixHeader(getPrefixHeaderSourcePath(arg))
                    .setSourcesWithFlags(ImmutableSet.copyOf(allSrcs)).setPrivateHeaders(headers)
                    .setRecursiveResources(recursiveResources).setDirectResources(directResources)
                    .setWrapperResources(wrapperResources)
                    .setExtraXcodeSources(ImmutableSet.copyOf(arg.getExtraXcodeSources()))
                    .setExtraXcodeFiles(ImmutableSet.copyOf(arg.getExtraXcodeFiles()));
        }

        if (bundle.isPresent() && isFocusedOnTarget) {
            HasAppleBundleFields bundleArg = bundle.get().getConstructorArg();
            mutator.setInfoPlist(Optional.of(bundleArg.getInfoPlist()));
        }

        mutator.setBridgingHeader(arg.getBridgingHeader());

        if (options.shouldCreateDirectoryStructure() && isFocusedOnTarget) {
            mutator.setTargetGroupPath(
                    RichStream.from(buildTarget.getBasePath()).map(Object::toString).toImmutableList());
        }

        if (!recursiveAssetCatalogs.isEmpty() && isFocusedOnTarget) {
            mutator.setRecursiveAssetCatalogs(recursiveAssetCatalogs);
        }

        if (!directAssetCatalogs.isEmpty() && isFocusedOnTarget) {
            mutator.setDirectAssetCatalogs(directAssetCatalogs);
        }

        FluentIterable<TargetNode<?>> depTargetNodes = collectRecursiveLibraryDepTargets(targetNode);

        if (includeFrameworks && isFocusedOnTarget) {

            if (!options.shouldAddLinkedLibrariesAsFlags()) {
                mutator.setFrameworks(getSytemFrameworksLibsForTargetNode(targetNode));
            }

            if (sharedLibraryToBundle.isPresent()) {
                // Replace target nodes of libraries which are actually constituents of embedded
                // frameworks to the bundle representing the embedded framework.
                // This will be converted to a reference to the xcode build product for the embedded
                // framework rather than the dylib
                depTargetNodes = swapSharedLibrariesForBundles(depTargetNodes, sharedLibraryToBundle.get());
            }

            ImmutableSet<PBXFileReference> targetNodeDeps = filterRecursiveLibraryDependenciesForLinkerPhase(
                    depTargetNodes);

            if (isTargetNodeApplicationTestTarget(targetNode, bundleLoaderNode)) {
                ImmutableSet<PBXFileReference> bundleLoaderDeps = bundleLoaderNode.isPresent()
                        ? collectRecursiveLibraryDependencies(bundleLoaderNode.get())
                        : ImmutableSet.of();
                mutator.setArchives(Sets.difference(targetNodeDeps, bundleLoaderDeps));
            } else {
                mutator.setArchives(targetNodeDeps);
            }
        }

        if (isFocusedOnTarget) {
            ImmutableSet<TargetNode<?>> swiftDepTargets = filterRecursiveLibraryDepTargetsWithSwiftSources(
                    depTargetNodes);

            if (!includeFrameworks && !swiftDepTargets.isEmpty()) {
                // If the current target, which is non-shared (e.g., static lib), depends on other focused
                // targets which include Swift code, we must ensure those are treated as dependencies so
                // that Xcode builds the targets in the correct order. Unfortunately, those deps can be
                // part of other projects which would require cross-project references.
                //
                // Thankfully, there's an easy workaround because we can just create a phony copy phase
                // which depends on the outputs of the deps (i.e., the static libs). The copy phase
                // will effectively say "Copy libX.a from Products Dir into Products Dir" which is a nop.
                // To be on the safe side, we're explicitly marking the copy phase as only running for
                // deployment postprocessing (i.e., "Copy only when installing") and disabling
                // deployment postprocessing (it's enabled by default for release builds).
                CopyFilePhaseDestinationSpec.Builder destSpecBuilder = CopyFilePhaseDestinationSpec.builder();
                destSpecBuilder.setDestination(PBXCopyFilesBuildPhase.Destination.PRODUCTS);
                PBXCopyFilesBuildPhase copyFiles = new PBXCopyFilesBuildPhase(destSpecBuilder.build());
                copyFiles.setRunOnlyForDeploymentPostprocessing(Optional.of(Boolean.TRUE));
                copyFiles.setName(Optional.of("Fake Swift Dependencies (Copy Files Phase)"));

                ImmutableSet<PBXFileReference> swiftDepsFileRefs = targetNodesSetToPBXFileReference(
                        swiftDepTargets);
                for (PBXFileReference fileRef : swiftDepsFileRefs) {
                    PBXBuildFile buildFile = new PBXBuildFile(fileRef);
                    copyFiles.getFiles().add(buildFile);
                }

                swiftDepsSettingsBuilder.put("DEPLOYMENT_POSTPROCESSING", "NO");

                mutator.setSwiftDependenciesBuildPhase(copyFiles);
            }

            if (includeFrameworks && !swiftDepTargets.isEmpty() && shouldEmbedSwiftRuntimeInBundleTarget(bundle)
                    && swiftBuckConfig.getProjectEmbedRuntime()) {
                // This is a binary that transitively depends on a library that uses Swift. We must ensure
                // that the Swift runtime is bundled.
                swiftDepsSettingsBuilder.put("ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES");
            }

            if (includeFrameworks && !swiftDepTargets.isEmpty() && swiftBuckConfig.getProjectAddASTPaths()) {
                for (TargetNode<?> swiftNode : swiftDepTargets) {
                    String swiftModulePath = String.format(
                            "${BUILT_PRODUCTS_DIR}/%s.swiftmodule/${CURRENT_ARCH}.swiftmodule",
                            getModuleName(swiftNode));
                    swiftDebugLinkerFlagsBuilder.add("-Xlinker");
                    swiftDebugLinkerFlagsBuilder.add("-add_ast_path");
                    swiftDebugLinkerFlagsBuilder.add("-Xlinker");
                    swiftDebugLinkerFlagsBuilder.add(swiftModulePath);
                }
            }
        }

        // TODO(Task #3772930): Go through all dependencies of the rule
        // and add any shell script rules here
        ImmutableList.Builder<TargetNode<?>> preScriptPhasesBuilder = ImmutableList.builder();
        ImmutableList.Builder<TargetNode<?>> postScriptPhasesBuilder = ImmutableList.builder();
        if (bundle.isPresent() && targetNode != bundle.get() && isFocusedOnTarget) {
            collectBuildScriptDependencies(targetGraph.getAll(bundle.get().getDeclaredDeps()),
                    preScriptPhasesBuilder, postScriptPhasesBuilder);
        }
        collectBuildScriptDependencies(targetGraph.getAll(targetNode.getDeclaredDeps()), preScriptPhasesBuilder,
                postScriptPhasesBuilder);
        if (isFocusedOnTarget) {
            ImmutableList<TargetNode<?>> preScriptPhases = preScriptPhasesBuilder.build();
            ImmutableList<TargetNode<?>> postScriptPhases = postScriptPhasesBuilder.build();

            mutator.setPreBuildRunScriptPhasesFromTargetNodes(preScriptPhases,
                    actionGraphBuilderForNode::apply);
            if (copyFilesPhases.isPresent()) {
                mutator.setCopyFilesPhases(copyFilesPhases.get());
            }
            mutator.setPostBuildRunScriptPhasesFromTargetNodes(postScriptPhases,
                    actionGraphBuilderForNode::apply);

            ImmutableList<TargetNode<?>> scriptPhases = Stream
                    .concat(preScriptPhases.stream(), postScriptPhases.stream())
                    .collect(ImmutableList.toImmutableList());
            mutator.collectFilesToCopyInXcode(filesToCopyInXcodeBuilder, scriptPhases, projectCell,
                    actionGraphBuilderForNode::apply);
        }
    }

    NewNativeTargetProjectMutator.Result targetBuilderResult = mutator.buildTargetAndAddToProject(project,
            isFocusedOnTarget);
    PBXNativeTarget target = targetBuilderResult.target;
    Optional<PBXGroup> targetGroup = targetBuilderResult.targetGroup;

    extraSettingsBuilder.putAll(swiftDepsSettingsBuilder.build());

    setAppIconSettings(recursiveAssetCatalogs, directAssetCatalogs, buildTarget, defaultSettingsBuilder);
    setLaunchImageSettings(recursiveAssetCatalogs, directAssetCatalogs, buildTarget, defaultSettingsBuilder);

    ImmutableSortedMap<Path, SourcePath> publicCxxHeaders = getPublicCxxHeaders(targetNode);
    if (isModularAppleLibrary(targetNode) && isFrameworkProductType(productType)) {
        // Modular frameworks should not include Buck-generated hmaps as they break the VFS overlay
        // that's generated by Xcode and consequently, all headers part of a framework's umbrella
        // header fail the modularity test, as they're expected to be mapped by the VFS layer under
        // $BUILT_PRODUCTS_DIR/Module.framework/Versions/A/Headers.
        publicCxxHeaders = ImmutableSortedMap.of();
    }

    if (!options.shouldGenerateHeaderSymlinkTreesOnly()) {
        if (isFocusedOnTarget) {
            SourceTreePath buckFilePath = new SourceTreePath(PBXReference.SourceTree.SOURCE_ROOT,
                    pathRelativizer.outputPathToBuildTargetPath(buildTarget).resolve(buildFileName),
                    Optional.empty());
            PBXFileReference buckReference = targetGroup.get()
                    .getOrCreateFileReferenceBySourceTreePath(buckFilePath);
            buckReference.setExplicitFileType(Optional.of("text.script.python"));
        }

        // Watch dependencies need to have explicit target dependencies setup in order for Xcode to
        // build them properly within the IDE.  It is unable to match the implicit dependency because
        // of the different in flavor between the targets (iphoneos vs watchos).
        if (bundle.isPresent() && isFocusedOnTarget) {
            collectProjectTargetWatchDependencies(targetNode.getBuildTarget().getFlavorPostfix(), target,
                    targetGraph.getAll(bundle.get().getExtraDeps()));
        }

        // -- configurations
        extraSettingsBuilder.put("TARGET_NAME", buildTargetName).put("SRCROOT",
                pathRelativizer.outputPathToBuildTargetPath(buildTarget).toString());
        if (productType == ProductTypes.UI_TEST && isFocusedOnTarget) {
            if (bundleLoaderNode.isPresent()) {
                BuildTarget testTarget = bundleLoaderNode.get().getBuildTarget();
                extraSettingsBuilder.put("TEST_TARGET_NAME", getXcodeTargetName(testTarget));
                addPBXTargetDependency(target, testTarget);
            } else {
                throw new HumanReadableException(
                        "The test rule '%s' is configured with 'is_ui_test' but has no test_host_app",
                        buildTargetName);
            }
        } else if (bundleLoaderNode.isPresent() && isFocusedOnTarget) {
            TargetNode<AppleBundleDescriptionArg> bundleLoader = bundleLoaderNode.get();
            String bundleLoaderProductName = getProductName(bundleLoader);
            String bundleLoaderBundleName = bundleLoaderProductName + "."
                    + getExtensionString(bundleLoader.getConstructorArg().getExtension());
            // NOTE(grp): This is a hack. We need to support both deep (OS X) and flat (iOS)
            // style bundles for the bundle loader, but at this point we don't know what platform
            // the bundle loader (or current target) is going to be built for. However, we can be
            // sure that it's the same as the target (presumably a test) we're building right now.
            //
            // Using that knowledge, we can do build setting tricks to defer choosing the bundle
            // loader path until Xcode build time, when the platform is known. There's no build
            // setting that conclusively says whether the current platform uses deep bundles:
            // that would be too easy. But in the cases we care about (unit test bundles), the
            // current bundle will have a style matching the style of the bundle loader app, so
            // we can take advantage of that to do the determination.
            //
            // Unfortunately, the build setting for the bundle structure (CONTENTS_FOLDER_PATH)
            // includes the WRAPPER_NAME, so we can't just interpolate that in. Instead, we have
            // to use another trick with build setting operations and evaluation. By using the
            // $(:file) operation, we can extract the last component of the contents path: either
            // "Contents" or the current bundle name. Then, we can interpolate with that expected
            // result in the build setting name to conditionally choose a different loader path.

            // The conditional that decides which path is used. This is a complex Xcode build setting
            // expression that expands to one of two values, depending on the last path component of
            // the CONTENTS_FOLDER_PATH variable. As described above, this will be either "Contents"
            // for deep bundles or the bundle file name itself for flat bundles. Finally, to santiize
            // the potentially invalid build setting names from the bundle file name, it converts that
            // to an identifier. We rely on BUNDLE_LOADER_BUNDLE_STYLE_CONDITIONAL_<bundle file name>
            // being undefined (and thus expanding to nothing) for the path resolution to work.
            //
            // The operations on the CONTENTS_FOLDER_PATH are documented here:
            // http://codeworkshop.net/posts/xcode-build-setting-transformations
            String bundleLoaderOutputPathConditional = "$(BUNDLE_LOADER_BUNDLE_STYLE_CONDITIONAL_$(CONTENTS_FOLDER_PATH:file:identifier))";

            // If the $(CONTENTS_FOLDER_PATH:file:identifier) expands to this, we add the deep bundle
            // path into the bundle loader. See above for the case when it will expand to this value.
            extraSettingsBuilder.put("BUNDLE_LOADER_BUNDLE_STYLE_CONDITIONAL_Contents",
                    Joiner.on('/').join(getTargetOutputPath(bundleLoader), bundleLoaderBundleName,
                            "Contents/MacOS", bundleLoaderProductName));

            extraSettingsBuilder.put(
                    "BUNDLE_LOADER_BUNDLE_STYLE_CONDITIONAL_" + getProductName(bundle.get()) + "_"
                            + getExtensionString(bundle.get().getConstructorArg().getExtension()),
                    Joiner.on('/').join(getTargetOutputPath(bundleLoader), bundleLoaderBundleName,
                            bundleLoaderProductName));

            extraSettingsBuilder.put("BUNDLE_LOADER", bundleLoaderOutputPathConditional).put("TEST_HOST",
                    "$(BUNDLE_LOADER)");

            addPBXTargetDependency(target, bundleLoader.getBuildTarget());
        }
        if (infoPlistOptional.isPresent()) {
            Path infoPlistPath = pathRelativizer.outputDirToRootRelative(infoPlistOptional.get());
            extraSettingsBuilder.put("INFOPLIST_FILE", infoPlistPath.toString());
        }
        if (arg.getBridgingHeader().isPresent()) {
            Path bridgingHeaderPath = pathRelativizer
                    .outputDirToRootRelative(resolveSourcePath(arg.getBridgingHeader().get()));
            extraSettingsBuilder.put("SWIFT_OBJC_BRIDGING_HEADER",
                    Joiner.on('/').join("$(SRCROOT)", bridgingHeaderPath.toString()));
        }

        swiftVersion.ifPresent(s -> extraSettingsBuilder.put("SWIFT_VERSION", s));
        swiftVersion.ifPresent(s -> extraSettingsBuilder.put("PRODUCT_MODULE_NAME", getModuleName(targetNode)));

        if (hasSwiftVersionArg && containsSwiftCode && isFocusedOnTarget) {
            extraSettingsBuilder.put("SWIFT_OBJC_INTERFACE_HEADER_NAME",
                    getSwiftObjCGeneratedHeaderName(buildTargetNode));

            if (swiftBuckConfig.getProjectWMO()) {
                // We must disable "Index While Building" as there's a bug in the LLVM infra which
                // makes the compilation fail.
                extraSettingsBuilder.put("COMPILER_INDEX_STORE_ENABLE", "NO");

                // This is a hidden Xcode setting which is needed for two reasons:
                // - Stops Xcode adding .o files for each Swift compilation unit to dependency db
                //   which is used during linking (which will fail with WMO).
                // - Turns on WMO itself.
                //
                // Note that setting SWIFT_OPTIMIZATION_LEVEL (which is public) to '-Owholemodule'
                // ends up crashing the Swift compiler for some reason while this doesn't.
                extraSettingsBuilder.put("SWIFT_WHOLE_MODULE_OPTIMIZATION", "YES");
            }
        }

        Optional<SourcePath> prefixHeaderOptional = getPrefixHeaderSourcePath(targetNode.getConstructorArg());
        if (prefixHeaderOptional.isPresent()) {
            Path prefixHeaderRelative = resolveSourcePath(prefixHeaderOptional.get());
            Path prefixHeaderPath = pathRelativizer.outputDirToRootRelative(prefixHeaderRelative);
            extraSettingsBuilder.put("GCC_PREFIX_HEADER", prefixHeaderPath.toString());
            extraSettingsBuilder.put("GCC_PRECOMPILE_PREFIX_HEADER", "YES");
        }

        boolean shouldSetUseHeadermap = false;
        if (isModularAppleLibrary) {
            extraSettingsBuilder.put("CLANG_ENABLE_MODULES", "YES");
            extraSettingsBuilder.put("DEFINES_MODULE", "YES");

            if (isFrameworkProductType(productType)) {
                // Modular frameworks need to have both USE_HEADERMAP enabled so that Xcode generates
                // .framework VFS overlays, in modular libraries we handle this in buck
                shouldSetUseHeadermap = true;
            }
        }
        extraSettingsBuilder.put("USE_HEADERMAP", shouldSetUseHeadermap ? "YES" : "NO");

        defaultSettingsBuilder.put("REPO_ROOT",
                projectFilesystem.getRootPath().toAbsolutePath().normalize().toString());
        if (hasSwiftVersionArg && containsSwiftCode && isFocusedOnTarget) {
            // We need to be able to control the directory where Xcode places the derived sources, so
            // that the Obj-C Generated Header can be included in the header map and imported through
            // a framework-style import like <Module/Module-Swift.h>
            Path derivedSourcesDir = getDerivedSourcesDirectoryForBuildTarget(buildTarget, projectFilesystem);
            Path derivedSourceDirRelativeToProjectRoot = pathRelativizer
                    .outputDirToRootRelative(derivedSourcesDir);

            defaultSettingsBuilder.put("DERIVED_FILE_DIR", derivedSourceDirRelativeToProjectRoot.toString());
        }

        defaultSettingsBuilder.put(PRODUCT_NAME, getProductName(buildTargetNode));
        bundle.ifPresent(bundleNode -> defaultSettingsBuilder.put("WRAPPER_EXTENSION",
                getExtensionString(bundleNode.getConstructorArg().getExtension())));

        // We use BUILT_PRODUCTS_DIR as the root for the everything being built. Target-
        // specific output is placed within CONFIGURATION_BUILD_DIR, inside BUILT_PRODUCTS_DIR.
        // That allows Copy Files build phases to reference files in the CONFIGURATION_BUILD_DIR
        // of other targets by using paths relative to the target-independent BUILT_PRODUCTS_DIR.
        defaultSettingsBuilder.put("BUILT_PRODUCTS_DIR",
                // $EFFECTIVE_PLATFORM_NAME starts with a dash, so this expands to something like:
                // $SYMROOT/Debug-iphonesimulator
                Joiner.on('/').join("$SYMROOT", "$CONFIGURATION$EFFECTIVE_PLATFORM_NAME"));
        defaultSettingsBuilder.put("CONFIGURATION_BUILD_DIR", "$BUILT_PRODUCTS_DIR");
        boolean nodeIsAppleLibrary = targetNode.getDescription() instanceof AppleLibraryDescription;
        boolean nodeIsCxxLibrary = targetNode.getDescription() instanceof CxxLibraryDescription;
        if (!bundle.isPresent() && (nodeIsAppleLibrary || nodeIsCxxLibrary)) {
            defaultSettingsBuilder.put("EXECUTABLE_PREFIX", "lib");
        }

        if (isFocusedOnTarget) {
            ImmutableSet<Path> recursiveHeaderSearchPaths = collectRecursiveHeaderSearchPaths(targetNode);
            ImmutableSet<Path> headerMapBases = collectRecursiveHeaderMapBases(targetNode);

            ImmutableMap.Builder<String, String> appendConfigsBuilder = ImmutableMap.builder();
            appendConfigsBuilder.putAll(getFrameworkAndLibrarySearchPathConfigs(targetNode, includeFrameworks));
            appendConfigsBuilder.put("HEADER_SEARCH_PATHS",
                    Joiner.on(' ').join(Iterables.concat(recursiveHeaderSearchPaths, headerMapBases)));
            if (hasSwiftVersionArg && containsSwiftCode && isFocusedOnTarget) {
                ImmutableSet<Path> swiftIncludePaths = collectRecursiveSwiftIncludePaths(targetNode);
                Stream<String> allValues = Streams.concat(Stream.of("$BUILT_PRODUCTS_DIR"), Streams
                        .stream(swiftIncludePaths).map((path) -> path.toString()).map(Escaper.BASH_ESCAPER));
                appendConfigsBuilder.put("SWIFT_INCLUDE_PATHS", allValues.collect(Collectors.joining(" ")));
            }

            ImmutableList.Builder<String> targetSpecificSwiftFlags = ImmutableList.builder();
            Optional<TargetNode<SwiftCommonArg>> swiftTargetNode = TargetNodes.castArg(targetNode,
                    SwiftCommonArg.class);
            targetSpecificSwiftFlags.addAll(swiftTargetNode.map(
                    x -> convertStringWithMacros(targetNode, x.getConstructorArg().getSwiftCompilerFlags()))
                    .orElse(ImmutableList.of()));

            if (containsSwiftCode && isModularAppleLibrary && publicCxxHeaders.size() > 0) {
                targetSpecificSwiftFlags.addAll(collectModularTargetSpecificSwiftFlags(targetNode));
            }

            ImmutableList<String> testingOverlay = getFlagsForExcludesForModulesUnderTests(targetNode);
            Iterable<String> otherSwiftFlags = Iterables.concat(
                    swiftBuckConfig.getCompilerFlags().orElse(DEFAULT_SWIFTFLAGS),
                    targetSpecificSwiftFlags.build());

            Iterable<String> otherCFlags = ImmutableList.<String>builder()
                    .addAll(cxxBuckConfig.getCflags().orElse(DEFAULT_CFLAGS))
                    .addAll(cxxBuckConfig.getCppflags().orElse(DEFAULT_CPPFLAGS))
                    .addAll(convertStringWithMacros(targetNode,
                            collectRecursiveExportedPreprocessorFlags(targetNode)))
                    .addAll(convertStringWithMacros(targetNode,
                            targetNode.getConstructorArg().getCompilerFlags()))
                    .addAll(convertStringWithMacros(targetNode,
                            targetNode.getConstructorArg().getPreprocessorFlags()))
                    .addAll(convertStringWithMacros(targetNode,
                            collectRecursiveSystemPreprocessorFlags(targetNode)))
                    .addAll(testingOverlay).build();
            Iterable<String> otherCxxFlags = ImmutableList.<String>builder()
                    .addAll(cxxBuckConfig.getCxxflags().orElse(DEFAULT_CXXFLAGS))
                    .addAll(cxxBuckConfig.getCxxppflags().orElse(DEFAULT_CXXPPFLAGS))
                    .addAll(convertStringWithMacros(targetNode,
                            collectRecursiveExportedPreprocessorFlags(targetNode)))
                    .addAll(convertStringWithMacros(targetNode,
                            targetNode.getConstructorArg().getCompilerFlags()))
                    .addAll(convertStringWithMacros(targetNode,
                            targetNode.getConstructorArg().getPreprocessorFlags()))
                    .addAll(convertStringWithMacros(targetNode,
                            collectRecursiveSystemPreprocessorFlags(targetNode)))
                    .addAll(testingOverlay).build();

            appendConfigsBuilder
                    .put("OTHER_SWIFT_FLAGS",
                            Streams.stream(otherSwiftFlags).map(Escaper.BASH_ESCAPER)
                                    .collect(Collectors.joining(" ")))
                    .put("OTHER_CFLAGS",
                            Streams.stream(otherCFlags).map(Escaper.BASH_ESCAPER)
                                    .collect(Collectors.joining(" ")))
                    .put("OTHER_CPLUSPLUSFLAGS", Streams.stream(otherCxxFlags).map(Escaper.BASH_ESCAPER)
                            .collect(Collectors.joining(" ")));

            Iterable<String> otherLdFlags = ImmutableList.<String>builder()
                    .addAll(cxxBuckConfig.getLdflags().orElse(DEFAULT_LDFLAGS))
                    .addAll(appleConfig.linkAllObjC() ? ImmutableList.of("-ObjC") : ImmutableList.of())
                    .addAll(convertStringWithMacros(targetNode,
                            Iterables.concat(targetNode.getConstructorArg().getLinkerFlags(),
                                    collectRecursiveExportedLinkerFlags(targetNode))))
                    .addAll(swiftDebugLinkerFlagsBuilder.build()).build();

            updateOtherLinkerFlagsForOptions(targetNode, bundleLoaderNode, appendConfigsBuilder, otherLdFlags);

            ImmutableMultimap<String, ImmutableList<String>> platformFlags = convertPlatformFlags(targetNode,
                    Iterables.concat(
                            ImmutableList.of(targetNode.getConstructorArg().getPlatformCompilerFlags()),
                            ImmutableList.of(targetNode.getConstructorArg().getPlatformPreprocessorFlags()),
                            collectRecursiveExportedPlatformPreprocessorFlags(targetNode)));
            for (String platform : platformFlags.keySet()) {
                appendConfigsBuilder.put(generateConfigKey("OTHER_CFLAGS", platform),
                        Streams.stream(Iterables.transform(
                                Iterables.concat(otherCFlags, Iterables.concat(platformFlags.get(platform))),
                                Escaper.BASH_ESCAPER::apply)).collect(
                                        Collectors.joining(" ")))
                        .put(generateConfigKey("OTHER_CPLUSPLUSFLAGS", platform),
                                Streams.stream(Iterables.transform(
                                        Iterables.concat(otherCxxFlags,
                                                Iterables.concat(platformFlags.get(platform))),
                                        Escaper.BASH_ESCAPER::apply)).collect(Collectors.joining(" ")));
            }

            ImmutableMultimap<String, ImmutableList<String>> platformLinkerFlags = convertPlatformFlags(
                    targetNode,
                    Iterables.concat(ImmutableList.of(targetNode.getConstructorArg().getPlatformLinkerFlags()),
                            collectRecursiveExportedPlatformLinkerFlags(targetNode)));
            for (String platform : platformLinkerFlags.keySet()) {
                appendConfigsBuilder
                        .put(generateConfigKey("OTHER_LDFLAGS", platform),
                                Streams.stream(
                                        Iterables
                                                .transform(
                                                        Iterables.concat(otherLdFlags,
                                                                Iterables.concat(
                                                                        platformLinkerFlags.get(platform))),
                                                        Escaper.BASH_ESCAPER::apply))
                                        .collect(Collectors.joining(" ")));
            }

            ImmutableMap<String, String> appendedConfig = appendConfigsBuilder.build();

            Optional<ImmutableSortedMap<String, ImmutableMap<String, String>>> configs = getXcodeBuildConfigurationsForTargetNode(
                    targetNode);
            setTargetBuildConfigurations(buildTarget, target, project.getMainGroup(), configs.get(),
                    getTargetCxxBuildConfigurationForTargetNode(targetNode, appendedConfig),
                    extraSettingsBuilder.build(), defaultSettingsBuilder.build(), appendedConfig);
        }
    }

    Optional<String> moduleName = isModularAppleLibrary ? Optional.of(getModuleName(targetNode))
            : Optional.empty();
    // -- phases
    createHeaderSymlinkTree(publicCxxHeaders, getSwiftPublicHeaderMapEntriesForTarget(targetNode), moduleName,
            getPathToHeaderSymlinkTree(targetNode, HeaderVisibility.PUBLIC),
            arg.getXcodePublicHeadersSymlinks().orElse(cxxBuckConfig.getPublicHeadersSymlinksEnabled())
                    || !options.shouldUseHeaderMaps() || isModularAppleLibrary,
            !shouldMergeHeaderMaps(), options.shouldGenerateMissingUmbrellaHeader());
    if (isFocusedOnTarget) {
        createHeaderSymlinkTree(getPrivateCxxHeaders(targetNode), ImmutableMap.of(), // private interfaces never have a modulemap
                Optional.empty(), getPathToHeaderSymlinkTree(targetNode, HeaderVisibility.PRIVATE),
                arg.getXcodePrivateHeadersSymlinks().orElse(cxxBuckConfig.getPrivateHeadersSymlinksEnabled())
                        || !options.shouldUseHeaderMaps(),
                options.shouldUseHeaderMaps(), options.shouldGenerateMissingUmbrellaHeader());
    }

    Optional<TargetNode<AppleNativeTargetDescriptionArg>> appleTargetNode = TargetNodes.castArg(targetNode,
            AppleNativeTargetDescriptionArg.class);
    if (appleTargetNode.isPresent() && isFocusedOnTarget && !options.shouldGenerateHeaderSymlinkTreesOnly()) {
        // Use Core Data models from immediate dependencies only.
        addCoreDataModelsIntoTarget(appleTargetNode.get(), targetGroup.get());
        addSceneKitAssetsIntoTarget(appleTargetNode.get(), targetGroup.get());
    }

    if (bundle.isPresent() && isFocusedOnTarget && !options.shouldGenerateHeaderSymlinkTreesOnly()) {
        addEntitlementsPlistIntoTarget(bundle.get(), targetGroup.get());
    }

    return target;
}

From source file:com.facebook.buck.features.apple.project.ProjectGenerator.java

/**
 * Subdivide the various deps and write out to the xcconfig file for scripts to post process if
 * needed*//w w  w. java  2s. c o  m
 */
private void updateOtherLinkerFlagsForOptions(TargetNode<? extends CommonArg> targetNode,
        Optional<TargetNode<AppleBundleDescriptionArg>> bundleLoaderNode,
        Builder<String, String> appendConfigsBuilder, Iterable<String> otherLdFlags) {

    // Local: Local to the current project and built by Xcode.
    // Focused: Included in the workspace and built by Xcode but not in current project.
    // Other: Not included in the workspace to be built by Xcode.
    FluentIterable<TargetNode<?>> depTargetNodes = collectRecursiveLibraryDepTargets(targetNode);

    // Don't duplicate linker flags for the bundle loader.
    FluentIterable<TargetNode<?>> filteredDeps = collectRecursiveLibraryDepsMinusBundleLoaderDeps(targetNode,
            depTargetNodes, bundleLoaderNode);

    ImmutableSet<FrameworkPath> systemFwkOrLibs = getSytemFrameworksLibsForTargetNode(targetNode);
    ImmutableList<String> systemFwkOrLibFlags = collectSystemLibraryAndFrameworkLinkerFlags(systemFwkOrLibs);

    if (options.shouldForceLoadLinkWholeLibraries() || options.shouldAddLinkedLibrariesAsFlags()) {
        ImmutableList<String> forceLoadLocal = collectForceLoadLinkerFlags(filterRecursiveLibraryDepsIterable(
                filteredDeps, FilterFlags.LIBRARY_CURRENT_PROJECT_WITH_FORCE_LOAD));
        ImmutableList<String> forceLoadFocused = collectForceLoadLinkerFlags(
                filterRecursiveLibraryDepsIterable(filteredDeps, FilterFlags.LIBRARY_FOCUSED_WITH_FORCE_LOAD));
        ImmutableList<String> forceLoadOther = collectForceLoadLinkerFlags(
                filterRecursiveLibraryDepsIterable(filteredDeps, FilterFlags.LIBRARY_OTHER_WITH_FORCE_LOAD));

        appendConfigsBuilder.put("BUCK_LINKER_FLAGS_LIBRARY_FORCE_LOAD_LOCAL",
                Streams.stream(forceLoadLocal).map(Escaper.BASH_ESCAPER).collect(Collectors.joining(" ")));

        appendConfigsBuilder.put("BUCK_LINKER_FLAGS_LIBRARY_FORCE_LOAD_FOCUSED",
                Streams.stream(forceLoadFocused).map(Escaper.BASH_ESCAPER).collect(Collectors.joining(" ")));

        appendConfigsBuilder.put("BUCK_LINKER_FLAGS_LIBRARY_FORCE_LOAD_OTHER",
                Streams.stream(forceLoadOther).map(Escaper.BASH_ESCAPER).collect(Collectors.joining(" ")));
    }

    if (options.shouldAddLinkedLibrariesAsFlags()) {
        // If force load enabled, then don't duplicate the flags in the OTHER flags, otherwise they
        // will just be included like normal dependencies.
        boolean shouldLimitByForceLoad = options.shouldForceLoadLinkWholeLibraries();
        Iterable<String> localLibraryFlags = collectLibraryLinkerFlags(filterRecursiveLibraryDepsIterable(
                filteredDeps, shouldLimitByForceLoad ? FilterFlags.LIBRARY_CURRENT_PROJECT_WITHOUT_FORCE_LOAD
                        : FilterFlags.LIBRARY_CURRENT_PROJECT));
        Iterable<String> focusedLibraryFlags = collectLibraryLinkerFlags(filterRecursiveLibraryDepsIterable(
                filteredDeps, shouldLimitByForceLoad ? FilterFlags.LIBRARY_FOCUSED_WITHOUT_FORCE_LOAD
                        : FilterFlags.LIBRARY_FOCUSED));
        Iterable<String> otherLibraryFlags = collectLibraryLinkerFlags(filterRecursiveLibraryDepsIterable(
                filteredDeps, shouldLimitByForceLoad ? FilterFlags.LIBRARY_OTHER_WITHOUT_FORCE_LOAD
                        : FilterFlags.LIBRARY_OTHER));

        Iterable<String> localFrameworkFlags = collectFrameworkLinkerFlags(
                filterRecursiveLibraryDepsIterable(depTargetNodes, FilterFlags.FRAMEWORK_CURRENT_PROJECT));

        Iterable<String> focusedFrameworkFlags = collectFrameworkLinkerFlags(
                filterRecursiveLibraryDepsIterable(depTargetNodes, FilterFlags.FRAMEWORK_FOCUSED));
        Iterable<String> otherFrameworkFlags = collectFrameworkLinkerFlags(
                filterRecursiveLibraryDepsIterable(depTargetNodes, FilterFlags.FRAMEWORK_OTHER));

        appendConfigsBuilder
                .put("BUCK_LINKER_FLAGS_LIBRARY_LOCAL",
                        Streams.stream(localLibraryFlags).collect(Collectors.joining(" ")))
                .put("BUCK_LINKER_FLAGS_LIBRARY_FOCUSED",
                        Streams.stream(focusedLibraryFlags).collect(Collectors.joining(" ")))
                .put("BUCK_LINKER_FLAGS_LIBRARY_OTHER",
                        Streams.stream(otherLibraryFlags).collect(Collectors.joining(" ")))
                .put("BUCK_LINKER_FLAGS_FRAMEWORK_LOCAL",
                        Streams.stream(localFrameworkFlags).collect(Collectors.joining(" ")))
                .put("BUCK_LINKER_FLAGS_FRAMEWORK_FOCUSED",
                        Streams.stream(focusedFrameworkFlags).collect(Collectors.joining(" ")))
                .put("BUCK_LINKER_FLAGS_FRAMEWORK_OTHER",
                        Streams.stream(otherFrameworkFlags).collect(Collectors.joining(" ")))
                .put("BUCK_LINKER_FLAGS_SYSTEM",
                        Streams.stream(systemFwkOrLibFlags).collect(Collectors.joining(" ")));
    }

    Stream<String> otherLdFlagsStream = Streams.stream(otherLdFlags).map(Escaper.BASH_ESCAPER);

    if (options.shouldForceLoadLinkWholeLibraries() && options.shouldAddLinkedLibrariesAsFlags()) {
        appendConfigsBuilder.put("OTHER_LDFLAGS",
                Streams.concat(otherLdFlagsStream, Stream.of("$BUCK_LINKER_FLAGS_SYSTEM",
                        "$BUCK_LINKER_FLAGS_FRAMEWORK_LOCAL", "$BUCK_LINKER_FLAGS_FRAMEWORK_FOCUSED",
                        "$BUCK_LINKER_FLAGS_FRAMEWORK_OTHER", "$BUCK_LINKER_FLAGS_LIBRARY_FORCE_LOAD_LOCAL",
                        "$BUCK_LINKER_FLAGS_LIBRARY_FORCE_LOAD_FOCUSED",
                        "$BUCK_LINKER_FLAGS_LIBRARY_FORCE_LOAD_OTHER", "$BUCK_LINKER_FLAGS_LIBRARY_LOCAL",
                        "$BUCK_LINKER_FLAGS_LIBRARY_FOCUSED", "$BUCK_LINKER_FLAGS_LIBRARY_OTHER"))
                        .collect(Collectors.joining(" ")));
    } else if (options.shouldForceLoadLinkWholeLibraries() && !options.shouldAddLinkedLibrariesAsFlags()) {
        appendConfigsBuilder.put("OTHER_LDFLAGS", Streams
                .concat(otherLdFlagsStream,
                        Stream.of("$BUCK_LINKER_FLAGS_LIBRARY_FORCE_LOAD_LOCAL",
                                "$BUCK_LINKER_FLAGS_LIBRARY_FORCE_LOAD_FOCUSED",
                                "$BUCK_LINKER_FLAGS_LIBRARY_FORCE_LOAD_OTHER"))
                .collect(Collectors.joining(" ")));
    } else if (options.shouldAddLinkedLibrariesAsFlags()) {
        appendConfigsBuilder.put("OTHER_LDFLAGS",
                Streams.concat(otherLdFlagsStream,
                        Stream.of("$BUCK_LINKER_FLAGS_SYSTEM", "$BUCK_LINKER_FLAGS_FRAMEWORK_LOCAL",
                                "$BUCK_LINKER_FLAGS_FRAMEWORK_FOCUSED", "$BUCK_LINKER_FLAGS_FRAMEWORK_OTHER",
                                "$BUCK_LINKER_FLAGS_LIBRARY_LOCAL", "$BUCK_LINKER_FLAGS_LIBRARY_FOCUSED",
                                "$BUCK_LINKER_FLAGS_LIBRARY_OTHER"))
                        .collect(Collectors.joining(" ")));
    } else {
        appendConfigsBuilder.put("OTHER_LDFLAGS", otherLdFlagsStream.collect(Collectors.joining(" ")));
    }
}