From cb8bc68c418a58af8e7ee50356e30f0e11e1e6a7 Mon Sep 17 00:00:00 2001 From: Sarad Date: Fri, 19 Dec 2025 23:09:29 -0500 Subject: [PATCH 01/15] Upgrade to Bazel 8 --- .bazelrc | 2 -- .bazelversion | 2 +- .bcr/presubmit.yml | 10 +++++- .github/workflows/tests.yml | 12 +++---- MODULE.bazel | 8 ++--- README.md | 17 +++++++++ rules/import_middleman.bzl | 12 +++---- rules/internal/framework_middleman.bzl | 49 ++++++++++++++------------ rules/internal/objc_provider_utils.bzl | 41 +++++++++------------ 9 files changed, 85 insertions(+), 68 deletions(-) diff --git a/.bazelrc b/.bazelrc index bff0e9eb..adaf2fca 100644 --- a/.bazelrc +++ b/.bazelrc @@ -7,8 +7,6 @@ build --spawn_strategy=local # Setup Xcode configuration. build --xcode_version_config=//:host_xcodes -build --experimental_strict_conflict_checks - build --verbose_failures # Print the full command line for commands that failed build --test_output=errors # Prints log file output to the console on failure diff --git a/.bazelversion b/.bazelversion index a3fcc712..a2f28f43 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -7.1.0 +8.4.0 diff --git a/.bcr/presubmit.yml b/.bcr/presubmit.yml index 92aeb2f6..791561e8 100644 --- a/.bcr/presubmit.yml +++ b/.bcr/presubmit.yml @@ -1,5 +1,5 @@ matrix: - bazel: ["7.x"] + bazel: ["7.x", "8.x"] tasks: verify_build_targets_bazel_7: name: Verify Build targets on macOS with Bazel 7 @@ -9,3 +9,11 @@ tasks: - "@rules_ios//rules/..." build_flags: - "--repo_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1" + verify_build_targets_bazel_8: + name: Verify Build targets on macOS with Bazel 8 + platform: macos_arm64 + bazel: 8.x + build_targets: + - "@rules_ios//rules/..." + build_flags: + - "--repo_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e80ff1f6..0817d88c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - bazel_version: [7.1.0] + bazel_version: [7.1.0, 8.4.0] xcode_version: [15.2] virtual_frameworks: [true, false] sandbox: [true, false] @@ -28,8 +28,8 @@ jobs: env: XCODE_VERSION: ${{ matrix.xcode_version }} USE_BAZEL_VERSION: ${{ matrix.bazel_version }} - LATEST_RULES_SWIFT_VERSION: 3.0.2 - LATEST_RULES_APPLE_VERSION: 4.0.1 + LATEST_RULES_SWIFT_VERSION: 3.4.1 + LATEST_RULES_APPLE_VERSION: 4.3.3 GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v4 @@ -85,7 +85,7 @@ jobs: strategy: fail-fast: false matrix: - bazel_version: [7.1.0] + bazel_version: [7.1.0, 8.4.0] sandbox: [true, false] xcode_version: [15.2] env: @@ -131,7 +131,7 @@ jobs: strategy: fail-fast: false matrix: - bazel_version: [7.1.0] # Only run on latest Bazel version as stardoc changes between versions and produces different results + bazel_version: [8.4.0] # Only run on latest Bazel version as stardoc changes between versions and produces different results xcode_version: [15.2] env: XCODE_VERSION: ${{ matrix.xcode_version }} @@ -164,7 +164,7 @@ jobs: strategy: fail-fast: false matrix: - bazel_version: [7.1.0] + bazel_version: [7.1.0, 8.4.0] xcode_version: [15.2] env: XCODE_VERSION: ${{ matrix.xcode_version }} diff --git a/MODULE.bazel b/MODULE.bazel index f91016e6..944e2c7d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -8,7 +8,7 @@ module( name = "rules_ios", version = "0", bazel_compatibility = [ - ">=7.0.0", + ">=7.0.0", # Support both Bazel 7.x and 8.x ], compatibility_level = 1, repo_name = "build_bazel_rules_ios", @@ -17,12 +17,12 @@ module( # Declare the bzlmod dependencies needed by rules_ios and users of rules_ios bazel_dep( name = "apple_support", - version = "1.15.1", + version = "2.0.0", repo_name = "build_bazel_apple_support", ) bazel_dep( name = "rules_apple", - version = "4.0.1", + version = "4.3.3", repo_name = "build_bazel_rules_apple", ) bazel_dep( @@ -31,7 +31,7 @@ bazel_dep( ) bazel_dep( name = "rules_swift", - version = "3.0.2", + version = "3.4.1", max_compatibility_level = 3, repo_name = "build_bazel_rules_swift", ) diff --git a/README.md b/README.md index 19902fe7..88d652a9 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ See the following table for supported release versions. | Bazel release | Minimum supported rules version | Final supported rules version |:-------------------:|:-------------------------:|:-------------------------: +| 8.* | 6.0.0 | current | 7.* | 4.4.0 | current | 6.* | 2.0.0 | 5.3.0 | 5.* | 1.0.0 | 3.2.2 @@ -44,11 +45,27 @@ See the following table for supported rules_apple release versions. | rules_apple release | Minimum supported rules version | Final supported rules version |:-------------------:|:-------------------------:|:-------------------------: +| 4.3.3 | 6.0.0 | current | 3.15.0 | 5.3.0 | current | 3.* | 3.* | 4.2.1 | 2.* | 2.* | 3.2.2 | 1.* | 1.0.0 | 3.2.2 +## Migrating to Bazel 8 + +rules_ios 6.0.0+ supports Bazel 8.x. To migrate from Bazel 7.x to 8.x: + +1. Update your `.bazelversion` file to `8.4.0` (or later) +2. Update `rules_ios` to version `6.0.0` or later in your `MODULE.bazel` +3. No code changes required - all deprecated APIs were already migrated in previous releases + +The following dependencies are automatically updated when you upgrade rules_ios: +- `apple_support`: 2.0.0+ +- `rules_apple`: 4.3.3+ +- `rules_swift`: 3.4.1+ + +Both Bazel 7.x and 8.x are supported during the transition period. We recommend staying on Bazel 7.x until you're ready to migrate your entire project. + ## Getting started ### Bzlmod setup diff --git a/rules/import_middleman.bzl b/rules/import_middleman.bzl index f76c086f..dee19e55 100644 --- a/rules/import_middleman.bzl +++ b/rules/import_middleman.bzl @@ -179,15 +179,13 @@ def _file_collector_rule_impl(ctx): # This should be correctly configured upstream: see setup in rules_ios fail("using import_middleman ({}) on wrong transition ({},{},is_device={})".format(ctx.attr.name, platform, arch, ctx.fragments.apple.single_arch_platform.is_device)) + # Most linking fields removed from ObjcInfo in Bazel 8 / rules_apple 4.x + # Linking is now handled exclusively through CcInfo merge_keys = [ - "sdk_dylib", - "sdk_framework", - "weak_sdk_framework", - "force_load_library", "source", - "link_inputs", - "linkopt", - "library", + # Removed fields (no longer available in ObjcInfo): + # "sdk_dylib", "sdk_framework", "weak_sdk_framework", + # "force_load_library", "link_inputs", "linkopt", "library" ] objc_provider_fields = objc_provider_utils.merge_objc_providers_dict( diff --git a/rules/internal/framework_middleman.bzl b/rules/internal/framework_middleman.bzl index b8fa1673..fc2c4828 100644 --- a/rules/internal/framework_middleman.bzl +++ b/rules/internal/framework_middleman.bzl @@ -64,9 +64,11 @@ def _framework_middleman(ctx): resource_providers.append(lib_dep[AppleResourceInfo]) if apple_common.Objc in lib_dep: objc_providers.append(lib_dep[apple_common.Objc]) - if apple_common.AppleDynamicFramework in lib_dep: - dynamic_frameworks.append(lib_dep) - dynamic_framework_providers.append(lib_dep[apple_common.AppleDynamicFramework]) + # AppleDynamicFramework provider removed in Bazel 8 / rules_apple 4.x + # This was only needed for Bazel <= 6 + # if apple_common.AppleDynamicFramework in lib_dep: + # dynamic_frameworks.append(lib_dep) + # dynamic_framework_providers.append(lib_dep[apple_common.AppleDynamicFramework]) for dep in ctx.attr.framework_deps: _process_dep(dep) @@ -77,15 +79,17 @@ def _framework_middleman(ctx): _process_dep(lib_dep) # Here we only need to loop a subset of the keys + # dynamic_framework_file removed in Bazel 8 / rules_apple 4.x - this was only for Bazel <= 6 objc_provider_fields = objc_provider_utils.merge_objc_providers_dict(providers = objc_providers, merge_keys = [ - "dynamic_framework_file", + # "dynamic_framework_file", # removed in Bazel 8 ]) # Add the frameworks to the objc provider for Bazel <= 6 + # dynamic_framework_file removed in Bazel 8 / rules_apple 4.x dynamic_framework_provider = objc_provider_utils.merge_dynamic_framework_providers(dynamic_framework_providers) - objc_provider_fields["dynamic_framework_file"] = depset( - transitive = [dynamic_framework_provider.framework_files, objc_provider_fields.get("dynamic_framework_file", depset([]))], - ) + # objc_provider_fields["dynamic_framework_file"] = depset( + # transitive = [dynamic_framework_provider.framework_files, objc_provider_fields.get("dynamic_framework_file", depset([]))], + # ) objc_provider = apple_common.new_objc_provider(**objc_provider_fields) # Add the framework info to the cc info linking context for Bazel >= 7 @@ -242,8 +246,9 @@ def _dep_middleman(ctx): if apple_common.Objc in dep: for lib in dep[apple_common.Objc].library.to_list(): avoid_libraries[lib] = True - for lib in dep[apple_common.Objc].force_load_library.to_list(): - avoid_libraries[lib] = True + # force_load_library removed in Bazel 8 / rules_apple 4.x + # for lib in dep[apple_common.Objc].force_load_library.to_list(): + # avoid_libraries[lib] = True for lib in dep[apple_common.Objc].imported_library.to_list(): avoid_libraries[lib.basename] = True for lib in dep[apple_common.Objc].static_framework_file.to_list(): @@ -263,25 +268,23 @@ def _dep_middleman(ctx): for lib_dep in dep[AvoidDepsInfo].libraries: _collect_providers(lib_dep) - # Construct & merge the ObjcProvider, the linking information is only used in Bazel <= 6 + # Construct & merge the ObjcProvider + # Most linking fields removed from ObjcInfo in Bazel 8 / rules_apple 4.x + # Linking is now handled exclusively through CcInfo objc_provider_fields = objc_provider_utils.merge_objc_providers_dict(providers = objc_providers, merge_keys = [ - "force_load_library", - "imported_library", - "library", - "link_inputs", - "linkopt", - "sdk_dylib", - "sdk_framework", "source", - "static_framework_file", - "weak_sdk_framework", + # Removed fields (no longer available in ObjcInfo): + # "imported_library", "library", "link_inputs", "linkopt", + # "sdk_dylib", "sdk_framework", "weak_sdk_framework", + # "static_framework_file", "force_load_library" ]) # Ensure to strip out static link inputs - _dedupe_key("library", avoid_libraries, objc_provider_fields) - _dedupe_key("force_load_library", avoid_libraries, objc_provider_fields) - _dedupe_key("imported_library", avoid_libraries, objc_provider_fields, check_name = True) - _dedupe_key("static_framework_file", avoid_libraries, objc_provider_fields, check_name = True) + # These fields no longer exist in ObjcInfo in Bazel 8 / rules_apple 4.x + # _dedupe_key("library", avoid_libraries, objc_provider_fields) + # _dedupe_key("force_load_library", avoid_libraries, objc_provider_fields) + # _dedupe_key("imported_library", avoid_libraries, objc_provider_fields, check_name = True) + # _dedupe_key("static_framework_file", avoid_libraries, objc_provider_fields, check_name = True) if "sdk_dylib" in objc_provider_fields: # Put sdk_dylib at _end_ of the linker invocation. Apple's linkers have diff --git a/rules/internal/objc_provider_utils.bzl b/rules/internal/objc_provider_utils.bzl index 2fa7cfeb..ce88b428 100644 --- a/rules/internal/objc_provider_utils.bzl +++ b/rules/internal/objc_provider_utils.bzl @@ -3,15 +3,14 @@ def _add_to_dict_if_present(dict, key, value): dict[key] = value objc_merge_keys = [ - "sdk_dylib", - "sdk_framework", - "weak_sdk_framework", - "imported_library", - "force_load_library", + # Most linking-related fields removed from ObjcInfo in Bazel 8 / rules_apple 4.x + # Linking is now handled exclusively through CcInfo + # Only source-related fields remain in ObjcInfo "source", - "link_inputs", - "linkopt", - "library", + # Removed fields (no longer available in ObjcInfo): + # "sdk_dylib", "sdk_framework", "weak_sdk_framework", + # "imported_library", "force_load_library", + # "link_inputs", "linkopt", "library" ] def _merge_objc_providers_dict(providers, transitive = [], merge_keys = objc_merge_keys): @@ -38,23 +37,17 @@ def _merge_objc_providers(providers, transitive = []): return apple_common.new_objc_provider(**objc_provider_fields) def _merge_dynamic_framework_providers(dynamic_framework_providers): - fields = {} - merge_keys = [ - "framework_dirs", - "framework_files", - ] - for key in merge_keys: - set = depset( - direct = [], - # Note: we may want to merge this with the below inputs? - transitive = [getattr(dep, key) for dep in dynamic_framework_providers], - ) - _add_to_dict_if_present(fields, key, set) + # AppleDynamicFramework provider removed in Bazel 8 / rules_apple 4.x + # Return a mock struct with empty framework_files for backwards compatibility + # This was only used for Bazel <= 6 + if len(dynamic_framework_providers) > 0: + fail("AppleDynamicFramework provider no longer exists in Bazel 8") - fields["objc"] = apple_common.new_objc_provider() - fields["cc_info"] = CcInfo() - - return apple_common.new_dynamic_framework_provider(**fields) + return struct( + framework_dirs = depset([]), + framework_files = depset([]), + objc = apple_common.new_objc_provider(), + ) objc_provider_utils = struct( merge_objc_providers_dict = _merge_objc_providers_dict, From 58b17e1395532918cad273f930f91040adb1e6b2 Mon Sep 17 00:00:00 2001 From: Sarad Date: Fri, 19 Dec 2025 23:27:23 -0500 Subject: [PATCH 02/15] Add Xcode 16.2, ObjCInfo changes, j2objc --- BUILD.bazel | 22 +++++++++++++-- rules/framework.bzl | 2 +- rules/hmap.bzl | 2 +- rules/import_middleman.bzl | 27 ++++++++++++++++--- rules/internal/framework_middleman.bzl | 5 +++- .../mixed-source/only-source/BUILD.bazel | 1 - tests/ios/frameworks/objc/BUILD.bazel | 1 - tests/ios/frameworks/testonly/BUILD.bazel | 1 - 8 files changed, 49 insertions(+), 12 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index f5194203..87505dce 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -150,19 +150,37 @@ xcode_version( version = "15.2.0.15C500b", ) +xcode_version( + name = "version16_2_0_16C5032a", + aliases = [ + "16.2", + "16.2.0", + "16.2.0.16C5032a", + "16C5032a", + ], + default_ios_sdk_version = "18.2", + default_macos_sdk_version = "15.2", + default_tvos_sdk_version = "18.2", + default_visionos_sdk_version = "2.2", + default_watchos_sdk_version = "11.2", + version = "16.2.0.16C5032a", +) + xcode_config( name = "host_xcodes", - default = ":version15_2_0_15C500b", + default = ":version16_2_0_16C5032a", versions = [ ":version15_2_0_15C500b", + ":version16_2_0_16C5032a", ], visibility = ["//visibility:public"], ) available_xcodes( name = "host_available_xcodes", - default = ":version15_2_0_15C500b", + default = ":version16_2_0_16C5032a", versions = [ ":version15_2_0_15C500b", + ":version16_2_0_16C5032a", ], ) diff --git a/rules/framework.bzl b/rules/framework.bzl index e36c27de..be634b0b 100644 --- a/rules/framework.bzl +++ b/rules/framework.bzl @@ -1169,7 +1169,7 @@ apple_framework_packaging = rule( implementation = _apple_framework_packaging_impl, toolchains = use_cpp_toolchain(), cfg = transition_support.apple_rule_transition, - fragments = ["apple", "cpp", "objc"], + fragments = ["apple", "cpp", "objc", "j2objc"], output_to_genfiles = True, attrs = { "framework_name": attr.string( diff --git a/rules/hmap.bzl b/rules/hmap.bzl index 8e26bb7b..714ba225 100644 --- a/rules/hmap.bzl +++ b/rules/hmap.bzl @@ -27,7 +27,7 @@ def _make_hmap(actions, headermap_builder, output, namespace, hdrs_lists): args.add("--output", output) for hdrs in hdrs_lists: - args.add_all(hdrs) + args.add_all(hdrs, expand_directories = False) args.set_param_file_format(format = "multiline") args.use_param_file("@%s") diff --git a/rules/import_middleman.bzl b/rules/import_middleman.bzl index dee19e55..3265b089 100644 --- a/rules/import_middleman.bzl +++ b/rules/import_middleman.bzl @@ -254,22 +254,41 @@ def _file_collector_rule_impl(ctx): ], ) - objc = apple_common.new_objc_provider( - **objc_provider_fields - ) + # Filter out fields that are no longer supported in Bazel 8 + if is_bazel_7: + # Remove linking fields that were deprecated in Bazel 8 + # Linking is now handled exclusively through CcInfo + objc_provider_fields_filtered = { + k: v for k, v in objc_provider_fields.items() + if k not in ["imported_library", "dynamic_framework_file", "linkopt", "link_inputs"] + } + objc = apple_common.new_objc_provider( + **objc_provider_fields_filtered + ) + else: + objc = apple_common.new_objc_provider( + **objc_provider_fields + ) dep_cc_infos = [dep[CcInfo] for dep in ctx.attr.deps if CcInfo in dep] cc_info = cc_common.merge_cc_infos(cc_infos = dep_cc_infos) if is_bazel_7: # Need to recreate linking_context for Bazel 7 or later # because of https://github.com/bazelbuild/bazel/issues/16939 + # Collect all user link flags + user_link_flags = [] + if len(all_replaced_frameworks): + # Add framework search paths for replaced frameworks + user_link_flags.extend(["\"\"\"-F" + "/".join(f.path.split("/")[:-2]) + "\"\"\"" for f in replaced_frameworks]) + user_link_flags.extend(compat_link_opt) + cc_info = CcInfo( compilation_context = cc_info.compilation_context, linking_context = cc_common.create_linking_context( linker_inputs = depset([ cc_common.create_linker_input( owner = ctx.label, - user_link_flags = compat_link_opt if len(all_replaced_frameworks) else [], + user_link_flags = user_link_flags, libraries = depset([ cc_common.create_library_to_link( actions = ctx.actions, diff --git a/rules/internal/framework_middleman.bzl b/rules/internal/framework_middleman.bzl index fc2c4828..bae592b6 100644 --- a/rules/internal/framework_middleman.bzl +++ b/rules/internal/framework_middleman.bzl @@ -33,6 +33,7 @@ load( "objc_provider_utils", ) load("//rules:transition_support.bzl", "transition_support") +load("//rules:utils.bzl", "is_bazel_7") def _framework_middleman(ctx): resource_providers = [] @@ -243,7 +244,9 @@ def _dep_middleman(ctx): def _process_avoid_deps(avoid_dep_libs): for dep in avoid_dep_libs: - if apple_common.Objc in dep: + # Linking fields removed from ObjcInfo in Bazel 8 / rules_apple 4.x + # All linking information is now in CcInfo + if not is_bazel_7 and apple_common.Objc in dep: for lib in dep[apple_common.Objc].library.to_list(): avoid_libraries[lib] = True # force_load_library removed in Bazel 8 / rules_apple 4.x diff --git a/tests/ios/frameworks/mixed-source/only-source/BUILD.bazel b/tests/ios/frameworks/mixed-source/only-source/BUILD.bazel index b87c3d12..5d117952 100644 --- a/tests/ios/frameworks/mixed-source/only-source/BUILD.bazel +++ b/tests/ios/frameworks/mixed-source/only-source/BUILD.bazel @@ -31,7 +31,6 @@ apple_framework( testonly = True, srcs = glob( [ - "MixedSourceTest/**/*.h", "MixedSourceTest/**/*.m", "MixedSourceTest/**/*.swift", ], diff --git a/tests/ios/frameworks/objc/BUILD.bazel b/tests/ios/frameworks/objc/BUILD.bazel index 76ad8209..92da129d 100644 --- a/tests/ios/frameworks/objc/BUILD.bazel +++ b/tests/ios/frameworks/objc/BUILD.bazel @@ -30,7 +30,6 @@ ios_unit_test( name = "ObjcFrameworkTests", srcs = glob( [ - "tests/**/*.h", "tests/**/*.m", ], ), diff --git a/tests/ios/frameworks/testonly/BUILD.bazel b/tests/ios/frameworks/testonly/BUILD.bazel index 182b87f5..6c132139 100644 --- a/tests/ios/frameworks/testonly/BUILD.bazel +++ b/tests/ios/frameworks/testonly/BUILD.bazel @@ -34,7 +34,6 @@ apple_framework( testonly = True, srcs = glob( [ - "MixedSourceTest/**/*.h", "MixedSourceTest/**/*.m", "MixedSourceTest/**/*.swift", ], From 84c8e4a5b7d651ed3929d0e9ae9db5e7f1ab4e04 Mon Sep 17 00:00:00 2001 From: Sarad Date: Fri, 19 Dec 2025 23:32:47 -0500 Subject: [PATCH 03/15] doc extensions --- rules/BUILD.bazel | 13 ++++++++++--- rules/internal/BUILD.bazel | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/rules/BUILD.bazel b/rules/BUILD.bazel index 803c4f4f..c02f6890 100644 --- a/rules/BUILD.bazel +++ b/rules/BUILD.bazel @@ -11,6 +11,12 @@ genrule( cmd = "touch $(OUTS)", ) +bzl_library( + name = "utils", + srcs = ["utils.bzl"], + visibility = ["//visibility:public"], +) + bzl_library( name = "providers", srcs = ["providers.bzl"], @@ -79,7 +85,7 @@ bzl_library( visibility = ["//visibility:public"], deps = [ ":transition_support", - ":utils.bzl", + ":utils", "@bazel_skylib//lib:partial", "@bazel_skylib//lib:paths", "@build_bazel_apple_support//lib:apple_support", @@ -93,7 +99,7 @@ bzl_library( visibility = ["//visibility:public"], deps = [ ":features", - "//rules:utils.bzl", + ":utils", "//rules/internal:objc_provider_utils", "@build_bazel_rules_apple//apple", ], @@ -107,7 +113,7 @@ bzl_library( ":hmap", ":import_middleman", ":precompiled_apple_resource_bundle", - ":utils.bzl", + ":utils", "//rules/framework:vfs_overlay", "//rules/library:resources", "//rules/library:xcconfig", @@ -132,6 +138,7 @@ bzl_library( ":plists", ":providers", ":transition_support", + ":utils", "//rules/framework:vfs_overlay", "//rules/internal:objc_provider_utils", "@bazel_skylib//lib:partial", diff --git a/rules/internal/BUILD.bazel b/rules/internal/BUILD.bazel index a356d6a6..15e58761 100644 --- a/rules/internal/BUILD.bazel +++ b/rules/internal/BUILD.bazel @@ -14,6 +14,7 @@ bzl_library( ":objc_provider_utils", "//rules:providers", "//rules:transition_support", + "//rules:utils", "@bazel_skylib//lib:dicts", "@bazel_skylib//lib:partial", "@build_bazel_rules_apple//apple", From dfdaf1d55362d4483a2c84d89412516567d05acd Mon Sep 17 00:00:00 2001 From: Sarad Date: Sat, 20 Dec 2025 00:47:39 -0500 Subject: [PATCH 04/15] Buildifier fix --- rules/import_middleman.bzl | 3 ++- rules/internal/framework_middleman.bzl | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/rules/import_middleman.bzl b/rules/import_middleman.bzl index 3265b089..f4048618 100644 --- a/rules/import_middleman.bzl +++ b/rules/import_middleman.bzl @@ -259,7 +259,8 @@ def _file_collector_rule_impl(ctx): # Remove linking fields that were deprecated in Bazel 8 # Linking is now handled exclusively through CcInfo objc_provider_fields_filtered = { - k: v for k, v in objc_provider_fields.items() + k: v + for k, v in objc_provider_fields.items() if k not in ["imported_library", "dynamic_framework_file", "linkopt", "link_inputs"] } objc = apple_common.new_objc_provider( diff --git a/rules/internal/framework_middleman.bzl b/rules/internal/framework_middleman.bzl index bae592b6..9d639874 100644 --- a/rules/internal/framework_middleman.bzl +++ b/rules/internal/framework_middleman.bzl @@ -65,6 +65,7 @@ def _framework_middleman(ctx): resource_providers.append(lib_dep[AppleResourceInfo]) if apple_common.Objc in lib_dep: objc_providers.append(lib_dep[apple_common.Objc]) + # AppleDynamicFramework provider removed in Bazel 8 / rules_apple 4.x # This was only needed for Bazel <= 6 # if apple_common.AppleDynamicFramework in lib_dep: @@ -88,6 +89,7 @@ def _framework_middleman(ctx): # Add the frameworks to the objc provider for Bazel <= 6 # dynamic_framework_file removed in Bazel 8 / rules_apple 4.x dynamic_framework_provider = objc_provider_utils.merge_dynamic_framework_providers(dynamic_framework_providers) + # objc_provider_fields["dynamic_framework_file"] = depset( # transitive = [dynamic_framework_provider.framework_files, objc_provider_fields.get("dynamic_framework_file", depset([]))], # ) @@ -249,6 +251,7 @@ def _dep_middleman(ctx): if not is_bazel_7 and apple_common.Objc in dep: for lib in dep[apple_common.Objc].library.to_list(): avoid_libraries[lib] = True + # force_load_library removed in Bazel 8 / rules_apple 4.x # for lib in dep[apple_common.Objc].force_load_library.to_list(): # avoid_libraries[lib] = True From d97701390dd601ece792d183744fed933e9b37e7 Mon Sep 17 00:00:00 2001 From: Sarad Date: Sat, 20 Dec 2025 00:53:22 -0500 Subject: [PATCH 05/15] Comments and cleanup --- rules/import_middleman.bzl | 9 +---- rules/internal/framework_middleman.bzl | 51 +++++++------------------- rules/internal/objc_provider_utils.bzl | 7 ---- 3 files changed, 15 insertions(+), 52 deletions(-) diff --git a/rules/import_middleman.bzl b/rules/import_middleman.bzl index f4048618..2a40f497 100644 --- a/rules/import_middleman.bzl +++ b/rules/import_middleman.bzl @@ -1,8 +1,8 @@ -load("//rules/internal:objc_provider_utils.bzl", "objc_provider_utils") -load("//rules:utils.bzl", "is_bazel_7") load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain", "use_cpp_toolchain") load("@build_bazel_rules_apple//apple/internal:bundling_support.bzl", "bundling_support") load("@build_bazel_rules_apple//apple/internal:providers.bzl", "AppleFrameworkImportInfo", "new_appleframeworkimportinfo") +load("//rules:utils.bzl", "is_bazel_7") +load("//rules/internal:objc_provider_utils.bzl", "objc_provider_utils") _FindImportsAspectInfo = provider(fields = { "imported_library_file": "", @@ -179,13 +179,8 @@ def _file_collector_rule_impl(ctx): # This should be correctly configured upstream: see setup in rules_ios fail("using import_middleman ({}) on wrong transition ({},{},is_device={})".format(ctx.attr.name, platform, arch, ctx.fragments.apple.single_arch_platform.is_device)) - # Most linking fields removed from ObjcInfo in Bazel 8 / rules_apple 4.x - # Linking is now handled exclusively through CcInfo merge_keys = [ "source", - # Removed fields (no longer available in ObjcInfo): - # "sdk_dylib", "sdk_framework", "weak_sdk_framework", - # "force_load_library", "link_inputs", "linkopt", "library" ] objc_provider_fields = objc_provider_utils.merge_objc_providers_dict( diff --git a/rules/internal/framework_middleman.bzl b/rules/internal/framework_middleman.bzl index 9d639874..b209e47e 100644 --- a/rules/internal/framework_middleman.bzl +++ b/rules/internal/framework_middleman.bzl @@ -1,5 +1,13 @@ load("@bazel_skylib//lib:partial.bzl", "partial") load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain", "use_cpp_toolchain") +load( + "@build_bazel_rules_apple//apple/internal:apple_product_type.bzl", + "apple_product_type", +) +load( + "@build_bazel_rules_apple//apple/internal:partials.bzl", + "partials", +) load( "@build_bazel_rules_apple//apple/internal:providers.bzl", "AppleResourceInfo", @@ -7,33 +15,25 @@ load( "new_applebundleinfo", "new_iosframeworkbundleinfo", ) -load( - "@build_bazel_rules_apple//apple/internal:partials.bzl", - "partials", -) load( "@build_bazel_rules_apple//apple/internal:resources.bzl", "resources", ) load( - "@build_bazel_rules_apple//apple/internal:apple_product_type.bzl", - "apple_product_type", + "@build_bazel_rules_apple//apple/internal/providers:embeddable_info.bzl", + "AppleEmbeddableInfo", + "embeddable_info", ) load( "//rules:providers.bzl", "AvoidDepsInfo", ) -load( - "@build_bazel_rules_apple//apple/internal/providers:embeddable_info.bzl", - "AppleEmbeddableInfo", - "embeddable_info", -) +load("//rules:transition_support.bzl", "transition_support") +load("//rules:utils.bzl", "is_bazel_7") load( "//rules/internal:objc_provider_utils.bzl", "objc_provider_utils", ) -load("//rules:transition_support.bzl", "transition_support") -load("//rules:utils.bzl", "is_bazel_7") def _framework_middleman(ctx): resource_providers = [] @@ -66,12 +66,6 @@ def _framework_middleman(ctx): if apple_common.Objc in lib_dep: objc_providers.append(lib_dep[apple_common.Objc]) - # AppleDynamicFramework provider removed in Bazel 8 / rules_apple 4.x - # This was only needed for Bazel <= 6 - # if apple_common.AppleDynamicFramework in lib_dep: - # dynamic_frameworks.append(lib_dep) - # dynamic_framework_providers.append(lib_dep[apple_common.AppleDynamicFramework]) - for dep in ctx.attr.framework_deps: _process_dep(dep) @@ -83,16 +77,12 @@ def _framework_middleman(ctx): # Here we only need to loop a subset of the keys # dynamic_framework_file removed in Bazel 8 / rules_apple 4.x - this was only for Bazel <= 6 objc_provider_fields = objc_provider_utils.merge_objc_providers_dict(providers = objc_providers, merge_keys = [ - # "dynamic_framework_file", # removed in Bazel 8 ]) # Add the frameworks to the objc provider for Bazel <= 6 # dynamic_framework_file removed in Bazel 8 / rules_apple 4.x dynamic_framework_provider = objc_provider_utils.merge_dynamic_framework_providers(dynamic_framework_providers) - # objc_provider_fields["dynamic_framework_file"] = depset( - # transitive = [dynamic_framework_provider.framework_files, objc_provider_fields.get("dynamic_framework_file", depset([]))], - # ) objc_provider = apple_common.new_objc_provider(**objc_provider_fields) # Add the framework info to the cc info linking context for Bazel >= 7 @@ -251,10 +241,6 @@ def _dep_middleman(ctx): if not is_bazel_7 and apple_common.Objc in dep: for lib in dep[apple_common.Objc].library.to_list(): avoid_libraries[lib] = True - - # force_load_library removed in Bazel 8 / rules_apple 4.x - # for lib in dep[apple_common.Objc].force_load_library.to_list(): - # avoid_libraries[lib] = True for lib in dep[apple_common.Objc].imported_library.to_list(): avoid_libraries[lib.basename] = True for lib in dep[apple_common.Objc].static_framework_file.to_list(): @@ -279,19 +265,8 @@ def _dep_middleman(ctx): # Linking is now handled exclusively through CcInfo objc_provider_fields = objc_provider_utils.merge_objc_providers_dict(providers = objc_providers, merge_keys = [ "source", - # Removed fields (no longer available in ObjcInfo): - # "imported_library", "library", "link_inputs", "linkopt", - # "sdk_dylib", "sdk_framework", "weak_sdk_framework", - # "static_framework_file", "force_load_library" ]) - # Ensure to strip out static link inputs - # These fields no longer exist in ObjcInfo in Bazel 8 / rules_apple 4.x - # _dedupe_key("library", avoid_libraries, objc_provider_fields) - # _dedupe_key("force_load_library", avoid_libraries, objc_provider_fields) - # _dedupe_key("imported_library", avoid_libraries, objc_provider_fields, check_name = True) - # _dedupe_key("static_framework_file", avoid_libraries, objc_provider_fields, check_name = True) - if "sdk_dylib" in objc_provider_fields: # Put sdk_dylib at _end_ of the linker invocation. Apple's linkers have # problems when SDK dylibs are first in the list, starting with Bazel diff --git a/rules/internal/objc_provider_utils.bzl b/rules/internal/objc_provider_utils.bzl index ce88b428..5a557d50 100644 --- a/rules/internal/objc_provider_utils.bzl +++ b/rules/internal/objc_provider_utils.bzl @@ -3,14 +3,7 @@ def _add_to_dict_if_present(dict, key, value): dict[key] = value objc_merge_keys = [ - # Most linking-related fields removed from ObjcInfo in Bazel 8 / rules_apple 4.x - # Linking is now handled exclusively through CcInfo - # Only source-related fields remain in ObjcInfo "source", - # Removed fields (no longer available in ObjcInfo): - # "sdk_dylib", "sdk_framework", "weak_sdk_framework", - # "imported_library", "force_load_library", - # "link_inputs", "linkopt", "library" ] def _merge_objc_providers_dict(providers, transitive = [], merge_keys = objc_merge_keys): From df983815ed49b8c30ac2d19d2f95a48791b60564 Mon Sep 17 00:00:00 2001 From: Sarad Date: Sat, 20 Dec 2025 01:00:00 -0500 Subject: [PATCH 06/15] Update docs --- docs/app_clip_doc.md | 2 +- docs/app_doc.md | 2 +- docs/extension_doc.md | 2 +- docs/framework_doc.md | 2 +- docs/import_middleman_doc.md | 6 +----- docs/library_doc.md | 2 +- docs/precompiled_apple_resource_bundle_doc.md | 2 +- docs/test_doc.md | 18 +++++++++--------- docs/xcconfig_doc.md | 2 +- 9 files changed, 17 insertions(+), 21 deletions(-) diff --git a/docs/app_clip_doc.md b/docs/app_clip_doc.md index 0f2fb9b1..e39494f4 100755 --- a/docs/app_clip_doc.md +++ b/docs/app_clip_doc.md @@ -10,7 +10,7 @@ load("@rules_ios//rules:app_clip.bzl", "ios_app_clip") ios_app_clip(name, families, infoplists, infoplists_by_build_setting, xcconfig, - xcconfig_by_build_setting, kwargs) + xcconfig_by_build_setting, **kwargs) Builds and packages an iOS App Clip. diff --git a/docs/app_doc.md b/docs/app_doc.md index e2471398..64ef8352 100755 --- a/docs/app_doc.md +++ b/docs/app_doc.md @@ -10,7 +10,7 @@ load("@rules_ios//rules:app.bzl", "ios_application") ios_application(name, families, apple_library, infoplists, infoplists_by_build_setting, xcconfig, - xcconfig_by_build_setting, kwargs) + xcconfig_by_build_setting, **kwargs) Builds and packages an iOS application. diff --git a/docs/extension_doc.md b/docs/extension_doc.md index 27a5ee86..0cd7b0c4 100755 --- a/docs/extension_doc.md +++ b/docs/extension_doc.md @@ -10,7 +10,7 @@ load("@rules_ios//rules:extension.bzl", "ios_extension") ios_extension(name, families, infoplists, infoplists_by_build_setting, xcconfig, - xcconfig_by_build_setting, kwargs) + xcconfig_by_build_setting, **kwargs) Builds and packages an iOS extension. diff --git a/docs/framework_doc.md b/docs/framework_doc.md index 1566020e..d15f30f0 100755 --- a/docs/framework_doc.md +++ b/docs/framework_doc.md @@ -54,7 +54,7 @@ Packages compiled code into an Apple .framework package load("@rules_ios//rules:framework.bzl", "apple_framework") apple_framework(name, apple_library, infoplists, infoplists_by_build_setting, xcconfig, - xcconfig_by_build_setting, kwargs) + xcconfig_by_build_setting, **kwargs) Builds and packages an Apple framework. diff --git a/docs/import_middleman_doc.md b/docs/import_middleman_doc.md index 235fc36f..81801b54 100755 --- a/docs/import_middleman_doc.md +++ b/docs/import_middleman_doc.md @@ -54,7 +54,7 @@ can be updated to work without the other behavior
 load("@rules_ios//rules:import_middleman.bzl", "find_imports")
 
