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