@@ -117,23 +117,6 @@ _DEVELOPER_DIR_SYMLINKS = [
117117 "/var/db/xcode_select_link" ,
118118]
119119
120- def _swift_developer_lib_dir (platform_framework_dir ):
121- """Returns the directory containing extra Swift developer libraries.
122-
123- Args:
124- platform_framework_dir: The developer platform framework directory for
125- the current platform.
126-
127- Returns:
128- The directory containing extra Swift-specific development libraries and
129- swiftmodules.
130- """
131- return paths .join (
132- paths .dirname (paths .dirname (platform_framework_dir )),
133- "usr" ,
134- "lib" ,
135- )
136-
137120def _platform_developer_framework_dir (developer_dir , target_triple ):
138121 """Returns the Developer framework directory for the platform.
139122
@@ -294,11 +277,16 @@ def _swift_linkopts_cc_info(
294277 # Add the linker path to the directory containing the dylib with Swift
295278 # extensions for the XCTest module.
296279 if platform_developer_framework_dir :
297- linkopts .extend ([
298- "-L{}" .format (
299- _swift_developer_lib_dir (platform_developer_framework_dir ),
280+ swift_lib_dir_path = swift_developer_lib_dir ([
281+ struct (
282+ developer_path_label = "platform" ,
283+ path = platform_developer_framework_dir ,
300284 ),
301285 ])
286+ if swift_lib_dir_path :
287+ linkopts .extend ([
288+ "-L{}" .format (swift_lib_dir_path ),
289+ ])
302290
303291 return CcInfo (
304292 linking_context = cc_common .create_linking_context (
@@ -311,23 +299,34 @@ def _swift_linkopts_cc_info(
311299 ),
312300 )
313301
314- def _test_linking_context (target_triple , toolchain_label ):
302+ def _test_linking_context (target_triple , toolchain_label , xcode_config ):
315303 """Returns a `CcLinkingContext` containing linker flags for test binaries.
316304
317305 Args:
318306 target_triple: The target triple `struct`.
319307 toolchain_label: The label of the Swift toolchain that will act as the
320308 owner of the linker input propagating the flags.
309+ xcode_config: The Xcode configuration.
321310
322311 Returns:
323312 A `CcLinkingContext` that will provide linker flags to `swift_test`
324313 binaries.
325314 """
326315
316+ # Weakly link to XCTest. It's possible that machine that links the test
317+ # binary will have Xcode installed at a different path than the machine that
318+ # runs the binary. To handle this, the binary `dlopen`s XCTest at startup
319+ # using the path Bazel passes in the test action's environment.
320+ linkopts = [
321+ "-Wl,-weak_framework,XCTest" ,
322+ "-Wl,-weak-lXCTestSwiftSupport" ,
323+ ]
324+ if _is_xcode_at_least_version (xcode_config , "16.0" ):
325+ linkopts .append ("-Wl,-weak_framework,Testing" )
326+
327327 # We use these as the rpaths for linking tests so that the required
328328 # libraries are found if Xcode is installed in a different location on the
329329 # machine that runs the tests than the machine used to link them.
330- linkopts = []
331330 for developer_dir in _DEVELOPER_DIR_SYMLINKS :
332331 platform_developer_framework_dir = _platform_developer_framework_dir (
333332 developer_dir ,
@@ -735,6 +734,7 @@ def _xcode_swift_toolchain_impl(ctx):
735734 test_linking_context = _test_linking_context (
736735 target_triple = target_triple ,
737736 toolchain_label = ctx .label ,
737+ xcode_config = xcode_config ,
738738 )
739739
740740 # `--define=SWIFT_USE_TOOLCHAIN_ROOT=<path>` is a rapid development feature
0 commit comments