-find_imports(name)
+find_imports()
 
Internal aspect for the `import_middleman` see below for a description. @@ -71,8 +71,4 @@ Internal aspect for the `import_middleman` see below for a description. **ATTRIBUTES** -| Name | Description | Type | Mandatory | Default | -| :------------- | :------------- | :------------- | :------------- | :------------- | -| name | A unique name for this target. | Name | required | | - diff --git a/docs/library_doc.md b/docs/library_doc.md index e8f0bfc1..e1112b2e 100755 --- a/docs/library_doc.md +++ b/docs/library_doc.md @@ -54,7 +54,7 @@ load("@rules_ios//rules:library.bzl", "apple_library") apple_library(name, library_tools, export_private_headers, namespace_is_module_name, default_xcconfig_name, xcconfig, xcconfig_by_build_setting, objc_defines, swift_defines, - kwargs) + **kwargs) Create libraries for native source code on Apple platforms. diff --git a/docs/precompiled_apple_resource_bundle_doc.md b/docs/precompiled_apple_resource_bundle_doc.md index 278ae416..63fcd79c 100755 --- a/docs/precompiled_apple_resource_bundle_doc.md +++ b/docs/precompiled_apple_resource_bundle_doc.md @@ -13,7 +13,7 @@ if this is ever fixed in bazel it should be removed
 load("@rules_ios//rules:precompiled_apple_resource_bundle.bzl", "precompiled_apple_resource_bundle")
 
