diff --git a/rules/force_load_direct_deps.bzl b/rules/force_load_direct_deps.bzl index 3e6fb4f8..ec7aaf92 100644 --- a/rules/force_load_direct_deps.bzl +++ b/rules/force_load_direct_deps.bzl @@ -1,36 +1,116 @@ +load("@bazel_skylib//lib:paths.bzl", "paths") +load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain", "use_cpp_toolchain") load("//rules:providers.bzl", "AvoidDepsInfo") load("//rules:transition_support.bzl", "transition_support") -def _impl(ctx): - if not ctx.attr.should_force_load: - return apple_common.new_objc_provider() +def _objc_provider_static_libraries(dep): + """Returns the ObjcProvider static libraries (.a) that should be force loaded. + """ + if not apple_common.Objc in dep: + return [] + + return dep[apple_common.Objc].library.to_list() + +def _cc_info_static_libraries(dep): + """Returns the CcInfo static libraries (.a) that should be force loaded. + + NOTE: CcInfo, unlike ObjcProvider, does not encode where the static library came from. + In the existing `_objc_provider_static_libraries` we only collect `.library` from ObjcProvider. + ObjcProvider `.library` list static library dependencies of the current target, + it does not include imported static libraries (such as those from `.framework` files). + CcInfo only provides `.static_library` and does not make this distinction. + To match this behavior, we only collect `.static_library` from CcInfo that are not from `.framework`s. + """ + if not CcInfo in dep: + return [] + + static_cc_libraries = [] + for linker_input in dep[CcInfo].linking_context.linker_inputs.to_list(): + for library_to_link in linker_input.libraries: + if not library_to_link.static_library: + continue + containing_path = paths.dirname(library_to_link.static_library.path) + if containing_path.endswith(".framework"): + continue + static_cc_libraries.append(library_to_link.static_library) - force_load = [] + return static_cc_libraries +# TODO: We should deprecate this rule for Bazel 7+ as `--incompatible_objc_alwayslink_by_default` effectively +# does the same thing. +def _force_load_direct_deps_impl(ctx): + """This rule will traverse the direct deps of the target and force load the static libraries of the objc deps. + """ + + if not ctx.attr.should_force_load: + return [ + apple_common.new_objc_provider(), + CcInfo(), + ] + + force_load_libraries = [] + force_load_cc_libraries = [] avoid_deps = [] + avoid_libraries = {} + avoid_cc_libraries = {} + cc_toolchain = find_cpp_toolchain(ctx) + cc_features = cc_common.configure_features( + ctx = ctx, + cc_toolchain = cc_toolchain, + language = "objc", + ) + + # Set the deps that should be avoided and not linked. for dep in ctx.attr.deps: if AvoidDepsInfo in dep: avoid_deps.extend(dep[AvoidDepsInfo].libraries) - avoid_libraries = {} + # Collect the libraries that should be avoided. for dep in avoid_deps: - if apple_common.Objc in dep: - for lib in dep[apple_common.Objc].library.to_list(): - avoid_libraries[lib] = True + for lib in _objc_provider_static_libraries(dep): + avoid_libraries[lib] = True + for lib in _cc_info_static_libraries(dep): + avoid_cc_libraries[lib] = True - force_load = [] + # Collect the libraries that should be force loaded. for dep in ctx.attr.deps: - if apple_common.Objc in dep: - for lib in dep[apple_common.Objc].library.to_list(): - if not lib in avoid_libraries: - force_load.append(lib) - return apple_common.new_objc_provider( - force_load_library = depset(force_load), - link_inputs = depset(force_load), - ) + for lib in _objc_provider_static_libraries(dep): + if not lib in avoid_libraries: + force_load_libraries.append(lib) + for lib in _cc_info_static_libraries(dep): + if not lib in avoid_cc_libraries: + force_load_cc_libraries.append(lib) + + return [ + apple_common.new_objc_provider( + force_load_library = depset(force_load_libraries), + link_inputs = depset(force_load_libraries), + ), + CcInfo( + linking_context = cc_common.create_linking_context( + linker_inputs = depset([ + cc_common.create_linker_input( + owner = ctx.label, + libraries = depset([ + cc_common.create_library_to_link( + actions = ctx.actions, + cc_toolchain = cc_toolchain, + feature_configuration = cc_features, + static_library = library, + alwayslink = True, + ) + for library in force_load_cc_libraries + ]), + ), + ]), + ), + ), + ] force_load_direct_deps = rule( - implementation = _impl, + implementation = _force_load_direct_deps_impl, + toolchains = use_cpp_toolchain(), + fragments = ["apple", "cpp", "objc"], attrs = { "deps": attr.label_list( cfg = transition_support.apple_platform_split_transition, @@ -58,6 +138,14 @@ force_load_direct_deps = rule( default = "@bazel_tools//tools/allowlists/function_transition_allowlist", doc = "Needed to allow this rule to have an incoming edge configuration transition.", ), + "_cc_toolchain": attr.label( + providers = [cc_common.CcToolchainInfo], + default = Label("@bazel_tools//tools/cpp:current_cc_toolchain"), + doc = """\ +The C++ toolchain from which linking flags and other tools needed by the Swift +toolchain (such as `clang`) will be retrieved. +""", + ), }, doc = """ A rule to link with `-force_load` for direct`deps` diff --git a/rules/framework.bzl b/rules/framework.bzl index 7819c4cf..2d744d11 100644 --- a/rules/framework.bzl +++ b/rules/framework.bzl @@ -6,6 +6,7 @@ load("//rules:library.bzl", "PrivateHeadersInfo", "apple_library") load("//rules:plists.bzl", "process_infoplists") load("//rules:providers.bzl", "AvoidDepsInfo", "FrameworkInfo") 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("@bazel_skylib//lib:partial.bzl", "partial") load("@bazel_skylib//lib:paths.bzl", "paths") @@ -534,6 +535,18 @@ def _get_symlinked_framework_clean_action(ctx, framework_files, compilation_cont else: ctx.actions.write(framework_manifest, "# Empty framework\n") +def _get_cc_info_linker_inputs(*, deps): + linker_inputs = [] + + for dep in deps: + if not CcInfo in dep: + continue + + for linker_input in dep[CcInfo].linking_context.linker_inputs.to_list(): + linker_inputs.append(linker_input) + + return depset(linker_inputs) + def _create_swiftmodule(attrs): kwargs = {} @@ -986,7 +999,9 @@ def _apple_framework_packaging_impl(ctx): split_slice_key = "{}_{}{}".format(platform, split_slice_varint, arch) deps = _attrs_for_split_slice(ctx.split_attr.deps, split_slice_key) + dep_cc_infos = [dep[CcInfo] for dep in deps if CcInfo in dep] transitive_deps = _attrs_for_split_slice(ctx.split_attr.transitive_deps, split_slice_key) + transitive_dep_cc_infos = [dep[CcInfo] for dep in transitive_deps if CcInfo in dep] vfs = _attrs_for_split_slice(ctx.split_attr.vfs, split_slice_key) current_apple_platform = transition_support.current_apple_platform(apple_fragment = ctx.fragments.apple, xcode_config = ctx.attr._xcode_config) @@ -1004,15 +1019,15 @@ def _apple_framework_packaging_impl(ctx): )) objc_provider_utils.add_to_dict_if_present(compilation_context_fields, "defines", depset( direct = [], - transitive = [getattr(dep[CcInfo].compilation_context, "defines") for dep in deps if CcInfo in dep], + transitive = [getattr(cc_info.compilation_context, "defines") for cc_info in dep_cc_infos], )) objc_provider_utils.add_to_dict_if_present(compilation_context_fields, "includes", depset( direct = [], - transitive = [getattr(dep[CcInfo].compilation_context, "includes") for dep in deps if CcInfo in dep], + transitive = [getattr(cc_info.compilation_context, "includes") for cc_info in dep_cc_infos], )) objc_provider_utils.add_to_dict_if_present(compilation_context_fields, "framework_includes", depset( direct = [], - transitive = [getattr(dep[CcInfo].compilation_context, "framework_includes") for dep in deps if CcInfo in dep], + transitive = [getattr(cc_info.compilation_context, "framework_includes") for cc_info in dep_cc_infos], )) # Compute cc_info and swift_info @@ -1031,17 +1046,23 @@ def _apple_framework_packaging_impl(ctx): # If not virtualizing the framework - then it runs a "clean" _get_symlinked_framework_clean_action(ctx, framework_files, compilation_context_fields) + # Construct the `CcInfo` provider, the linking context here used instead of ObjcProvider in Bazel 7+. cc_info_provider = CcInfo( compilation_context = cc_common.create_compilation_context( **compilation_context_fields ), + linking_context = cc_common.create_linking_context( + linker_inputs = _get_cc_info_linker_inputs(deps = deps) if is_bazel_7 else depset([]), + ), ) if virtualize_frameworks: cc_info = cc_common.merge_cc_infos(direct_cc_infos = [cc_info_provider]) else: - dep_cc_infos = [dep[CcInfo] for dep in transitive_deps if CcInfo in dep] - cc_info = cc_common.merge_cc_infos(direct_cc_infos = [cc_info_provider], cc_infos = dep_cc_infos) + cc_info = cc_common.merge_cc_infos( + direct_cc_infos = [cc_info_provider], + cc_infos = transitive_dep_cc_infos, + ) # Propagate the avoid deps information upwards avoid_deps = [] @@ -1072,6 +1093,7 @@ def _apple_framework_packaging_impl(ctx): providers = [dep[apple_common.Objc] for dep in deps if apple_common.Objc in dep], transitive = [dep[apple_common.Objc] for dep in transitive_deps if apple_common.Objc in dep], ) + return [ avoid_deps_info, framework_info, diff --git a/rules/import_middleman.bzl b/rules/import_middleman.bzl index f1f5f59f..d0ca1718 100644 --- a/rules/import_middleman.bzl +++ b/rules/import_middleman.bzl @@ -1,5 +1,4 @@ load("@build_bazel_rules_apple//apple/internal:providers.bzl", "AppleFrameworkImportInfo", "new_appleframeworkimportinfo") -load("//rules:features.bzl", "feature_names") load("//rules/internal:objc_provider_utils.bzl", "objc_provider_utils") load("@build_bazel_rules_apple//apple/internal:bundling_support.bzl", "bundling_support") @@ -174,7 +173,6 @@ 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)) - virtualize_frameworks = feature_names.virtualize_frameworks in ctx.features merge_keys = [ "sdk_dylib", "sdk_framework", @@ -184,17 +182,13 @@ def _file_collector_rule_impl(ctx): "link_inputs", "linkopt", "library", - ] + ([] if is_sim_arm64 else [ - # Merge in the objc provider fields - "imported_library", - "dynamic_framework_file", - "static_framework_file", - ]) + ] objc_provider_fields = objc_provider_utils.merge_objc_providers_dict( providers = [dep[apple_common.Objc] for dep in ctx.attr.deps], merge_keys = merge_keys, ) + exisiting_imported_libraries = objc_provider_fields.get("imported_library", depset([])) replaced_imported_libraries = _replace_inputs(ctx, exisiting_imported_libraries, input_imported_libraries, _update_lib).inputs objc_provider_fields["imported_library"] = depset(_deduplicate_test_deps(test_linker_deps[1], replaced_imported_libraries)) @@ -260,15 +254,15 @@ def _file_collector_rule_impl(ctx): **objc_provider_fields ) - additional_providers = [] + # Create the CcInfo provider, linking information from this is used in Bazel 7+. dep_cc_infos = [dep[CcInfo] for dep in ctx.attr.deps if CcInfo in dep] - cc_info = cc_common.merge_cc_infos(direct_cc_infos = [], cc_infos = dep_cc_infos) - additional_providers.append(cc_info) + cc_info = cc_common.merge_cc_infos(cc_infos = dep_cc_infos) return [ DefaultInfo(files = depset(dynamic_framework_dirs + replaced_frameworks)), objc, - ] + _make_imports(dynamic_framework_dirs) + additional_providers + cc_info, + ] + _make_imports(dynamic_framework_dirs) import_middleman = rule( implementation = _file_collector_rule_impl, diff --git a/rules/internal/framework_middleman.bzl b/rules/internal/framework_middleman.bzl index b4d14d64..b8fa1673 100644 --- a/rules/internal/framework_middleman.bzl +++ b/rules/internal/framework_middleman.bzl @@ -1,4 +1,5 @@ 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:providers.bzl", "AppleResourceInfo", @@ -40,6 +41,14 @@ def _framework_middleman(ctx): dynamic_framework_providers = [] apple_embeddable_infos = [] cc_providers = [] + cc_toolchain = find_cpp_toolchain(ctx) + cc_features = cc_common.configure_features( + ctx = ctx, + cc_toolchain = cc_toolchain, + language = "objc", + requested_features = ctx.features, + unsupported_features = ctx.disabled_features, + ) def _process_dep(lib_dep): if AppleEmbeddableInfo in lib_dep: @@ -72,13 +81,34 @@ def _framework_middleman(ctx): "dynamic_framework_file", ]) - # Add the frameworks to the linker command + # Add the frameworks to the objc provider for Bazel <= 6 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) - cc_info_provider = cc_common.merge_cc_infos(direct_cc_infos = [], cc_infos = cc_providers) + + # Add the framework info to the cc info linking context for Bazel >= 7 + framework_cc_info = CcInfo( + linking_context = cc_common.create_linking_context( + linker_inputs = depset([ + cc_common.create_linker_input( + owner = ctx.label, + libraries = depset([ + cc_common.create_library_to_link( + actions = ctx.actions, + cc_toolchain = cc_toolchain, + feature_configuration = cc_features, + dynamic_library = dynamic_library, + ) + for dynamic_library in dynamic_framework_provider.framework_files.to_list() + ]), + ), + ]), + ), + ) + cc_info_provider = cc_common.merge_cc_infos(direct_cc_infos = [framework_cc_info], cc_infos = cc_providers) + providers = [ dynamic_framework_provider, cc_info_provider, @@ -120,6 +150,8 @@ def _framework_middleman(ctx): framework_middleman = rule( implementation = _framework_middleman, + toolchains = use_cpp_toolchain(), + fragments = ["cpp"], attrs = { "framework_deps": attr.label_list( cfg = transition_support.apple_platform_split_transition, @@ -156,6 +188,14 @@ framework_middleman = rule( default = "@bazel_tools//tools/allowlists/function_transition_allowlist", doc = "Needed to allow this rule to have an incoming edge configuration transition.", ), + "_cc_toolchain": attr.label( + providers = [cc_common.CcToolchainInfo], + default = Label("@bazel_tools//tools/cpp:current_cc_toolchain"), + doc = """\ +The C++ toolchain from which linking flags and other tools needed by the Swift +toolchain (such as `clang`) will be retrieved. +""", + ), }, doc = """ This is a volatile internal rule to make frameworks work with @@ -194,6 +234,8 @@ def _dep_middleman(ctx): def _collect_providers(lib_dep): if apple_common.Objc in lib_dep: objc_providers.append(lib_dep[apple_common.Objc]) + if CcInfo in lib_dep: + cc_providers.append(lib_dep[CcInfo]) def _process_avoid_deps(avoid_dep_libs): for dep in avoid_dep_libs: @@ -206,6 +248,11 @@ def _dep_middleman(ctx): avoid_libraries[lib.basename] = True for lib in dep[apple_common.Objc].static_framework_file.to_list(): avoid_libraries[lib.basename] = True + if CcInfo in dep: + for linker_input in dep[CcInfo].linking_context.linker_inputs.to_list(): + for library_to_link in linker_input.libraries: + if library_to_link.static_library: + avoid_libraries[library_to_link.static_library] = True for dep in ctx.attr.deps: _collect_providers(dep) @@ -216,7 +263,7 @@ def _dep_middleman(ctx): for lib_dep in dep[AvoidDepsInfo].libraries: _collect_providers(lib_dep) - # Merge the entire provider here + # 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", @@ -249,12 +296,14 @@ def _dep_middleman(ctx): ) objc_provider = apple_common.new_objc_provider(**objc_provider_fields) - cc_info_provider = cc_common.merge_cc_infos(direct_cc_infos = [], cc_infos = cc_providers) - providers = [ + + # Construct the CcInfo provider, the linking information is used in Bazel >= 7. + cc_info_provider = cc_common.merge_cc_infos(cc_infos = cc_providers) + + return [ cc_info_provider, objc_provider, ] - return providers dep_middleman = rule( implementation = _dep_middleman, diff --git a/rules/internal/objc_provider_utils.bzl b/rules/internal/objc_provider_utils.bzl index cba49ae4..2fa7cfeb 100644 --- a/rules/internal/objc_provider_utils.bzl +++ b/rules/internal/objc_provider_utils.bzl @@ -52,6 +52,7 @@ def _merge_dynamic_framework_providers(dynamic_framework_providers): _add_to_dict_if_present(fields, key, set) fields["objc"] = apple_common.new_objc_provider() + fields["cc_info"] = CcInfo() return apple_common.new_dynamic_framework_provider(**fields) diff --git a/tests/ios/xcodeproj/Test-MultipleConfigs-Project-WithTransitiveFlag.xcodeproj/project.pbxproj b/tests/ios/xcodeproj/Test-MultipleConfigs-Project-WithTransitiveFlag.xcodeproj/project.pbxproj index c7b71370..0934ca2a 100755 --- a/tests/ios/xcodeproj/Test-MultipleConfigs-Project-WithTransitiveFlag.xcodeproj/project.pbxproj +++ b/tests/ios/xcodeproj/Test-MultipleConfigs-Project-WithTransitiveFlag.xcodeproj/project.pbxproj @@ -428,7 +428,7 @@ BAZEL_SWIFTMODULEFILES_TO_COPY = ""; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; - FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks \"$BAZEL_WORKSPACE_ROOT/bazel-out/ios-sim_arm64-min12.0-applebin_ios-ios_sim_arm64-dbg-ST-008b8551197e/bin/tests/ios/app/FW\""; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; HEADER_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT\""; INFOPLIST_FILE = ""; @@ -559,7 +559,7 @@ BAZEL_SWIFTMODULEFILES_TO_COPY = ""; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; - FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks \"$BAZEL_WORKSPACE_ROOT/bazel-out/ios-sim_arm64-min12.0-applebin_ios-ios_sim_arm64-dbg-ST-008b8551197e/bin/tests/ios/app/FW\""; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; HEADER_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT\""; INFOPLIST_FILE = ""; diff --git a/tests/ios/xcodeproj/Test-MultipleConfigs-Project.xcodeproj/project.pbxproj b/tests/ios/xcodeproj/Test-MultipleConfigs-Project.xcodeproj/project.pbxproj index a07c878b..c419c749 100755 --- a/tests/ios/xcodeproj/Test-MultipleConfigs-Project.xcodeproj/project.pbxproj +++ b/tests/ios/xcodeproj/Test-MultipleConfigs-Project.xcodeproj/project.pbxproj @@ -400,7 +400,7 @@ BAZEL_SWIFTMODULEFILES_TO_COPY = ""; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; - FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks \"$BAZEL_WORKSPACE_ROOT/bazel-out/ios-sim_arm64-min12.0-applebin_ios-ios_sim_arm64-dbg-ST-008b8551197e/bin/tests/ios/app/FW\""; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; HEADER_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT\""; INFOPLIST_FILE = ""; @@ -465,7 +465,7 @@ BAZEL_SWIFTMODULEFILES_TO_COPY = ""; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; - FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks \"$BAZEL_WORKSPACE_ROOT/bazel-out/ios-sim_arm64-min12.0-applebin_ios-ios_sim_arm64-dbg-ST-008b8551197e/bin/tests/ios/app/FW\""; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; HEADER_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT\""; INFOPLIST_FILE = ""; diff --git a/tests/ios/xcodeproj/Test-With-Host-App-With-AdditionalPrebuildScript.xcodeproj/project.pbxproj b/tests/ios/xcodeproj/Test-With-Host-App-With-AdditionalPrebuildScript.xcodeproj/project.pbxproj index 2d5f201d..eb814a97 100755 --- a/tests/ios/xcodeproj/Test-With-Host-App-With-AdditionalPrebuildScript.xcodeproj/project.pbxproj +++ b/tests/ios/xcodeproj/Test-With-Host-App-With-AdditionalPrebuildScript.xcodeproj/project.pbxproj @@ -570,7 +570,7 @@ BAZEL_SWIFTMODULEFILES_TO_COPY = ""; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; - FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks \"$BAZEL_WORKSPACE_ROOT/bazel-out/ios-sim_arm64-min12.0-applebin_ios-ios_sim_arm64-dbg-ST-008b8551197e/bin/tests/ios/app/FW\""; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; HEADER_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT\""; INFOPLIST_FILE = ""; @@ -786,7 +786,7 @@ BAZEL_SWIFTMODULEFILES_TO_COPY = ""; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; - FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks \"$BAZEL_WORKSPACE_ROOT/bazel-out/ios-sim_arm64-min12.0-applebin_ios-ios_sim_arm64-dbg-ST-008b8551197e/bin/tests/ios/app/FW\""; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; HEADER_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT\""; INFOPLIST_FILE = ""; diff --git a/tests/ios/xcodeproj/TestWithHostApp.xcodeproj/project.pbxproj b/tests/ios/xcodeproj/TestWithHostApp.xcodeproj/project.pbxproj index a4ef6c74..12b45519 100755 --- a/tests/ios/xcodeproj/TestWithHostApp.xcodeproj/project.pbxproj +++ b/tests/ios/xcodeproj/TestWithHostApp.xcodeproj/project.pbxproj @@ -427,7 +427,7 @@ BAZEL_SWIFTMODULEFILES_TO_COPY = ""; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; - FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks \"$BAZEL_WORKSPACE_ROOT/bazel-out/ios-sim_arm64-min12.0-applebin_ios-ios_sim_arm64-dbg-ST-008b8551197e/bin/tests/ios/app/FW\""; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; HEADER_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT\""; INFOPLIST_FILE = ""; @@ -678,7 +678,7 @@ BAZEL_SWIFTMODULEFILES_TO_COPY = ""; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; - FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks \"$BAZEL_WORKSPACE_ROOT/bazel-out/ios-sim_arm64-min12.0-applebin_ios-ios_sim_arm64-dbg-ST-008b8551197e/bin/tests/ios/app/FW\""; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; HEADER_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT\""; INFOPLIST_FILE = "";