From 83af71baf0e704542330e79d38d5fd65669bd769 Mon Sep 17 00:00:00 2001 From: Luis Padron Date: Sun, 26 May 2024 16:36:25 -0400 Subject: [PATCH] Add support for macos in apple_*_xcframework rules --- apple/internal/resource_actions/plist.bzl | 11 ++++---- apple/internal/transition_support.bzl | 15 +++++++++-- apple/internal/xcframework_rules.bzl | 5 ++++ doc/rules-apple.md | 5 ++-- .../targets_under_test/apple/BUILD | 26 +++++++++++++++++++ 5 files changed, 53 insertions(+), 9 deletions(-) diff --git a/apple/internal/resource_actions/plist.bzl b/apple/internal/resource_actions/plist.bzl index 2095b23847..ae6816d3d6 100644 --- a/apple/internal/resource_actions/plist.bzl +++ b/apple/internal/resource_actions/plist.bzl @@ -341,19 +341,20 @@ def merge_root_infoplists( else: plist_key = "MinimumOSVersion" - input_files.append(environment_plist) platform = platform_prerequisites.platform sdk_version = platform_prerequisites.sdk_version platform_with_version = platform.name_in_plist.lower() + str(sdk_version) - forced_plists.extend([ - environment_plist.path, + if environment_plist: + input_files.append(environment_plist) + forced_plists.append(environment_plist.path) + forced_plists.append( struct( CFBundleSupportedPlatforms = [platform.name_in_plist], DTPlatformName = platform.name_in_plist.lower(), DTSDKName = platform_with_version, **{plist_key: platform_prerequisites.minimum_deployment_os} - ), - ]) + ) + ) output_files = [output_plist] if output_pkginfo: diff --git a/apple/internal/transition_support.bzl b/apple/internal/transition_support.bzl index 113f23255a..398f67a5da 100644 --- a/apple/internal/transition_support.bzl +++ b/apple/internal/transition_support.bzl @@ -41,6 +41,10 @@ load( "@build_bazel_rules_apple//apple/build_settings:build_settings.bzl", "build_settings_labels", ) +load( + "@bazel_skylib//lib:types.bzl", + "types", +) _supports_visionos = hasattr(apple_common.platform_type, "visionos") _is_bazel_7 = not hasattr(apple_common, "apple_crosstool_transition") @@ -346,9 +350,16 @@ def _command_line_options_for_xcframework_platform( """ output_dictionary = {} for target_environment in target_environments: - if not platform_attr.get(target_environment): + is_platform_attr_dict = types.is_dict(platform_attr) + + if is_platform_attr_dict and not platform_attr.get(target_environment): continue - for arch in platform_attr[target_environment]: + elif is_platform_attr_dict: + platform_attr = platform_attr[target_environment] + else: + platform_attr = platform_attr + + for arch in platform_attr: resolved_environment_arch = _resolved_environment_arch_for_arch( arch = arch, environment = target_environment, diff --git a/apple/internal/xcframework_rules.bzl b/apple/internal/xcframework_rules.bzl index 4d053c441c..1558972e1a 100644 --- a/apple/internal/xcframework_rules.bzl +++ b/apple/internal/xcframework_rules.bzl @@ -864,6 +864,11 @@ built for those platform variants (for example, `x86_64`, `arm64`) as their valu A dictionary of strings indicating which platform variants should be built for the tvOS platform ( `device` or `simulator`) as keys, and arrays of strings listing which architectures should be built for those platform variants (for example, `x86_64`, `arm64`) as their values. +""", + ), + "macos": attr.string_list( + doc = """ +A list of strings indicating which architecture should be built for the macOS platform (for example, `x86_64`, `arm64`). """, ), "minimum_deployment_os_versions": attr.string_dict( diff --git a/doc/rules-apple.md b/doc/rules-apple.md index b9849012df..bd89fb5a6d 100755 --- a/doc/rules-apple.md +++ b/doc/rules-apple.md @@ -279,7 +279,7 @@ The `lipo` tool is used to combine built binaries of multiple architectures.
 apple_xcframework(name, deps, data, additional_linker_inputs, bundle_id, bundle_name,
                   codesign_inputs, codesignopts, exported_symbols_lists, extension_safe,
-                  families_required, infoplists, ios, linkopts, minimum_deployment_os_versions,
+                  families_required, infoplists, ios, linkopts, macos, minimum_deployment_os_versions,
                   minimum_os_versions, public_hdrs, stamp, tvos, umbrella_header, version)
 
@@ -304,6 +304,7 @@ Builds and bundles an XCFramework for third-party distribution. | infoplists | A list of .plist files that will be merged to form the Info.plist for each of the embedded frameworks. At least one file must be specified. Please see [Info.plist Handling](https://github.com/bazelbuild/rules_apple/blob/master/doc/common_info.md#infoplist-handling) for what is supported. | List of labels | required | | | ios | A dictionary of strings indicating which platform variants should be built for the iOS platform ( `device` or `simulator`) as keys, and arrays of strings listing which architectures should be built for those platform variants (for example, `x86_64`, `arm64`) as their values. | Dictionary: String -> List of strings | optional | `{}` | | linkopts | A list of strings representing extra flags that should be passed to the linker. | List of strings | optional | `[]` | +| macos | A list of strings indicating which architecture should be built for the macOS platform (for example, `x86_64`, `arm64`). | List of strings | optional | `[]` | | minimum_deployment_os_versions | A dictionary of strings indicating the minimum deployment OS version supported by the target, represented as a dotted version number (for example, "9.0") as values, with their respective platforms such as `ios` as keys. This is different from `minimum_os_versions`, which is effective at compile time. Ensure version specific APIs are guarded with `available` clauses. | Dictionary: String -> String | optional | `{}` | | minimum_os_versions | A dictionary of strings indicating the minimum OS version supported by the target, represented as a dotted version number (for example, "8.0") as values, with their respective platforms such as `ios`, or `tvos` as keys:

minimum_os_versions = { "ios": "13.0", "tvos": "15.0", } | Dictionary: String -> String | required | | | public_hdrs | A list of files directly referencing header files to be used as the publicly visible interface for each of these embedded frameworks. These header files will be embedded within each bundle, typically in a subdirectory such as `Headers`. | List of labels | optional | `[]` | @@ -488,7 +489,7 @@ This repository rule depends on the following environment variables: ## provisioning_profile_repository_extension
-provisioning_profile_repository_extension = use_extension("@rules_apple//apple:apple.bzl", "provisioning_profile_repository_extension")
+provisioning_profile_repository_extension = use_extension("@build_bazel_rules_apple//apple:apple.bzl", "provisioning_profile_repository_extension")
 provisioning_profile_repository_extension.setup(fallback_profiles)
 
diff --git a/test/starlark_tests/targets_under_test/apple/BUILD b/test/starlark_tests/targets_under_test/apple/BUILD index b32a5ef42c..000fdff83f 100644 --- a/test/starlark_tests/targets_under_test/apple/BUILD +++ b/test/starlark_tests/targets_under_test/apple/BUILD @@ -1530,3 +1530,29 @@ apple_metal_library( hdrs = ["@build_bazel_rules_apple//test/testdata/resources:metal_hdrs"], tags = common.fixture_tags, ) + +apple_xcframework( + name = "ios_and_macos_dynamic_xcframework", + bundle_id = "com.google.example", + extension_safe = True, + infoplists = [ + "//test/starlark_tests/resources:Info.plist", + ], + ios = { + "simulator": ["x86_64"], + "device": ["arm64"], + }, + macos = [ + "arm64", + "x86_64", + ], + minimum_os_versions = { + "ios": common.min_os_ios.baseline, + "macos": common.min_os_macos.baseline, + }, + public_hdrs = [ + "//test/starlark_tests/resources:shared.h", + ], + tags = common.fixture_tags, + deps = [":fmwk_lib"], +)