-precompiled_apple_resource_bundle(kwargs)
+precompiled_apple_resource_bundle(**kwargs)
 
diff --git a/docs/test_doc.md b/docs/test_doc.md index 4d6c53b6..8c14ffdb 100755 --- a/docs/test_doc.md +++ b/docs/test_doc.md @@ -9,7 +9,7 @@
 load("@rules_ios//rules:test.bzl", "default_test_factory")
 
-default_test_factory.make_named_split(name, split_kwargs, in_split)
+default_test_factory.make_named_split(name, split_kwargs, **in_split)
 
@@ -31,7 +31,7 @@ default_test_factory.make_named_split(name, runner, in_split) +default_test_factory.make_runner_split(name, runner, **in_split) @@ -53,7 +53,7 @@ default_test_factory.make_runner_split(name, test_rule, kwargs) +default_test_factory.make_test(name, test_rule, **kwargs) Helper to create an individual test @@ -75,7 +75,7 @@ Helper to create an individual test
 load("@rules_ios//rules:test.bzl", "default_test_factory")
 
-default_test_factory.make_test_suite(factory, name, test_rule, test_kwargs)
+default_test_factory.make_test_suite(factory, name, test_rule, **test_kwargs)
 
@@ -98,7 +98,7 @@ default_test_factory.make_test_suite(factory, name, in_kwargs) +default_test_factory.make_test_suite_splits(factory, name, **in_kwargs) Helper function to split up a test for named splits and runners splits @@ -125,7 +125,7 @@ Finally - you can set the splits to be whatever you want.
 load("@rules_ios//rules:test.bzl", "default_test_factory")
 
