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/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/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..ab45f752 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.* | 7.0.0 | current | 7.* | 4.4.0 | current | 6.* | 2.0.0 | 5.3.0 | 5.* | 1.0.0 | 3.2.2 @@ -44,6 +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 | 3.15.0 | 5.3.0 | current | 3.* | 3.* | 4.2.1 | 2.* | 2.* | 3.2.2 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 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/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 f76c086f..b82c62f7 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,20 +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 = [ - "sdk_dylib", - "sdk_framework", - "weak_sdk_framework", - "force_load_library", - "source", - "link_inputs", - "linkopt", - "library", - ] - 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([])) @@ -256,22 +244,43 @@ 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 + # 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", "dynamic_framework_file"] + } + 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/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", diff --git a/rules/internal/framework_middleman.bzl b/rules/internal/framework_middleman.bzl index b8fa1673..44931e14 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,32 +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") def _framework_middleman(ctx): resource_providers = [] @@ -64,7 +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: + + # 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]) @@ -77,15 +80,18 @@ 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 = [ - "dynamic_framework_file", - ]) + objc_provider_fields = objc_provider_utils.merge_objc_providers_dict(providers = objc_providers) - # Add the frameworks to the objc provider for Bazel <= 6 + # Add the frameworks to the objc provider + # 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 @@ -239,11 +245,11 @@ 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 - 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 +269,8 @@ 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 - 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", - ]) - - # 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) + # Construct & merge the ObjcProvider + 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 2fa7cfeb..d17175c0 100644 --- a/rules/internal/objc_provider_utils.bzl +++ b/rules/internal/objc_provider_utils.bzl @@ -22,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 = []): @@ -38,23 +45,24 @@ 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], + # 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( + framework_dirs = depset([]), + framework_files = depset([]), + objc = apple_common.new_objc_provider(), ) - _add_to_dict_if_present(fields, key, set) - fields["objc"] = apple_common.new_objc_provider() - fields["cc_info"] = CcInfo() + 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 apple_common.new_dynamic_framework_provider(**fields) + return struct( + 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( merge_objc_providers_dict = _merge_objc_providers_dict, 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", ],