void parseFlags()

in src/com/facebook/buck/features/apple/projectV2/FlagParser.java [131:362]


  void parseFlags(
      TargetNode<? extends CxxLibraryDescription.CommonArg> targetNode,
      boolean includeFrameworks,
      FluentIterable<TargetNode<?>> swiftDepTargets,
      boolean containsSwiftCode,
      boolean isModularAppleLibrary,
      boolean hasPublicCxxHeaders,
      Set<Path> recursivePublicSystemIncludeDirectories,
      ImmutableMap.Builder<String, String> flagsBuilder,
      ImmutableSet.Builder<BuildTarget> requiredBuildTargetsBuilder) {

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

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

    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(),
                        requiredBuildTargetsBuilder))
            .orElse(ImmutableList.of()));

    if (containsSwiftCode && isModularAppleLibrary && hasPublicCxxHeaders) {
      targetSpecificSwiftFlags.addAll(collectModularTargetSpecificSwiftFlags(targetNode));
    }

    // Explicitly add system include directories to compile flags to mute warnings,
    // XCode seems to not support system include directories directly.
    // But even if headers dirs are passed as flags, we still need to add
    // them to `HEADER_SEARCH_PATH` otherwise header generation for Swift interop
    // won't work (it doesn't use `OTHER_XXX_FLAGS`).
    Iterable<String> systemIncludeDirectoryFlags =
        StreamSupport.stream(recursivePublicSystemIncludeDirectories.spliterator(), false)
            .map(path -> "-isystem" + path)
            .collect(Collectors.toList());

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

    Iterable<String> targetCFlags =
        Utils.distinctUntilChanged(
            ImmutableList.<String>builder()
                .addAll(
                    convertStringWithMacros(
                        targetNode,
                        collectRecursiveExportedPreprocessorFlags(targetNode),
                        requiredBuildTargetsBuilder))
                .addAll(
                    convertStringWithMacros(
                        targetNode,
                        targetNode.getConstructorArg().getCompilerFlags(),
                        requiredBuildTargetsBuilder))
                .addAll(
                    convertStringWithMacros(
                        targetNode,
                        targetNode.getConstructorArg().getPreprocessorFlags(),
                        requiredBuildTargetsBuilder))
                .addAll(
                    convertStringWithMacros(
                        targetNode,
                        collectRecursiveSystemPreprocessorFlags(targetNode),
                        requiredBuildTargetsBuilder))
                .addAll(systemIncludeDirectoryFlags)
                .addAll(testingOverlay)
                .build());

    Iterable<String> targetCxxFlags =
        Utils.distinctUntilChanged(
            ImmutableList.<String>builder()
                .addAll(
                    convertStringWithMacros(
                        targetNode,
                        collectRecursiveExportedPreprocessorFlags(targetNode),
                        requiredBuildTargetsBuilder))
                .addAll(
                    convertStringWithMacros(
                        targetNode,
                        targetNode.getConstructorArg().getCompilerFlags(),
                        requiredBuildTargetsBuilder))
                .addAll(
                    convertStringWithMacros(
                        targetNode,
                        targetNode.getConstructorArg().getPreprocessorFlags(),
                        requiredBuildTargetsBuilder))
                .addAll(
                    convertStringWithMacros(
                        targetNode,
                        collectRecursiveSystemPreprocessorFlags(targetNode),
                        requiredBuildTargetsBuilder))
                .addAll(systemIncludeDirectoryFlags)
                .addAll(testingOverlay)
                .build());

    flagsBuilder
        .put(
            "OTHER_SWIFT_FLAGS",
            Streams.stream(otherSwiftFlags)
                .map(Escaper.BASH_ESCAPER)
                .collect(Collectors.joining(" ")))
        .put(
            "OTHER_CFLAGS",
            Streams.stream(
                    Iterables.concat(
                        cxxBuckConfig.getCflags().orElse(DEFAULT_CFLAGS),
                        cxxBuckConfig.getCppflags().orElse(DEFAULT_CPPFLAGS),
                        targetCFlags))
                .map(Escaper.BASH_ESCAPER)
                .collect(Collectors.joining(" ")))
        .put(
            "OTHER_CPLUSPLUSFLAGS",
            Streams.stream(
                    Iterables.concat(
                        cxxBuckConfig.getCxxflags().orElse(DEFAULT_CXXFLAGS),
                        cxxBuckConfig.getCxxppflags().orElse(DEFAULT_CXXPPFLAGS),
                        targetCxxFlags))
                .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)),
                    requiredBuildTargetsBuilder))
            .addAll(swiftDebugLinkerFlagsBuilder.build())
            .build();

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

    flagsBuilder.put("OTHER_LDFLAGS", otherLdFlagsStream.collect(Collectors.joining(" ")));

    ImmutableMultimap<String, ImmutableList<String>> platformFlags =
        convertPlatformFlags(
            targetNode,
            Iterables.concat(
                ImmutableList.of(targetNode.getConstructorArg().getPlatformCompilerFlags()),
                ImmutableList.of(targetNode.getConstructorArg().getPlatformPreprocessorFlags()),
                collectRecursiveExportedPlatformPreprocessorFlags(targetNode)),
            requiredBuildTargetsBuilder);

    for (Flavor platformFlavor : appleCxxFlavors) {
      Optional<CxxBuckConfig> platformConfig =
          Optional.ofNullable(platformCxxBuckConfigs.get(platformFlavor));
      String platform = platformFlavor.getName();

      // The behavior below matches the CxxPlatform behavior where it adds the cxx flags,
      // then the cxx#platform flags, then the flags for the target
      flagsBuilder
          .put(
              generateConfigKey("OTHER_CFLAGS", platform),
              Streams.stream(
                      Utils.distinctUntilChanged(
                          Iterables.transform(
                              Iterables.concat(
                                  cxxBuckConfig.getCflags().orElse(DEFAULT_CFLAGS),
                                  platformConfig
                                      .flatMap(CxxBuckConfig::getCflags)
                                      .orElse(DEFAULT_CFLAGS),
                                  cxxBuckConfig.getCppflags().orElse(DEFAULT_CPPFLAGS),
                                  platformConfig
                                      .flatMap(CxxBuckConfig::getCppflags)
                                      .orElse(DEFAULT_CPPFLAGS),
                                  targetCFlags,
                                  Iterables.concat(platformFlags.get(platform))),
                              Escaper.BASH_ESCAPER::apply)))
                  .collect(Collectors.joining(" ")))
          .put(
              generateConfigKey("OTHER_CPLUSPLUSFLAGS", platform),
              Streams.stream(
                      Utils.distinctUntilChanged(
                          Iterables.transform(
                              Iterables.concat(
                                  cxxBuckConfig.getCxxflags().orElse(DEFAULT_CPPFLAGS),
                                  platformConfig
                                      .flatMap(CxxBuckConfig::getCxxflags)
                                      .orElse(DEFAULT_CXXFLAGS),
                                  cxxBuckConfig.getCxxppflags().orElse(DEFAULT_CXXPPFLAGS),
                                  platformConfig
                                      .flatMap(CxxBuckConfig::getCxxppflags)
                                      .orElse(DEFAULT_CXXPPFLAGS),
                                  targetCxxFlags,
                                  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)),
            requiredBuildTargetsBuilder);
    for (String platform : platformLinkerFlags.keySet()) {
      flagsBuilder.put(
          generateConfigKey("OTHER_LDFLAGS", platform),
          Streams.stream(
                  Iterables.transform(
                      Iterables.concat(
                          otherLdFlags, Iterables.concat(platformLinkerFlags.get(platform))),
                      Escaper.BASH_ESCAPER::apply))
              .collect(Collectors.joining(" ")));
    }
  }