-default_test_factory.make_tests(factory, name, test_rule, kwargs)
+default_test_factory.make_tests(factory, name, test_rule, **kwargs)
 
Main entry point of generating tests" @@ -148,7 +148,7 @@ Main entry point of generating tests"
 load("@rules_ios//rules:test.bzl", "ios_ui_test")
 
-ios_ui_test(name, apple_library, test_factory, kwargs)
+ios_ui_test(name, apple_library, test_factory, **kwargs)
 
Builds and packages iOS UI Tests. @@ -171,7 +171,7 @@ Builds and packages iOS UI Tests.
 load("@rules_ios//rules:test.bzl", "ios_unit_snapshot_test")
 
-ios_unit_snapshot_test(name, apple_library, test_factory, kwargs)
+ios_unit_snapshot_test(name, apple_library, test_factory, **kwargs)
 
Builds and packages iOS Unit Snapshot Tests. @@ -194,7 +194,7 @@ Builds and packages iOS Unit Snapshot Tests.
 load("@rules_ios//rules:test.bzl", "ios_unit_test")
 
-ios_unit_test(name, apple_library, test_factory, kwargs)
+ios_unit_test(name, apple_library, test_factory, **kwargs)
 
Builds and packages iOS Unit Tests. diff --git a/docs/xcconfig_doc.md b/docs/xcconfig_doc.md index fa1577e2..c167bd3f 100755 --- a/docs/xcconfig_doc.md +++ b/docs/xcconfig_doc.md @@ -70,7 +70,7 @@ Struct with different copts behind 'select()' statements
 load("@rules_ios//rules:xcconfig.doc.bzl", "merge_xcconfigs")
 
