diff --git a/scripts/cocoapods/__tests__/utils-test.rb b/scripts/cocoapods/__tests__/utils-test.rb index fd1fdc3c5a1507..48b469f9fea269 100644 --- a/scripts/cocoapods/__tests__/utils-test.rb +++ b/scripts/cocoapods/__tests__/utils-test.rb @@ -435,6 +435,60 @@ def test_applyMacCatalystPatches_correctlyAppliesNecessaryPatches assert_equal(user_project_mock.save_invocation_count, 1) end + # ================================= # + # Test - Apply Xcode 15 Patch # + # ================================= # + + def test_applyXcode15Patch_correctlyAppliesNecessaryPatch + # Arrange + first_target = prepare_target("FirstTarget") + second_target = prepare_target("SecondTarget") + third_target = TargetMock.new("ThirdTarget", [ + BuildConfigurationMock.new("Debug", { + "GCC_PREPROCESSOR_DEFINITIONS" => '$(inherited) "SomeFlag=1" ' + }), + BuildConfigurationMock.new("Release", { + "GCC_PREPROCESSOR_DEFINITIONS" => '$(inherited) "SomeFlag=1" ' + }), + ], nil) + + user_project_mock = UserProjectMock.new("a/path", [ + prepare_config("Debug"), + prepare_config("Release"), + ], + :native_targets => [ + first_target, + second_target + ] + ) + pods_projects_mock = PodsProjectMock.new([], {"hermes-engine" => {}}, :native_targets => [ + third_target + ]) + installer = InstallerMock.new(pods_projects_mock, [ + AggregatedProjectMock.new(user_project_mock) + ]) + + # Act + ReactNativePodsUtils.apply_xcode_15_patch(installer) + + # Assert + first_target.build_configurations.each do |config| + assert_equal(config.build_settings["GCC_PREPROCESSOR_DEFINITIONS"].strip, + '$(inherited) "_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION"' + ) + end + second_target.build_configurations.each do |config| + assert_equal(config.build_settings["GCC_PREPROCESSOR_DEFINITIONS"].strip, + '$(inherited) "_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION"' + ) + end + third_target.build_configurations.each do |config| + assert_equal(config.build_settings["GCC_PREPROCESSOR_DEFINITIONS"].strip, + '$(inherited) "SomeFlag=1" "_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION"' + ) + end + end + # ==================================== # # Test - Set Node_Modules User Setting # # ==================================== # diff --git a/scripts/cocoapods/utils.rb b/scripts/cocoapods/utils.rb index e5cc2e3c3df7b1..df23da4779e758 100644 --- a/scripts/cocoapods/utils.rb +++ b/scripts/cocoapods/utils.rb @@ -131,6 +131,18 @@ def self.apply_mac_catalyst_patches(installer) end end + def self.apply_xcode_15_patch(installer) + installer.target_installation_results.pod_target_installation_results + .each do |pod_name, target_installation_result| + target_installation_result.native_target.build_configurations.each do |config| + # unary_function and binary_function are no longer provided in C++17 and newer standard modes as part of Xcode 15. They can be re-enabled with setting _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION + # Ref: https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Deprecations + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= '$(inherited) ' + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << '"_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION" ' + end + end + end + private def self.fix_library_search_path(config) diff --git a/scripts/react_native_pods.rb b/scripts/react_native_pods.rb index 88199595db674d..6be410977790cf 100644 --- a/scripts/react_native_pods.rb +++ b/scripts/react_native_pods.rb @@ -223,6 +223,7 @@ def react_native_post_install(installer, react_native_path = "../node_modules/re ReactNativePodsUtils.exclude_i386_architecture_while_using_hermes(installer) ReactNativePodsUtils.fix_library_search_paths(installer) ReactNativePodsUtils.set_node_modules_user_settings(installer, react_native_path) + ReactNativePodsUtils.apply_xcode_15_patch(installer) NewArchitectureHelper.set_clang_cxx_language_standard_if_needed(installer) is_new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == "1"