Skip to content

Commit 3501fdb

Browse files
authored
Support latest rules_swift (#2729)
Changes: - Remove use of `objc_infos` (no longer provided by **rules_swift**) - Remove use of `emit_swiftinterface` (no longer provided by **rules_swift**) - **NOTE**: this means `.swiftinterface` files are no longer provided by default unless the underlying `swift_library` uses `features = ["swift.emit_swiftinterface"]` or `library_evolution = True` - Update to use new free functions instead of `swift_common` when available in rules_swift 3+ (e.g. `swift_common.create_swift_info` vs. `SwiftInfo()`) - Update tests Tasks: - [x] Tag a rules_swift 3.x release and update this PR to use that as an override.
1 parent c07c93e commit 3501fdb

17 files changed

+82
-69
lines changed

MODULE.bazel

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,16 @@ bazel_dep(name = "rules_cc", version = "0.0.10")
1313
bazel_dep(
1414
name = "rules_swift",
1515
version = "2.4.0",
16+
max_compatibility_level = 3,
1617
repo_name = "build_bazel_rules_swift",
1718
)
19+
20+
# Test with latest rules_swift without requiring users to use this version
21+
single_version_override(
22+
module_name = "rules_swift",
23+
version = "3.0.2",
24+
)
25+
1826
bazel_dep(name = "rules_python", version = "1.3.0")
1927
bazel_dep(name = "rules_shell", version = "0.3.0")
2028

apple/internal/apple_framework_import.bzl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,9 +332,12 @@ def _apple_static_framework_import_impl(ctx):
332332
# rare case that a binary has a Swift framework import dependency but
333333
# no other Swift dependencies, make sure we pick those up so that it
334334
# links to the standard libraries correctly.
335-
additional_objc_providers.extend(toolchain.implicit_deps_providers.objc_infos)
336335
additional_cc_infos.extend(toolchain.implicit_deps_providers.cc_infos)
337336

337+
# TODO: remove this once rules_swift 3+ is required
338+
if hasattr(toolchain.implicit_deps_providers, "objc_infos"):
339+
additional_objc_providers.extend(toolchain.implicit_deps_providers.objc_infos)
340+
338341
if _is_debugging(compilation_mode):
339342
swiftmodule = _swiftmodule_for_cpu(
340343
framework.swift_module_imports,

apple/internal/apple_xcframework_import.bzl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,10 @@ def _apple_static_xcframework_import_impl(ctx):
651651
# no other Swift dependencies, make sure we pick those up so that it
652652
# links to the standard libraries correctly.
653653
additional_cc_infos.extend(swift_toolchain.implicit_deps_providers.cc_infos)
654-
additional_objc_providers.extend(swift_toolchain.implicit_deps_providers.objc_infos)
654+
655+
# TODO: remove this once rules_swift 3+ is required
656+
if hasattr(swift_toolchain.implicit_deps_providers, "objc_infos"):
657+
additional_objc_providers.extend(swift_toolchain.implicit_deps_providers.objc_infos)
655658

656659
# Create Objc provider
657660
additional_objc_providers.extend([

apple/internal/framework_import_support.bzl

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ load(
2020
"SwiftInfo",
2121
"swift_common",
2222
)
23+
load("@build_bazel_rules_swift//swift:swift_interop_info.bzl", "create_swift_interop_info")
2324
load("//apple:providers.bzl", "AppleFrameworkImportInfo")
2425
load("//apple:utils.bzl", "group_files_by_directory")
2526
load("//apple/internal:providers.bzl", "new_appleframeworkimportinfo")
@@ -500,10 +501,17 @@ def _swift_info_from_module_interface(
500501
target_name = ctx.label.name,
501502
)
502503

503-
return swift_common.create_swift_info(
504-
modules = [module_context],
505-
swift_infos = swift_infos,
506-
)
504+
# TODO: use SwiftInfo directly when rules_apple sets min for rules_swift to v3+
505+
if hasattr(swift_common, "create_swift_info"):
506+
return swift_common.create_swift_info(
507+
modules = [module_context],
508+
swift_infos = swift_infos,
509+
)
510+
else:
511+
return SwiftInfo(
512+
modules = [module_context],
513+
swift_infos = swift_infos,
514+
)
507515

508516
def _swift_interop_info_with_dependencies(deps, module_name, module_map_imports):
509517
"""Return a Swift interop provider for the framework if it has a module map."""
@@ -513,11 +521,20 @@ def _swift_interop_info_with_dependencies(deps, module_name, module_map_imports)
513521
# Assume that there is only a single module map file (the legacy
514522
# implementation that read from the Objc provider made the same
515523
# assumption).
516-
return swift_common.create_swift_interop_info(
517-
module_map = module_map_imports[0],
518-
module_name = module_name,
519-
swift_infos = [dep[SwiftInfo] for dep in deps if SwiftInfo in dep],
520-
)
524+
525+
# TODO: Use the free function when rules_apple sets min for rules_swift to v3+
526+
if hasattr(swift_common, "create_swift_interop_info"):
527+
return swift_common.create_swift_interop_info(
528+
module_map = module_map_imports[0],
529+
module_name = module_name,
530+
swift_infos = [dep[SwiftInfo] for dep in deps if SwiftInfo in dep],
531+
)
532+
else:
533+
return create_swift_interop_info(
534+
module_map = module_map_imports[0],
535+
module_name = module_name,
536+
swift_infos = [dep[SwiftInfo] for dep in deps if SwiftInfo in dep],
537+
)
521538

522539
framework_import_support = struct(
523540
cc_info_with_dependencies = _cc_info_with_dependencies,

apple/internal/header_map.bzl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
"""Rule for creating header_maps."""
1616

17+
load("@build_bazel_rules_swift//swift:providers.bzl", "SwiftInfo")
1718
load("@build_bazel_rules_swift//swift:swift.bzl", "swift_common")
1819

1920
HeaderMapInfo = provider(
@@ -81,9 +82,15 @@ def _header_map_impl(ctx):
8182
hdrs_lists = hdrs_lists,
8283
)
8384

85+
# TODO: use SwiftInfo directly when rules_apple sets min for rules_swift to v3+
86+
if hasattr(swift_common, "create_swift_info"):
87+
swift_info = swift_common.create_swift_info()
88+
else:
89+
swift_info = SwiftInfo()
90+
8491
return [
8592
apple_common.new_objc_provider(),
86-
swift_common.create_swift_info(),
93+
swift_info,
8794
CcInfo(
8895
compilation_context = cc_common.create_compilation_context(
8996
headers = depset([ctx.outputs.header_map]),

apple/internal/transition_support.bzl

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,6 @@ def _is_arch_supported_for_target_tuple(*, environment_arch, minimum_os_version,
206206
def _command_line_options(
207207
*,
208208
apple_platforms = [],
209-
emit_swiftinterface = False,
210209
environment_arch = None,
211210
force_bundle_outputs = False,
212211
minimum_os_version,
@@ -221,8 +220,6 @@ def _command_line_options(
221220
first element will be applied to `platforms` as that will be what is resolved by the
222221
underlying rule. Defaults to an empty list, which will signal to Bazel that platform
223222
mapping can take place as a fallback measure.
224-
emit_swiftinterface: Wheither to emit swift interfaces for the given target. Defaults to
225-
`False`.
226223
environment_arch: A valid Apple environment when applicable with its architecture as a
227224
string (for example `sim_arm64` from `ios_sim_arm64`, or `arm64` from `ios_arm64`), or
228225
None to infer a value from command line options passed through settings.
@@ -284,7 +281,6 @@ def _command_line_options(
284281
platform = "watchos",
285282
platform_type = platform_type,
286283
),
287-
"@build_bazel_rules_swift//swift:emit_swiftinterface": emit_swiftinterface,
288284
}
289285

290286
def _xcframework_split_attr_key(*, arch, environment, platform_type):
@@ -320,7 +316,6 @@ def _resolved_environment_arch_for_arch(*, arch, environment, platform_type):
320316

321317
def _command_line_options_for_xcframework_platform(
322318
*,
323-
attr,
324319
minimum_os_version,
325320
platform_attr,
326321
platform_type,
@@ -329,7 +324,6 @@ def _command_line_options_for_xcframework_platform(
329324
"""Generates a dictionary of command line options keyed by 1:2+ transition for this platform.
330325
331326
Args:
332-
attr: The attributes passed to the transition function.
333327
minimum_os_version: A string representing the minimum OS version specified for this
334328
platform, represented as a dotted version number (for example, `"9.0"`).
335329
platform_attr: The attribute for the apple platform specifying in dictionary form which
@@ -363,10 +357,6 @@ def _command_line_options_for_xcframework_platform(
363357
environment = target_environment,
364358
platform_type = platform_type,
365359
): _command_line_options(
366-
emit_swiftinterface = _should_emit_swiftinterface(
367-
attr,
368-
is_xcframework = True,
369-
),
370360
environment_arch = resolved_environment_arch,
371361
minimum_os_version = minimum_os_version,
372362
platform_type = platform_type,
@@ -377,28 +367,10 @@ def _command_line_options_for_xcframework_platform(
377367

378368
return output_dictionary
379369

380-
def _should_emit_swiftinterface(attr, is_xcframework = False):
381-
"""Determines if a .swiftinterface file should be generated for Swift dependencies.
382-
383-
Needed until users of the framework rules are allowed to enable
384-
library evolution on specific targets instead of having it automatically
385-
applied to the entire dependency subgraph.
386-
"""
387-
388-
features = getattr(attr, "features", [])
389-
if type(features) == "list" and "apple.no_legacy_swiftinterface" in features:
390-
return False
391-
392-
# iOS and tvOS static frameworks require underlying swift_library targets generate a Swift
393-
# interface file. These rules define a private attribute called `_emitswiftinterface` that
394-
# let's this transition flip rules_swift config down the build graph.
395-
return is_xcframework or hasattr(attr, "_emitswiftinterface")
396-
397370
def _apple_rule_base_transition_impl(settings, attr):
398371
"""Rule transition for Apple rules using Bazel CPUs and a valid Apple split transition."""
399372
platform_type = attr.platform_type
400373
return _command_line_options(
401-
emit_swiftinterface = _should_emit_swiftinterface(attr),
402374
environment_arch = _environment_archs(platform_type, settings)[0],
403375
minimum_os_version = attr.minimum_os_version,
404376
platform_type = platform_type,
@@ -444,7 +416,6 @@ _apple_rule_base_transition_outputs = [
444416
"//command_line_option:platforms",
445417
"//command_line_option:tvos_minimum_os",
446418
"//command_line_option:watchos_minimum_os",
447-
"@build_bazel_rules_swift//swift:emit_swiftinterface",
448419
]
449420
_apple_universal_binary_rule_transition_outputs = _apple_rule_base_transition_outputs + [
450421
"//command_line_option:ios_multi_cpus",
@@ -469,7 +440,6 @@ def _apple_platforms_rule_base_transition_impl(settings, attr):
469440
environment_arch = _environment_archs(platform_type, settings)[0]
470441
return _command_line_options(
471442
apple_platforms = settings["//command_line_option:apple_platforms"],
472-
emit_swiftinterface = _should_emit_swiftinterface(attr),
473443
environment_arch = environment_arch,
474444
minimum_os_version = minimum_os_version,
475445
platform_type = platform_type,
@@ -492,7 +462,6 @@ def _apple_platforms_rule_bundle_output_base_transition_impl(settings, attr):
492462
environment_arch = _environment_archs(platform_type, settings)[0]
493463
return _command_line_options(
494464
apple_platforms = settings["//command_line_option:apple_platforms"],
495-
emit_swiftinterface = _should_emit_swiftinterface(attr),
496465
environment_arch = environment_arch,
497466
force_bundle_outputs = True,
498467
minimum_os_version = minimum_os_version,
@@ -569,11 +538,6 @@ def _apple_platform_split_transition_impl(settings, attr):
569538
output_dictionary = {}
570539
invalid_requested_archs = []
571540

572-
# iOS and tvOS static frameworks require underlying swift_library targets generate a Swift
573-
# interface file. These rules define a private attribute called `_emitswiftinterface` that
574-
# let's this transition flip rules_swift config down the build graph.
575-
emit_swiftinterface = _should_emit_swiftinterface(attr)
576-
577541
if settings["//command_line_option:incompatible_enable_apple_toolchain_resolution"]:
578542
platforms = (
579543
settings["//command_line_option:apple_platforms"] or
@@ -594,7 +558,6 @@ def _apple_platform_split_transition_impl(settings, attr):
594558
if str(platform) not in output_dictionary:
595559
output_dictionary[str(platform)] = _command_line_options(
596560
apple_platforms = apple_platforms,
597-
emit_swiftinterface = emit_swiftinterface,
598561
minimum_os_version = attr.minimum_os_version,
599562
platform_type = attr.platform_type,
600563
settings = settings,
@@ -643,7 +606,6 @@ def _apple_platform_split_transition_impl(settings, attr):
643606
continue
644607

645608
output_dictionary[found_cpu] = _command_line_options(
646-
emit_swiftinterface = emit_swiftinterface,
647609
environment_arch = environment_arch,
648610
minimum_os_version = minimum_os_version,
649611
platform_type = platform_type,
@@ -694,7 +656,6 @@ def _xcframework_transition_impl(settings, attr):
694656
target_environments.append("simulator")
695657

696658
command_line_options = _command_line_options_for_xcframework_platform(
697-
attr = attr,
698659
minimum_os_version = attr.minimum_os_versions.get(platform_type),
699660
platform_attr = platform_attr,
700661
platform_type = platform_type,

test/starlark_tests/apple_static_xcframework_tests.bzl

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,9 @@ def apple_static_xcframework_test_suite(name):
131131
contains = [
132132
"$BUNDLE_ROOT/Info.plist",
133133
"$BUNDLE_ROOT/ios-arm64/ios_static_xcfmwk_with_swift.framework/Modules/ios_static_xcfmwk_with_swift.swiftmodule/arm64.swiftdoc",
134-
"$BUNDLE_ROOT/ios-arm64/ios_static_xcfmwk_with_swift.framework/Modules/ios_static_xcfmwk_with_swift.swiftmodule/arm64.swiftinterface",
135134
"$BUNDLE_ROOT/ios-arm64/ios_static_xcfmwk_with_swift.framework/ios_static_xcfmwk_with_swift",
136135
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift.framework/Modules/ios_static_xcfmwk_with_swift.swiftmodule/arm64.swiftdoc",
137-
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift.framework/Modules/ios_static_xcfmwk_with_swift.swiftmodule/arm64.swiftinterface",
138136
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift.framework/Modules/ios_static_xcfmwk_with_swift.swiftmodule/x86_64.swiftdoc",
139-
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift.framework/Modules/ios_static_xcfmwk_with_swift.swiftmodule/x86_64.swiftinterface",
140137
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift.framework/ios_static_xcfmwk_with_swift",
141138
],
142139
tags = [name],
@@ -153,14 +150,11 @@ def apple_static_xcframework_test_suite(name):
153150
"$BUNDLE_ROOT/ios-arm64/ios_static_xcfmwk_with_swift_generated_headers.framework/Headers/ios_static_xcfmwk_with_swift_generated_headers.h",
154151
"$BUNDLE_ROOT/ios-arm64/ios_static_xcfmwk_with_swift_generated_headers.framework/Modules/module.modulemap",
155152
"$BUNDLE_ROOT/ios-arm64/ios_static_xcfmwk_with_swift_generated_headers.framework/Modules/ios_static_xcfmwk_with_swift_generated_headers.swiftmodule/arm64.swiftdoc",
156-
"$BUNDLE_ROOT/ios-arm64/ios_static_xcfmwk_with_swift_generated_headers.framework/Modules/ios_static_xcfmwk_with_swift_generated_headers.swiftmodule/arm64.swiftinterface",
157153
"$BUNDLE_ROOT/ios-arm64/ios_static_xcfmwk_with_swift_generated_headers.framework/ios_static_xcfmwk_with_swift_generated_headers",
158154
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift_generated_headers.framework/Headers/ios_static_xcfmwk_with_swift_generated_headers.h",
159155
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift_generated_headers.framework/Modules/module.modulemap",
160156
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift_generated_headers.framework/Modules/ios_static_xcfmwk_with_swift_generated_headers.swiftmodule/arm64.swiftdoc",
161-
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift_generated_headers.framework/Modules/ios_static_xcfmwk_with_swift_generated_headers.swiftmodule/arm64.swiftinterface",
162157
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift_generated_headers.framework/Modules/ios_static_xcfmwk_with_swift_generated_headers.swiftmodule/x86_64.swiftdoc",
163-
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift_generated_headers.framework/Modules/ios_static_xcfmwk_with_swift_generated_headers.swiftmodule/x86_64.swiftinterface",
164158
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/ios_static_xcfmwk_with_swift_generated_headers.framework/ios_static_xcfmwk_with_swift_generated_headers",
165159
],
166160
tags = [name],

test/starlark_tests/apple_xcframework_tests.bzl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,8 @@ def apple_xcframework_test_suite(name):
457457
tags = [name],
458458
)
459459

460-
# Tests that generated swift interfaces work for XCFrameworks when a swift_library is included.
460+
# Tests that generated swift interfaces work for XCFrameworks when a swift_library is included that
461+
# enable swift interface/library evolution.
461462
archive_contents_test(
462463
name = "{}_swift_interface_generation_test".format(name),
463464
build_type = "device",
@@ -489,13 +490,10 @@ def apple_xcframework_test_suite(name):
489490
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/SwiftFmwkWithGenHeader.framework/Headers/SwiftFmwkWithGenHeader.h",
490491
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/SwiftFmwkWithGenHeader.framework/Modules/module.modulemap",
491492
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/SwiftFmwkWithGenHeader.framework/Modules/SwiftFmwkWithGenHeader.swiftmodule/arm64.swiftdoc",
492-
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/SwiftFmwkWithGenHeader.framework/Modules/SwiftFmwkWithGenHeader.swiftmodule/arm64.swiftinterface",
493493
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/SwiftFmwkWithGenHeader.framework/Modules/SwiftFmwkWithGenHeader.swiftmodule/x86_64.swiftdoc",
494-
"$BUNDLE_ROOT/ios-arm64_x86_64-simulator/SwiftFmwkWithGenHeader.framework/Modules/SwiftFmwkWithGenHeader.swiftmodule/x86_64.swiftinterface",
495494
"$BUNDLE_ROOT/ios-arm64/SwiftFmwkWithGenHeader.framework/Headers/SwiftFmwkWithGenHeader.h",
496495
"$BUNDLE_ROOT/ios-arm64/SwiftFmwkWithGenHeader.framework/Modules/module.modulemap",
497496
"$BUNDLE_ROOT/ios-arm64/SwiftFmwkWithGenHeader.framework/Modules/SwiftFmwkWithGenHeader.swiftmodule/arm64.swiftdoc",
498-
"$BUNDLE_ROOT/ios-arm64/SwiftFmwkWithGenHeader.framework/Modules/SwiftFmwkWithGenHeader.swiftmodule/arm64.swiftinterface",
499497
],
500498
tags = [name],
501499
)

test/starlark_tests/ios_framework_tests.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ def ios_framework_test_suite(name):
410410
archive_contents_test(
411411
name = "{}_static_framework_contains_swiftinterface".format(name),
412412
build_type = "simulator",
413-
target_under_test = "//test/starlark_tests/targets_under_test/ios:swift_static_framework",
413+
target_under_test = "//test/starlark_tests/targets_under_test/ios:swift_static_framework_with_swiftinterface",
414414
contains = [
415415
"$BUNDLE_ROOT/Headers/swift_framework_lib.h",
416416
"$BUNDLE_ROOT/Modules/swift_framework_lib.swiftmodule/x86_64.swiftdoc",

test/starlark_tests/ios_static_framework_tests.bzl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ def ios_static_framework_test_suite(name):
120120
target_under_test = "//test/starlark_tests/targets_under_test/ios:static_fmwk_with_swift_and_avoid_deps",
121121
contains = [
122122
"$BUNDLE_ROOT/Modules/SwiftFmwkUpperLib.swiftmodule/x86_64.swiftdoc",
123-
"$BUNDLE_ROOT/Modules/SwiftFmwkUpperLib.swiftmodule/x86_64.swiftinterface",
124123
],
125124
binary_test_file = "$BUNDLE_ROOT/SwiftFmwkUpperLib",
126125
binary_test_architecture = "x86_64",
@@ -188,7 +187,6 @@ def ios_static_framework_test_suite(name):
188187
"$BUNDLE_ROOT/Headers/SwiftStaticFmwkWithGenHeader.h",
189188
"$BUNDLE_ROOT/Modules/module.modulemap",
190189
"$BUNDLE_ROOT/Modules/SwiftStaticFmwkWithGenHeader.swiftmodule/x86_64.swiftdoc",
191-
"$BUNDLE_ROOT/Modules/SwiftStaticFmwkWithGenHeader.swiftmodule/x86_64.swiftinterface",
192190
],
193191
tags = [name],
194192
)

0 commit comments

Comments
 (0)