-merge_xcconfigs(xcconfigs)
+merge_xcconfigs(*xcconfigs)
 
Merges a list of xcconfigs into a single dictionary From daaf21e9a3b00021c0589157dca084f13c609cca Mon Sep 17 00:00:00 2001 From: Sarad Date: Sat, 20 Dec 2025 01:30:38 -0500 Subject: [PATCH 07/15] Add cloudfare mirror --- .bazelrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.bazelrc b/.bazelrc index adaf2fca..df021b97 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,5 +1,6 @@ # Enable Bzlmod common --enable_bzlmod +common --module_mirrors=https://bcr.cloudflaremirrors.com # Spawn strategy required for some tests build --spawn_strategy=local From 77ed1f741cfa1649d61fa20500245d9b094c238d Mon Sep 17 00:00:00 2001 From: Sarad Pant Date: Sat, 20 Dec 2025 01:36:53 -0500 Subject: [PATCH 08/15] Remove mirror flag --- .bazelrc | 1 - 1 file changed, 1 deletion(-) diff --git a/.bazelrc b/.bazelrc index df021b97..adaf2fca 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,6 +1,5 @@ # Enable Bzlmod common --enable_bzlmod -common --module_mirrors=https://bcr.cloudflaremirrors.com # Spawn strategy required for some tests build --spawn_strategy=local From 9da7a1bb4a5c89d2a76397dc54115ae2eed86082 Mon Sep 17 00:00:00 2001 From: Sarad Date: Mon, 22 Dec 2025 00:22:45 -0500 Subject: [PATCH 09/15] Final cleanup with AppleDynamicFramework addition using apple_common --- rules/import_middleman.bzl | 3 ++- rules/internal/framework_middleman.bzl | 12 ++++++++---- rules/internal/objc_provider_utils.bzl | 23 +++++++++++++++-------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/rules/import_middleman.bzl b/rules/import_middleman.bzl index 2a40f497..1e364e34 100644 --- a/rules/import_middleman.bzl +++ b/rules/import_middleman.bzl @@ -253,10 +253,11 @@ def _file_collector_rule_impl(ctx): if is_bazel_7: # Remove linking fields that were deprecated in Bazel 8 # Linking is now handled exclusively through CcInfo + # Note: dynamic_framework_file is still supported via apple_common.AppleDynamicFramework objc_provider_fields_filtered = { k: v for k, v in objc_provider_fields.items() - if k not in ["imported_library", "dynamic_framework_file", "linkopt", "link_inputs"] + if k not in ["imported_library", "linkopt", "link_inputs"] } objc = apple_common.new_objc_provider( **objc_provider_fields_filtered diff --git a/rules/internal/framework_middleman.bzl b/rules/internal/framework_middleman.bzl index b209e47e..c9a6abe3 100644 --- a/rules/internal/framework_middleman.bzl +++ b/rules/internal/framework_middleman.bzl @@ -65,6 +65,9 @@ def _framework_middleman(ctx): resource_providers.append(lib_dep[AppleResourceInfo]) if apple_common.Objc in lib_dep: objc_providers.append(lib_dep[apple_common.Objc]) + if apple_common.AppleDynamicFramework in lib_dep: + dynamic_frameworks.append(lib_dep) + dynamic_framework_providers.append(lib_dep[apple_common.AppleDynamicFramework]) for dep in ctx.attr.framework_deps: _process_dep(dep) @@ -75,14 +78,15 @@ def _framework_middleman(ctx): _process_dep(lib_dep) # Here we only need to loop a subset of the keys - # dynamic_framework_file removed in Bazel 8 / rules_apple 4.x - this was only for Bazel <= 6 objc_provider_fields = objc_provider_utils.merge_objc_providers_dict(providers = objc_providers, merge_keys = [ ]) - # Add the frameworks to the objc provider for Bazel <= 6 - # dynamic_framework_file removed in Bazel 8 / rules_apple 4.x + # Add the frameworks to the objc provider + # AppleDynamicFramework is still available in Bazel 8 via apple_common.AppleDynamicFramework dynamic_framework_provider = objc_provider_utils.merge_dynamic_framework_providers(dynamic_framework_providers) - + objc_provider_fields["dynamic_framework_file"] = depset( + transitive = [dynamic_framework_provider.framework_files, objc_provider_fields.get("dynamic_framework_file", depset([]))], + ) objc_provider = apple_common.new_objc_provider(**objc_provider_fields) # Add the framework info to the cc info linking context for Bazel >= 7 diff --git a/rules/internal/objc_provider_utils.bzl b/rules/internal/objc_provider_utils.bzl index 5a557d50..56b22a77 100644 --- a/rules/internal/objc_provider_utils.bzl +++ b/rules/internal/objc_provider_utils.bzl @@ -30,16 +30,23 @@ def _merge_objc_providers(providers, transitive = []): return apple_common.new_objc_provider(**objc_provider_fields) def _merge_dynamic_framework_providers(dynamic_framework_providers): - # AppleDynamicFramework provider removed in Bazel 8 / rules_apple 4.x - # Return a mock struct with empty framework_files for backwards compatibility - # This was only used for Bazel <= 6 - if len(dynamic_framework_providers) > 0: - fail("AppleDynamicFramework provider no longer exists in Bazel 8") + # AppleDynamicFramework is still available in Bazel 8 via apple_common.AppleDynamicFramework + # Merge all dynamic framework providers into a single struct + if len(dynamic_framework_providers) == 0: + return struct( + framework_dirs = depset([]), + framework_files = depset([]), + objc = apple_common.new_objc_provider(), + ) + + framework_dirs = [provider.framework_dirs for provider in dynamic_framework_providers] + framework_files = [provider.framework_files for provider in dynamic_framework_providers] + objc_providers = [provider.objc for provider in dynamic_framework_providers] return struct( - framework_dirs = depset([]), - framework_files = depset([]), - objc = apple_common.new_objc_provider(), + framework_dirs = depset(transitive = framework_dirs), + framework_files = depset(transitive = framework_files), + objc = apple_common.new_objc_provider(providers = objc_providers), ) objc_provider_utils = struct( From 50ea26e14bc52b50cb07a6c43401bdd4b388bd03 Mon Sep 17 00:00:00 2001 From: Sarad Date: Mon, 22 Dec 2025 00:40:00 -0500 Subject: [PATCH 10/15] Has attr for AppleDynamicFramework --- rules/internal/framework_middleman.bzl | 14 +++++++++----- rules/internal/objc_provider_utils.bzl | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/rules/internal/framework_middleman.bzl b/rules/internal/framework_middleman.bzl index c9a6abe3..91864c8e 100644 --- a/rules/internal/framework_middleman.bzl +++ b/rules/internal/framework_middleman.bzl @@ -65,7 +65,8 @@ def _framework_middleman(ctx): resource_providers.append(lib_dep[AppleResourceInfo]) if apple_common.Objc in lib_dep: objc_providers.append(lib_dep[apple_common.Objc]) - if apple_common.AppleDynamicFramework in lib_dep: + # AppleDynamicFramework only exists in Bazel 7 and earlier + if is_bazel_7 and hasattr(apple_common, "AppleDynamicFramework") and apple_common.AppleDynamicFramework in lib_dep: dynamic_frameworks.append(lib_dep) dynamic_framework_providers.append(lib_dep[apple_common.AppleDynamicFramework]) @@ -82,11 +83,14 @@ def _framework_middleman(ctx): ]) # Add the frameworks to the objc provider - # AppleDynamicFramework is still available in Bazel 8 via apple_common.AppleDynamicFramework + # Note: AppleDynamicFramework only exists in Bazel 7 and earlier + # In Bazel 8, dynamic_framework_file field was removed from ObjcInfo dynamic_framework_provider = objc_provider_utils.merge_dynamic_framework_providers(dynamic_framework_providers) - objc_provider_fields["dynamic_framework_file"] = depset( - transitive = [dynamic_framework_provider.framework_files, objc_provider_fields.get("dynamic_framework_file", depset([]))], - ) + # Only add dynamic_framework_file if AppleDynamicFramework provider exists (Bazel 7 and earlier) + if hasattr(apple_common, "AppleDynamicFramework"): + objc_provider_fields["dynamic_framework_file"] = depset( + transitive = [dynamic_framework_provider.framework_files, objc_provider_fields.get("dynamic_framework_file", depset([]))], + ) objc_provider = apple_common.new_objc_provider(**objc_provider_fields) # Add the framework info to the cc info linking context for Bazel >= 7 diff --git a/rules/internal/objc_provider_utils.bzl b/rules/internal/objc_provider_utils.bzl index 56b22a77..213dbc79 100644 --- a/rules/internal/objc_provider_utils.bzl +++ b/rules/internal/objc_provider_utils.bzl @@ -30,7 +30,7 @@ def _merge_objc_providers(providers, transitive = []): return apple_common.new_objc_provider(**objc_provider_fields) def _merge_dynamic_framework_providers(dynamic_framework_providers): - # AppleDynamicFramework is still available in Bazel 8 via apple_common.AppleDynamicFramework + # Note: AppleDynamicFramework only exists in Bazel 7 and earlier # Merge all dynamic framework providers into a single struct if len(dynamic_framework_providers) == 0: return struct( From d3ecc893d542f06f132aeeeb6b822cada9d147da Mon Sep 17 00:00:00 2001 From: Sarad Date: Mon, 22 Dec 2025 01:05:07 -0500 Subject: [PATCH 11/15] Fix for import_middleman --- rules/import_middleman.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/import_middleman.bzl b/rules/import_middleman.bzl index 1e364e34..1d756a72 100644 --- a/rules/import_middleman.bzl +++ b/rules/import_middleman.bzl @@ -253,11 +253,11 @@ def _file_collector_rule_impl(ctx): if is_bazel_7: # Remove linking fields that were deprecated in Bazel 8 # Linking is now handled exclusively through CcInfo - # Note: dynamic_framework_file is still supported via apple_common.AppleDynamicFramework + # dynamic_framework_file is also no longer supported in ObjcInfo objc_provider_fields_filtered = { k: v for k, v in objc_provider_fields.items() - if k not in ["imported_library", "linkopt", "link_inputs"] + if k not in ["imported_library", "linkopt", "link_inputs", "dynamic_framework_file"] } objc = apple_common.new_objc_provider( **objc_provider_fields_filtered From 8438ac8594d594995872c015bb00fcf1ffbb34dc Mon Sep 17 00:00:00 2001 From: Sarad Date: Mon, 22 Dec 2025 01:25:28 -0500 Subject: [PATCH 12/15] Merge keys fix --- rules/import_middleman.bzl | 5 ----- rules/internal/framework_middleman.bzl | 9 ++------- rules/internal/objc_provider_utils.bzl | 27 ++++++++++++++++++++------ 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/rules/import_middleman.bzl b/rules/import_middleman.bzl index 1d756a72..b82c62f7 100644 --- a/rules/import_middleman.bzl +++ b/rules/import_middleman.bzl @@ -179,13 +179,8 @@ def _file_collector_rule_impl(ctx): # This should be correctly configured upstream: see setup in rules_ios fail("using import_middleman ({}) on wrong transition ({},{},is_device={})".format(ctx.attr.name, platform, arch, ctx.fragments.apple.single_arch_platform.is_device)) - merge_keys = [ - "source", - ] - objc_provider_fields = objc_provider_utils.merge_objc_providers_dict( providers = [], - merge_keys = merge_keys, ) exisiting_imported_libraries = objc_provider_fields.get("imported_library", depset([])) diff --git a/rules/internal/framework_middleman.bzl b/rules/internal/framework_middleman.bzl index 91864c8e..945c64d4 100644 --- a/rules/internal/framework_middleman.bzl +++ b/rules/internal/framework_middleman.bzl @@ -79,8 +79,7 @@ def _framework_middleman(ctx): _process_dep(lib_dep) # Here we only need to loop a subset of the keys - objc_provider_fields = objc_provider_utils.merge_objc_providers_dict(providers = objc_providers, merge_keys = [ - ]) + objc_provider_fields = objc_provider_utils.merge_objc_providers_dict(providers = objc_providers) # Add the frameworks to the objc provider # Note: AppleDynamicFramework only exists in Bazel 7 and earlier @@ -269,11 +268,7 @@ def _dep_middleman(ctx): _collect_providers(lib_dep) # Construct & merge the ObjcProvider - # Most linking fields removed from ObjcInfo in Bazel 8 / rules_apple 4.x - # Linking is now handled exclusively through CcInfo - objc_provider_fields = objc_provider_utils.merge_objc_providers_dict(providers = objc_providers, merge_keys = [ - "source", - ]) + objc_provider_fields = objc_provider_utils.merge_objc_providers_dict(providers = objc_providers) if "sdk_dylib" in objc_provider_fields: # Put sdk_dylib at _end_ of the linker invocation. Apple's linkers have diff --git a/rules/internal/objc_provider_utils.bzl b/rules/internal/objc_provider_utils.bzl index 213dbc79..d17175c0 100644 --- a/rules/internal/objc_provider_utils.bzl +++ b/rules/internal/objc_provider_utils.bzl @@ -3,7 +3,15 @@ def _add_to_dict_if_present(dict, key, value): dict[key] = value objc_merge_keys = [ + "sdk_dylib", + "sdk_framework", + "weak_sdk_framework", + "imported_library", + "force_load_library", "source", + "link_inputs", + "linkopt", + "library", ] def _merge_objc_providers_dict(providers, transitive = [], merge_keys = objc_merge_keys): @@ -14,12 +22,19 @@ def _merge_objc_providers_dict(providers, transitive = [], merge_keys = objc_mer "providers": transitive, } for key in merge_keys: - set = depset( - direct = [], - # Note: we may want to merge this with the below inputs? - transitive = [getattr(provider, key) for provider in providers], - ) - _add_to_dict_if_present(fields, key, set) + # In Bazel 8+, linking fields are not available in ObjcInfo (migrated to CcInfo) + # but can still be passed to apple_common.new_objc_provider() + # Only try to merge fields that actually exist in the providers + transitive_sets = [] + for provider in providers: + if hasattr(provider, key): + transitive_sets.append(getattr(provider, key)) + if transitive_sets: + set = depset( + direct = [], + transitive = transitive_sets, + ) + _add_to_dict_if_present(fields, key, set) return fields def _merge_objc_providers(providers, transitive = []): From 9a987b9107f7df9337d39c3d57f057f887f29aa0 Mon Sep 17 00:00:00 2001 From: Sarad Date: Mon, 22 Dec 2025 01:28:41 -0500 Subject: [PATCH 13/15] Buildifier --- rules/internal/framework_middleman.bzl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rules/internal/framework_middleman.bzl b/rules/internal/framework_middleman.bzl index 945c64d4..44931e14 100644 --- a/rules/internal/framework_middleman.bzl +++ b/rules/internal/framework_middleman.bzl @@ -65,6 +65,7 @@ def _framework_middleman(ctx): resource_providers.append(lib_dep[AppleResourceInfo]) if apple_common.Objc in lib_dep: objc_providers.append(lib_dep[apple_common.Objc]) + # AppleDynamicFramework only exists in Bazel 7 and earlier if is_bazel_7 and hasattr(apple_common, "AppleDynamicFramework") and apple_common.AppleDynamicFramework in lib_dep: dynamic_frameworks.append(lib_dep) @@ -85,6 +86,7 @@ def _framework_middleman(ctx): # Note: AppleDynamicFramework only exists in Bazel 7 and earlier # In Bazel 8, dynamic_framework_file field was removed from ObjcInfo dynamic_framework_provider = objc_provider_utils.merge_dynamic_framework_providers(dynamic_framework_providers) + # Only add dynamic_framework_file if AppleDynamicFramework provider exists (Bazel 7 and earlier) if hasattr(apple_common, "AppleDynamicFramework"): objc_provider_fields["dynamic_framework_file"] = depset( From 646df4dad6702fb0ef3b1c741cdb4c9594c8bcc0 Mon Sep 17 00:00:00 2001 From: Sarad Date: Wed, 24 Dec 2025 00:35:16 -0500 Subject: [PATCH 14/15] Update README --- README.md | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 88d652a9..c6e0cad7 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ See the following table for supported release versions. | Bazel release | Minimum supported rules version | Final supported rules version |:-------------------:|:-------------------------:|:-------------------------: -| 8.* | 6.0.0 | current +| 8.* | 7.0.0 | current | 7.* | 4.4.0 | current | 6.* | 2.0.0 | 5.3.0 | 5.* | 1.0.0 | 3.2.2 @@ -45,27 +45,12 @@ See the following table for supported rules_apple release versions. | rules_apple release | Minimum supported rules version | Final supported rules version |:-------------------:|:-------------------------:|:-------------------------: -| 4.3.3 | 6.0.0 | current +| 4.3.3 | 7.0.0 | current | 3.15.0 | 5.3.0 | current | 3.* | 3.* | 4.2.1 | 2.* | 2.* | 3.2.2 | 1.* | 1.0.0 | 3.2.2 -## Migrating to Bazel 8 - -rules_ios 6.0.0+ supports Bazel 8.x. To migrate from Bazel 7.x to 8.x: - -1. Update your `.bazelversion` file to `8.4.0` (or later) -2. Update `rules_ios` to version `6.0.0` or later in your `MODULE.bazel` -3. No code changes required - all deprecated APIs were already migrated in previous releases - -The following dependencies are automatically updated when you upgrade rules_ios: -- `apple_support`: 2.0.0+ -- `rules_apple`: 4.3.3+ -- `rules_swift`: 3.4.1+ - -Both Bazel 7.x and 8.x are supported during the transition period. We recommend staying on Bazel 7.x until you're ready to migrate your entire project. - ## Getting started ### Bzlmod setup From db84aa0de632c0725d2573b492e8680f865eb5bb Mon Sep 17 00:00:00 2001 From: Sarad Pant Date: Wed, 24 Dec 2025 02:29:03 -0500 Subject: [PATCH 15/15] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c6e0cad7..ab45f752 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ See the following table for supported rules_apple release versions. | rules_apple release | Minimum supported rules version | Final supported rules version |:-------------------:|:-------------------------:|:-------------------------: -| 4.3.3 | 7.0.0 | current +| 4.3.3 | 7.0.0 | current | 3.15.0 | 5.3.0 | current | 3.* | 3.* | 4.2.1 | 2.* | 2.* | 3.2.2