From 4d750ebfadf908e4656ece3c85f28808d08b0e7c Mon Sep 17 00:00:00 2001 From: Brentley Jones Date: Tue, 20 Aug 2024 13:15:57 -0500 Subject: [PATCH] Use only the debug settings from the most-downstream Swift target (#3073) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This prevents settings which are specific to a particular Swift module compilation, such as clang module maps in a mixed-language library, from getting accumulated with the public settings. Before this change using `mixed_language_library` would result in module redefinition errors in lldb. I’m not sure if this has a chance of not setting some flags that would need to be set. In local testing everything worked, but as with all things lldb, wider user testing is needed. Ideally long term we can use serialized debug info instead (and/or explicit modules). **Note:** For this to work the best, the single dep of a top-level target needs to be a `swift_library` or `mixed_language_target`. This change might result in lldb regressions for custom setups that don't meet that requirement. --------- Signed-off-by: Brentley Jones --- .../src/Generator/ProcessSwiftArgs.swift | 41 +++++++++++++------ .../incremental_library_targets.bzl | 3 +- .../incremental_top_level_targets.bzl | 2 - .../incremental_unsupported_targets.bzl | 1 - .../processed_targets/mergeable_infos.bzl | 8 +--- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/tools/generators/target_build_settings/src/Generator/ProcessSwiftArgs.swift b/tools/generators/target_build_settings/src/Generator/ProcessSwiftArgs.swift index 2a7c658ac..4400f76d2 100644 --- a/tools/generators/target_build_settings/src/Generator/ProcessSwiftArgs.swift +++ b/tools/generators/target_build_settings/src/Generator/ProcessSwiftArgs.swift @@ -104,7 +104,14 @@ extension Generator.ProcessSwiftArgs { frameworkIncludes: OrderedSet, swiftIncludes: OrderedSet ) { - var (hasDebugInfo, clangArgs, frameworkIncludes, onceClangArgs, swiftIncludes) = try await _process_swift_args( + var ( + hasDebugInfo, + clangArgs, + frameworkIncludes, + onceClangArgs, + swiftIncludes, + includeTransitiveSwiftDebugSettings + ) = try await _process_swift_args( argsStream: argsStream, buildSettings: &buildSettings, includeSelfSwiftDebugSettings: includeSelfSwiftDebugSettings, @@ -118,13 +125,15 @@ extension Generator.ProcessSwiftArgs { processSwiftFrontendArg: processSwiftFrontendArg ) - try await parseTransitiveSwiftDebugSettings( - transitiveSwiftDebugSettingPaths, - clangArgs: &clangArgs, - frameworkIncludes: &frameworkIncludes, - onceClangArgs: &onceClangArgs, - swiftIncludes: &swiftIncludes - ) + if includeTransitiveSwiftDebugSettings { + try await parseTransitiveSwiftDebugSettings( + transitiveSwiftDebugSettingPaths, + clangArgs: &clangArgs, + frameworkIncludes: &frameworkIncludes, + onceClangArgs: &onceClangArgs, + swiftIncludes: &swiftIncludes + ) + } return (hasDebugInfo, clangArgs, frameworkIncludes, swiftIncludes) } @@ -146,8 +155,9 @@ extension Generator.ProcessSwiftArgs { clangArgs: [String], frameworkIncludes: OrderedSet, onceClangArgs: Set, - swiftIncludes: OrderedSet - ) { + swiftIncludes: OrderedSet, + includeTransitiveSwiftDebugSettings: Bool + ) { var previousArg: String? = nil var previousClangArg: String? = nil var previousFrontendArg: String? = nil @@ -158,7 +168,7 @@ extension Generator.ProcessSwiftArgs { guard let tool = try await iterator.next(), tool != Generator.argsSeparator else { - return (false, [], [], [], []) + return (false, [], [], [], [], true) } _ = try await iterator.next() @@ -312,7 +322,14 @@ extension Generator.ProcessSwiftArgs { ("OTHER_SWIFT_FLAGS", args.joined(separator: " ").pbxProjEscaped) ) - return (hasDebugInfo, clangArgs, frameworkIncludes, onceClangArgs, swiftIncludes) + return ( + hasDebugInfo, + clangArgs, + frameworkIncludes, + onceClangArgs, + swiftIncludes, + !includeSelfSwiftDebugSettings + ) } } diff --git a/xcodeproj/internal/processed_targets/incremental_library_targets.bzl b/xcodeproj/internal/processed_targets/incremental_library_targets.bzl index 4b6915c87..47e3ee286 100644 --- a/xcodeproj/internal/processed_targets/incremental_library_targets.bzl +++ b/xcodeproj/internal/processed_targets/incremental_library_targets.bzl @@ -151,8 +151,7 @@ def _process_incremental_library_target( transitive = [ info.swift_debug_settings for info in transitive_infos - ], - order = "topological", + ] if not swift_debug_settings_file else None, ) if apple_common.AppleDebugOutputs in target: diff --git a/xcodeproj/internal/processed_targets/incremental_top_level_targets.bzl b/xcodeproj/internal/processed_targets/incremental_top_level_targets.bzl index 938d45b2b..1a4dda9e3 100644 --- a/xcodeproj/internal/processed_targets/incremental_top_level_targets.bzl +++ b/xcodeproj/internal/processed_targets/incremental_top_level_targets.bzl @@ -421,7 +421,6 @@ def _process_focused_top_level_target( info.swift_debug_settings for info in deps_infos ], - order = "topological", ) top_level_focused_deps = [ @@ -749,7 +748,6 @@ def _process_unfocused_top_level_target( # FIXME: Exclude `avoid_deps` for info in deps_infos ], - order = "topological", ) ( diff --git a/xcodeproj/internal/processed_targets/incremental_unsupported_targets.bzl b/xcodeproj/internal/processed_targets/incremental_unsupported_targets.bzl index ac03a2477..9d8b77f1c 100644 --- a/xcodeproj/internal/processed_targets/incremental_unsupported_targets.bzl +++ b/xcodeproj/internal/processed_targets/incremental_unsupported_targets.bzl @@ -128,7 +128,6 @@ def _process_incremental_unsupported_target( info.swift_debug_settings for info in transitive_infos ], - order = "topological", ), target_output_groups = output_groups.merge( transitive_infos = transitive_infos, diff --git a/xcodeproj/internal/processed_targets/mergeable_infos.bzl b/xcodeproj/internal/processed_targets/mergeable_infos.bzl index 0ec6c7113..ecb87b9c6 100644 --- a/xcodeproj/internal/processed_targets/mergeable_infos.bzl +++ b/xcodeproj/internal/processed_targets/mergeable_infos.bzl @@ -257,13 +257,7 @@ def _mixed_language_mergeable_info( ], ), swift_args = swift.args.swift, - swift_debug_settings_to_merge = memory_efficient_depset( - transitive = [ - swift.swift_debug_settings, - cc.swift_debug_settings, - ], - order = "topological", - ), + swift_debug_settings_to_merge = swift.swift_debug_settings, ) def _swift_mergeable_info(