From 0f3a732839c4d4aed64f3964a5a7aebeb9a561c0 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 8 Jan 2024 14:05:31 -0800 Subject: [PATCH 1/4] Fix compatibility with --incompatible_objc_provider_remove_linking_info Fixes https://github.com/bazelbuild/rules_apple/issues/2353 --- apple/apple_binary.bzl | 4 +-- apple/internal/apple_framework_import.bzl | 2 +- apple/internal/apple_xcframework_import.bzl | 2 +- apple/internal/framework_import_support.bzl | 26 +++++++++++++++++++ apple/internal/ios_rules.bzl | 7 ++--- apple/internal/linking_support.bzl | 24 +++++++++++++++++ apple/internal/macos_rules.bzl | 9 ++++--- .../internal/partials/framework_provider.bzl | 6 ++++- apple/internal/tvos_rules.bzl | 2 +- apple/internal/visionos_rules.bzl | 5 ++-- 10 files changed, 72 insertions(+), 15 deletions(-) diff --git a/apple/apple_binary.bzl b/apple/apple_binary.bzl index 729b1d9a12..d623ee726f 100644 --- a/apple/apple_binary.bzl +++ b/apple/apple_binary.bzl @@ -116,10 +116,10 @@ Resolved Xcode is version {xcode_version}. # so that bundles can use it as their loader. if binary_type == "executable": providers.append( - apple_common.new_executable_binary_provider( + linking_support.new_executable_binary_provider( + binary = binary_artifact, cc_info = link_result.cc_info, objc = link_result.objc, - binary = binary_artifact, ), ) diff --git a/apple/internal/apple_framework_import.bzl b/apple/internal/apple_framework_import.bzl index a559e84f82..4a93dd9007 100644 --- a/apple/internal/apple_framework_import.bzl +++ b/apple/internal/apple_framework_import.bzl @@ -289,7 +289,7 @@ def _apple_dynamic_framework_import_impl(ctx): # Create AppleDynamicFramework provider. framework_groups = _grouped_framework_files(framework_imports) framework_dirs_set = depset(framework_groups.keys()) - providers.append(apple_common.new_dynamic_framework_provider( + providers.append(framework_import_support.new_dynamic_framework_provider( objc = objc_provider, cc_info = cc_info, framework_dirs = framework_dirs_set, diff --git a/apple/internal/apple_xcframework_import.bzl b/apple/internal/apple_xcframework_import.bzl index c4fd1ce249..b9466c5593 100644 --- a/apple/internal/apple_xcframework_import.bzl +++ b/apple/internal/apple_xcframework_import.bzl @@ -528,7 +528,7 @@ def _apple_dynamic_xcframework_import_impl(ctx): providers.append(cc_info) # Create AppleDynamicFrameworkInfo provider - apple_dynamic_framework_info = apple_common.new_dynamic_framework_provider( + apple_dynamic_framework_info = framework_import_support.new_dynamic_framework_provider( objc = objc_provider, cc_info = cc_info, ) diff --git a/apple/internal/framework_import_support.bzl b/apple/internal/framework_import_support.bzl index 79f369a2ff..7054c39862 100644 --- a/apple/internal/framework_import_support.bzl +++ b/apple/internal/framework_import_support.bzl @@ -26,6 +26,9 @@ load( ) load("@bazel_skylib//lib:paths.bzl", "paths") +# TODO: Remove once we drop bazel 7.x +_OBJC_PROVIDER_LINKING = hasattr(apple_common.new_objc_provider(), "linkopt") + def _cc_info_with_dependencies( *, actions, @@ -457,8 +460,30 @@ def _objc_provider_with_dependencies( objc_provider_fields["weak_sdk_framework"] = depset(weak_sdk_framework) objc_provider_fields.update(**additional_objc_provider_fields) + if not _OBJC_PROVIDER_LINKING: + objc_provider_fields = {"providers": additional_objc_providers} + return apple_common.new_objc_provider(**objc_provider_fields) +def _new_dynamic_framework_provider(*, cc_info, **kwargs): + """A wrapper API for the Bazel API of the same name to better support multiple Bazel versions + + Args: + cc_info: CcInfo provider for the dynamic framework. + **kwargs: Additional arguments to pass if supported. + """ + + test_provider = apple_common.new_dynamic_framework_provider( + cc_info = cc_info, + ) + + processed_args = {"cc_info": cc_info} + for key, value in kwargs.items(): + if hasattr(test_provider, key): + processed_args[key] = value + + return apple_common.new_dynamic_framework_provider(**processed_args) + def _swift_info_from_module_interface( *, actions, @@ -530,6 +555,7 @@ framework_import_support = struct( framework_import_info_with_dependencies = _framework_import_info_with_dependencies, get_swift_module_files_with_target_triplet = _get_swift_module_files_with_target_triplet, has_versioned_framework_files = _has_versioned_framework_files, + new_dynamic_framework_provider = _new_dynamic_framework_provider, objc_provider_with_dependencies = _objc_provider_with_dependencies, swift_info_from_module_interface = _swift_info_from_module_interface, swift_interop_info_with_dependencies = _swift_interop_info_with_dependencies, diff --git a/apple/internal/ios_rules.bzl b/apple/internal/ios_rules.bzl index 51b30f5091..20d23dbaa9 100644 --- a/apple/internal/ios_rules.bzl +++ b/apple/internal/ios_rules.bzl @@ -494,7 +494,7 @@ def _ios_application_impl(ctx): processor_result.output_groups, ) ), - apple_common.new_executable_binary_provider( + linking_support.new_executable_binary_provider( binary = binary_artifact, cc_info = link_result.cc_info, objc = link_result.objc, @@ -785,7 +785,7 @@ def _ios_app_clip_impl(ctx): processor_result.output_groups, ) ), - apple_common.new_executable_binary_provider( + linking_support.new_executable_binary_provider( binary = binary_artifact, cc_info = link_result.cc_info, objc = link_result.objc, @@ -1327,8 +1327,9 @@ def _ios_extension_impl(ctx): DefaultInfo( files = processor_result.output_files, ), - apple_common.new_executable_binary_provider( + linking_support.new_executable_binary_provider( binary = binary_artifact, + cc_info = link_result.cc_info, objc = link_result.objc, ), new_iosextensionbundleinfo(), diff --git a/apple/internal/linking_support.bzl b/apple/internal/linking_support.bzl index bfdb8e2b36..2d4e5f30b8 100644 --- a/apple/internal/linking_support.bzl +++ b/apple/internal/linking_support.bzl @@ -24,6 +24,9 @@ load( "cc_toolchain_info_support", ) +# TODO: Remove once we drop bazel 7.x +_OBJC_PROVIDER_LINKING = hasattr(apple_common.new_objc_provider(), "linkopt") + def _debug_outputs_by_architecture(link_outputs): """Returns debug outputs indexed by architecture from `register_binary_linking_action` output. @@ -51,6 +54,26 @@ def _debug_outputs_by_architecture(link_outputs): linkmaps = linkmaps, ) +def _new_executable_binary_provider(*, binary, cc_info, objc): + """Wrap the apple_common API of the same name to better support multiple Bazel versions. + + Args: + binary: The `File` representing the binary. + cc_info: The `CcInfo` provider for the binary. + objc: The `apple_common.Objc` provider for the binary. + """ + if _OBJC_PROVIDER_LINKING: + return apple_common.new_executable_binary_provider( + binary = binary, + cc_info = cc_info, + objc = objc, + ) + else: + return apple_common.new_executable_binary_provider( + binary = binary, + cc_info = cc_info, + ) + def _sectcreate_objc_provider(label, segname, sectname, file): """Returns an objc provider that propagates a section in a linked binary. @@ -444,6 +467,7 @@ linking_support = struct( debug_outputs_by_architecture = _debug_outputs_by_architecture, link_multi_arch_binary = _link_multi_arch_binary, lipo_or_symlink_inputs = _lipo_or_symlink_inputs, + new_executable_binary_provider = _new_executable_binary_provider, register_binary_linking_action = _register_binary_linking_action, register_static_library_linking_action = _register_static_library_linking_action, sectcreate_objc_provider = _sectcreate_objc_provider, diff --git a/apple/internal/macos_rules.bzl b/apple/internal/macos_rules.bzl index 1947f1abf6..a549e0e823 100644 --- a/apple/internal/macos_rules.bzl +++ b/apple/internal/macos_rules.bzl @@ -435,7 +435,7 @@ def _macos_application_impl(ctx): processor_result.output_groups, ) ), - apple_common.new_executable_binary_provider( + linking_support.new_executable_binary_provider( binary = binary_artifact, cc_info = link_result.cc_info, objc = link_result.objc, @@ -930,8 +930,9 @@ def _macos_extension_impl(ctx): DefaultInfo( files = processor_result.output_files, ), - apple_common.new_executable_binary_provider( + linking_support.new_executable_binary_provider( binary = binary_artifact, + cc_info = link_result.cc_info, objc = link_result.objc, ), new_macosextensionbundleinfo(), @@ -2024,8 +2025,8 @@ def _macos_command_line_application_impl(ctx): processor_result.output_groups, ) ), - apple_common.new_executable_binary_provider( - binary = output_file, + linking_support.new_executable_binary_provider( + binary = binary_artifact, cc_info = link_result.cc_info, objc = link_result.objc, ), diff --git a/apple/internal/partials/framework_provider.bzl b/apple/internal/partials/framework_provider.bzl index 8cfecacccc..1af62e7f1a 100644 --- a/apple/internal/partials/framework_provider.bzl +++ b/apple/internal/partials/framework_provider.bzl @@ -22,6 +22,10 @@ load( "@bazel_skylib//lib:paths.bzl", "paths", ) +load( + "@build_bazel_rules_apple//apple/internal:framework_import_support.bzl", + "framework_import_support", +) def _framework_provider_partial_impl( *, @@ -84,7 +88,7 @@ def _framework_provider_partial_impl( ], ) - framework_provider = apple_common.new_dynamic_framework_provider( + framework_provider = framework_import_support.new_dynamic_framework_provider( binary = binary_artifact, cc_info = wrapper_cc_info, framework_dirs = depset([absolute_framework_dir]), diff --git a/apple/internal/tvos_rules.bzl b/apple/internal/tvos_rules.bzl index 8a755c86ef..eb0cdfb0fe 100644 --- a/apple/internal/tvos_rules.bzl +++ b/apple/internal/tvos_rules.bzl @@ -430,7 +430,7 @@ def _tvos_application_impl(ctx): ) ), new_tvosapplicationbundleinfo(), - apple_common.new_executable_binary_provider( + linking_support.new_executable_binary_provider( binary = binary_artifact, cc_info = link_result.cc_info, objc = link_result.objc, diff --git a/apple/internal/visionos_rules.bzl b/apple/internal/visionos_rules.bzl index f3781c595c..a904f9d254 100644 --- a/apple/internal/visionos_rules.bzl +++ b/apple/internal/visionos_rules.bzl @@ -432,7 +432,7 @@ Resolved Xcode is version {xcode_version}. ) ), new_visionosapplicationbundleinfo(), - apple_common.new_executable_binary_provider( + linking_support.new_executable_binary_provider( binary = binary_artifact, cc_info = link_result.cc_info, objc = link_result.objc, @@ -1240,8 +1240,9 @@ def _visionos_extension_impl(ctx): processor_result.output_groups, ) ), - apple_common.new_executable_binary_provider( + linking_support.new_executable_binary_provider( binary = binary_artifact, + cc_info = link_result.cc_info, objc = link_result.objc, ), new_visionosextensionbundleinfo(), From 485c90fe60ac76c5cf78d6c8622f00ab5269780a Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 8 Jan 2024 14:51:49 -0800 Subject: [PATCH 2/4] another --- apple/internal/framework_import_support.bzl | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/apple/internal/framework_import_support.bzl b/apple/internal/framework_import_support.bzl index 7054c39862..4f0e8a9430 100644 --- a/apple/internal/framework_import_support.bzl +++ b/apple/internal/framework_import_support.bzl @@ -465,24 +465,17 @@ def _objc_provider_with_dependencies( return apple_common.new_objc_provider(**objc_provider_fields) -def _new_dynamic_framework_provider(*, cc_info, **kwargs): +def _new_dynamic_framework_provider(**kwargs): """A wrapper API for the Bazel API of the same name to better support multiple Bazel versions Args: cc_info: CcInfo provider for the dynamic framework. **kwargs: Additional arguments to pass if supported. """ + if not _OBJC_PROVIDER_LINKING: + kwargs.pop("objc", None) - test_provider = apple_common.new_dynamic_framework_provider( - cc_info = cc_info, - ) - - processed_args = {"cc_info": cc_info} - for key, value in kwargs.items(): - if hasattr(test_provider, key): - processed_args[key] = value - - return apple_common.new_dynamic_framework_provider(**processed_args) + return apple_common.new_dynamic_framework_provider(**kwargs) def _swift_info_from_module_interface( *, From 1b0c6ebe5dfed3b04bacbdcd67d855fb02f94ca6 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 8 Jan 2024 14:55:13 -0800 Subject: [PATCH 3/4] bzl_library dep --- apple/internal/partials/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/apple/internal/partials/BUILD b/apple/internal/partials/BUILD index 554479be0e..2b41fda35e 100644 --- a/apple/internal/partials/BUILD +++ b/apple/internal/partials/BUILD @@ -206,6 +206,7 @@ bzl_library( "//apple/internal:__pkg__", ], deps = [ + "//apple/internal:framework_import_support", "@bazel_skylib//lib:partial", "@bazel_skylib//lib:paths", ], From 7a5bac6f7537e3ce04d8ef48b1cfde86f8f43999 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 8 Jan 2024 16:30:12 -0800 Subject: [PATCH 4/4] docs --- apple/internal/framework_import_support.bzl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apple/internal/framework_import_support.bzl b/apple/internal/framework_import_support.bzl index 4f0e8a9430..e787b94849 100644 --- a/apple/internal/framework_import_support.bzl +++ b/apple/internal/framework_import_support.bzl @@ -469,8 +469,7 @@ def _new_dynamic_framework_provider(**kwargs): """A wrapper API for the Bazel API of the same name to better support multiple Bazel versions Args: - cc_info: CcInfo provider for the dynamic framework. - **kwargs: Additional arguments to pass if supported. + **kwargs: Arguments to pass if supported. """ if not _OBJC_PROVIDER_LINKING: kwargs.pop("objc", None)