From 9b5e6e7e8acd8038dddc55e32e88b3c1e418ee55 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Mon, 24 Apr 2023 13:28:09 -0700 Subject: [PATCH] Remove private headers exposed by podspecs (#1252) Summary: X-link: https://github.com/facebook/yoga/pull/1252 Pull Request resolved: https://github.com/facebook/react-native/pull/36993 Fabric relies on the private C++ internals of Yoga. This creates a conundrum in the open source build due to how header creation in Cocoapods works. 1. The default mechanism of specifying public headers needs to include the private headers for them to be made usable by fabric (by default) 2. Cocoapods will roll up all of the public headers when importing a module https://github.com/facebook/react-native/pull/33381 fixed the Fabric Cocoapods build which ran into this. React Native relies on FlipperKit which relies on YogaKit, which in turn finally imports the Yoga podspec. Because YogaKit may use Swift, we can only expose the public Yoga C ABI. The first solution in that PR was to allow RN to access Yoga private headers, but this was changed to instead make all Yoga headers public, and to add ifdefs to all of them to no-op when included outside of a C++ environment. Talking to Kudo, we should be able to change back to the earlier approach in the PR, to instead expose the private headers to only RN. This lets us avoid exposing headers that we ideally wouldn't be, and lets us avoid the messy ifdefs in every Yoga header. Changelog: [Internal] Differential Revision: D45139075 fbshipit-source-id: 9220756c29b7f5f2bc95e7df126fb789e5c5833f --- .../AppDelegate/React-RCTAppDelegate.podspec | 5 ++-- .../React/React-RCTFabric.podspec | 1 + .../ReactCommon/React-Fabric.podspec | 3 ++- .../ReactCommon/yoga/Yoga.podspec | 11 ++++++--- .../ReactCommon/yoga/yoga/BitUtils.h | 4 ---- .../ReactCommon/yoga/yoga/CompactValue.h | 4 ---- .../ReactCommon/yoga/yoga/Utils.h | 4 ---- .../ReactCommon/yoga/yoga/YGConfig.h | 4 ---- .../ReactCommon/yoga/yoga/YGFloatOptional.h | 4 ---- .../ReactCommon/yoga/yoga/YGLayout.h | 4 ---- .../ReactCommon/yoga/yoga/YGNode.h | 4 ---- .../ReactCommon/yoga/yoga/YGNodePrint.h | 4 ---- .../ReactCommon/yoga/yoga/YGStyle.h | 4 ---- .../ReactCommon/yoga/yoga/Yoga-internal.h | 4 ---- .../react-native/ReactCommon/yoga/yoga/log.h | 4 ---- .../cocoapods/__tests__/codegen_utils-test.rb | 1 + .../scripts/cocoapods/codegen_utils.rb | 1 + .../MyNativeView.podspec | 2 +- .../RNTesterPods.xcodeproj/project.pbxproj | 24 +++++++++++++++++++ 19 files changed, 41 insertions(+), 51 deletions(-) diff --git a/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec b/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec index c37f0a9fa22d26..79d042eeaf53f9 100644 --- a/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec +++ b/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec @@ -36,7 +36,8 @@ header_search_paths = [ "$(PODS_ROOT)/RCT-Folly", "${PODS_ROOT}/Headers/Public/FlipperKit", "$(PODS_ROOT)/Headers/Public/ReactCommon", - "$(PODS_ROOT)/Headers/Public/React-RCTFabric" + "$(PODS_ROOT)/Headers/Public/React-RCTFabric", + "$(PODS_ROOT)/Headers/Private/Yoga", ].concat(use_hermes ? [ "$(PODS_ROOT)/Headers/Public/React-hermes", "$(PODS_ROOT)/Headers/Public/hermes-engine" @@ -54,7 +55,7 @@ Pod::Spec.new do |s| s.version = version s.summary = "An utility library to simplify common operations for the New Architecture" s.homepage = "https://reactnative.dev/" - s.documentation_url = "https://reactnative.dev/docs/actionsheetios" + s.documentation_url = "https://reactnative.dev/" s.license = package["license"] s.author = "Meta Platforms, Inc. and its affiliates" s.platforms = { :ios => min_ios_version_supported } diff --git a/packages/react-native/React/React-RCTFabric.podspec b/packages/react-native/React/React-RCTFabric.podspec index 944e50a66bd769..a71035a63d90a6 100644 --- a/packages/react-native/React/React-RCTFabric.podspec +++ b/packages/react-native/React/React-RCTFabric.podspec @@ -27,6 +27,7 @@ header_search_paths = [ "\"$(PODS_ROOT)/DoubleConversion\"", "\"$(PODS_ROOT)/RCT-Folly\"", "\"$(PODS_ROOT)/Headers/Private/React-Core\"", + "\"$(PODS_ROOT)/Headers/Private/Yoga\"", "\"$(PODS_ROOT)/Headers/Public/React-Codegen\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Codegen/React_Codegen.framework/Headers\"", diff --git a/packages/react-native/ReactCommon/React-Fabric.podspec b/packages/react-native/ReactCommon/React-Fabric.podspec index b928b66214c21a..e15f4bc1614e97 100644 --- a/packages/react-native/ReactCommon/React-Fabric.podspec +++ b/packages/react-native/ReactCommon/React-Fabric.podspec @@ -82,6 +82,7 @@ Pod::Spec.new do |s| "\"$(PODS_ROOT)/boost\"", "\"$(PODS_TARGET_SRCROOT)/ReactCommon\"", "\"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/Headers/Private/Yoga\"", ] if ENV['USE_FRAMEWORKS'] @@ -220,7 +221,7 @@ Pod::Spec.new do |s| sss.source_files = "react/renderer/components/view/**/*.{m,mm,cpp,h}" sss.exclude_files = "react/renderer/components/view/tests" sss.header_dir = "react/renderer/components/view" - + sss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/Headers/Private/Yoga\"" } end end diff --git a/packages/react-native/ReactCommon/yoga/Yoga.podspec b/packages/react-native/ReactCommon/yoga/Yoga.podspec index e86ce76b356a89..7e68f6dc4fa5c4 100644 --- a/packages/react-native/ReactCommon/yoga/Yoga.podspec +++ b/packages/react-native/ReactCommon/yoga/Yoga.podspec @@ -51,7 +51,12 @@ Pod::Spec.new do |spec| source_files = File.join('ReactCommon/yoga', source_files) if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION'] spec.source_files = source_files - header_files = 'yoga/*.h' - header_files = File.join('ReactCommon/yoga', header_files) if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION'] - spec.public_header_files = header_files + public_header_files = 'yoga/{Yoga,YGEnums,YGMacros,YGValue}.h' + public_header_files = File.join('ReactCommon/yoga', public_header_files) if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION'] + spec.public_header_files = public_header_files + + # Fabric must be able to access private headers (which should not be included in the umbrella header) + all_header_files = 'yoga/**/*.h' + all_header_files = File.join('ReactCommon/yoga', all_header_files) if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION'] + spec.private_header_files = Dir.glob(all_header_files) - Dir.glob(public_header_files) end diff --git a/packages/react-native/ReactCommon/yoga/yoga/BitUtils.h b/packages/react-native/ReactCommon/yoga/yoga/BitUtils.h index a60ea7609cada3..b17751ad3319d2 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/BitUtils.h +++ b/packages/react-native/ReactCommon/yoga/yoga/BitUtils.h @@ -7,8 +7,6 @@ #pragma once -#ifdef __cplusplus - #include #include #include "YGEnums.h" @@ -67,5 +65,3 @@ inline void setBooleanData(uint8_t& flags, size_t index, bool value) { } // namespace detail } // namespace yoga } // namespace facebook - -#endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/CompactValue.h b/packages/react-native/ReactCommon/yoga/yoga/CompactValue.h index e489fbb614d4dc..26859330f3ba16 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/CompactValue.h +++ b/packages/react-native/ReactCommon/yoga/yoga/CompactValue.h @@ -7,8 +7,6 @@ #pragma once -#ifdef __cplusplus - #if defined(__has_include) && __has_include() // needed to be able to evaluate defined(__cpp_lib_bit_cast) #include @@ -212,5 +210,3 @@ constexpr bool operator!=(CompactValue a, CompactValue b) noexcept { } // namespace detail } // namespace yoga } // namespace facebook - -#endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/Utils.h b/packages/react-native/ReactCommon/yoga/yoga/Utils.h index 82867a5774a8bd..376c4fb55c7e7e 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/Utils.h +++ b/packages/react-native/ReactCommon/yoga/yoga/Utils.h @@ -7,8 +7,6 @@ #pragma once -#ifdef __cplusplus - #include "YGNode.h" #include "Yoga-internal.h" #include "CompactValue.h" @@ -146,5 +144,3 @@ inline YGFloatOptional YGResolveValueMargin( const float ownerSize) { return value.isAuto() ? YGFloatOptional{0} : YGResolveValue(value, ownerSize); } - -#endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h b/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h index e15cc1225334e0..77ce16fb2e3422 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h @@ -7,8 +7,6 @@ #pragma once -#ifdef __cplusplus - #include "Yoga-internal.h" #include "Yoga.h" @@ -77,5 +75,3 @@ struct YOGA_EXPORT YGConfig { setCloneNodeCallback(YGCloneNodeFunc{nullptr}); } }; - -#endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGFloatOptional.h b/packages/react-native/ReactCommon/yoga/yoga/YGFloatOptional.h index 6af7bbafbfbdcb..4aa9e76e2993fb 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGFloatOptional.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGFloatOptional.h @@ -7,8 +7,6 @@ #pragma once -#ifdef __cplusplus - #include #include #include "Yoga-internal.h" @@ -70,5 +68,3 @@ inline bool operator>=(YGFloatOptional lhs, YGFloatOptional rhs) { inline bool operator<=(YGFloatOptional lhs, YGFloatOptional rhs) { return lhs < rhs || lhs == rhs; } - -#endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGLayout.h b/packages/react-native/ReactCommon/yoga/yoga/YGLayout.h index e95efbcc2446cd..166eabb64d9106 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGLayout.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGLayout.h @@ -7,8 +7,6 @@ #pragma once -#ifdef __cplusplus - #include "BitUtils.h" #include "YGFloatOptional.h" #include "Yoga-internal.h" @@ -63,5 +61,3 @@ struct YGLayout { bool operator==(YGLayout layout) const; bool operator!=(YGLayout layout) const { return !(*this == layout); } }; - -#endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGNode.h b/packages/react-native/ReactCommon/yoga/yoga/YGNode.h index 098c1b5ea22ad1..8ca6c35988de79 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGNode.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGNode.h @@ -7,8 +7,6 @@ #pragma once -#ifdef __cplusplus - #include #include #include "CompactValue.h" @@ -344,5 +342,3 @@ struct YOGA_EXPORT YGNode { bool isNodeFlexible(); void reset(); }; - -#endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.h b/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.h index 83b3f860e4b5b5..f06d457c4dd019 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.h @@ -9,8 +9,6 @@ #pragma once -#ifdef __cplusplus - #include #include "Yoga.h" @@ -28,5 +26,3 @@ void YGNodeToString( } // namespace facebook #endif - -#endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGStyle.h b/packages/react-native/ReactCommon/yoga/yoga/YGStyle.h index 858b7cd1b4ab63..20ce4e056256b9 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGStyle.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGStyle.h @@ -7,8 +7,6 @@ #pragma once -#ifdef __cplusplus - #include #include #include @@ -237,5 +235,3 @@ YOGA_EXPORT bool operator==(const YGStyle& lhs, const YGStyle& rhs); YOGA_EXPORT inline bool operator!=(const YGStyle& lhs, const YGStyle& rhs) { return !(lhs == rhs); } - -#endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h b/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h index 9444bb5d1db768..e6f370d6bfa5d2 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h +++ b/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h @@ -7,8 +7,6 @@ #pragma once -#ifdef __cplusplus - #include #include #include @@ -154,5 +152,3 @@ static const float kDefaultFlexShrink = 0.0f; static const float kWebDefaultFlexShrink = 1.0f; extern bool YGFloatsEqual(const float a, const float b); - -#endif diff --git a/packages/react-native/ReactCommon/yoga/yoga/log.h b/packages/react-native/ReactCommon/yoga/yoga/log.h index b9bfea4f390f7e..1d270e82e40b9f 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/log.h +++ b/packages/react-native/ReactCommon/yoga/yoga/log.h @@ -7,8 +7,6 @@ #pragma once -#ifdef __cplusplus - #include "YGEnums.h" struct YGNode; @@ -38,5 +36,3 @@ struct Log { } // namespace detail } // namespace yoga } // namespace facebook - -#endif diff --git a/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb b/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb index c4e08a399a9357..c68fedeec10768 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/codegen_utils-test.rb @@ -547,6 +547,7 @@ def get_podspec_no_fabric_no_script "\"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"", "\"$(PODS_ROOT)/Headers/Private/React-Fabric\"", "\"$(PODS_ROOT)/Headers/Private/React-RCTFabric\"", + "\"$(PODS_ROOT)/Headers/Private/Yoga\"", ].join(' ') }, 'dependencies': { diff --git a/packages/react-native/scripts/cocoapods/codegen_utils.rb b/packages/react-native/scripts/cocoapods/codegen_utils.rb index a90acc21553b6f..b16aeb94424902 100644 --- a/packages/react-native/scripts/cocoapods/codegen_utils.rb +++ b/packages/react-native/scripts/cocoapods/codegen_utils.rb @@ -83,6 +83,7 @@ def get_react_codegen_spec(package_json_file, folly_version: '2021.07.22.00', fa "\"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\"", "\"$(PODS_ROOT)/Headers/Private/React-Fabric\"", "\"$(PODS_ROOT)/Headers/Private/React-RCTFabric\"", + "\"$(PODS_ROOT)/Headers/Private/Yoga\"", ] framework_search_paths = [] diff --git a/packages/rn-tester/NativeComponentExample/MyNativeView.podspec b/packages/rn-tester/NativeComponentExample/MyNativeView.podspec index 029ef1935d4db3..0aad01554e85ef 100644 --- a/packages/rn-tester/NativeComponentExample/MyNativeView.podspec +++ b/packages/rn-tester/NativeComponentExample/MyNativeView.podspec @@ -22,7 +22,7 @@ Pod::Spec.new do |s| s.author = "Meta Platforms, Inc. and its affiliates" s.source = { :git => "https://github.com/facebook/my-native-view.git", :tag => "#{s.version}" } s.pod_target_xcconfig = { - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/boost\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Codegen/React_Codegen.framework/Headers\"", + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/boost\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Codegen/React_Codegen.framework/Headers\" \"$(PODS_ROOT)/Headers/Private/Yoga\"", "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" } diff --git a/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj b/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj index ff44d2b4f188f6..4e5505f231fb69 100644 --- a/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj +++ b/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj @@ -842,6 +842,10 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = RNTester/RNTester.entitlements; DEVELOPMENT_TEAM = ""; + HEADER_SEARCH_PATHS = ( + "${PODS_ROOT}/Headers/Private/Yoga", + "$(inherited)", + ); INFOPLIST_FILE = "$(SRCROOT)/RNTester/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( @@ -875,6 +879,10 @@ CODE_SIGN_ENTITLEMENTS = RNTester/RNTester.entitlements; DEVELOPMENT_TEAM = ""; EXCLUDED_ARCHS = ""; + HEADER_SEARCH_PATHS = ( + "${PODS_ROOT}/Headers/Private/Yoga", + "$(inherited)", + ); INFOPLIST_FILE = "$(SRCROOT)/RNTester/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( @@ -1084,6 +1092,10 @@ CODE_SIGN_STYLE = Automatic; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; + HEADER_SEARCH_PATHS = ( + "${PODS_ROOT}/Headers/Private/Yoga", + "$(inherited)", + ); INFOPLIST_FILE = RNTesterUnitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( @@ -1122,6 +1134,10 @@ COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; + HEADER_SEARCH_PATHS = ( + "${PODS_ROOT}/Headers/Private/Yoga", + "$(inherited)", + ); INFOPLIST_FILE = RNTesterUnitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( @@ -1163,6 +1179,10 @@ "FB_REFERENCE_IMAGE_DIR=\"\\\"$(SOURCE_ROOT)/RNTesterIntegrationTests/ReferenceImages\\\"\"", "$(inherited)", ); + HEADER_SEARCH_PATHS = ( + "${PODS_ROOT}/Headers/Private/Yoga", + "$(inherited)", + ); INFOPLIST_FILE = RNTesterIntegrationTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( @@ -1198,6 +1218,10 @@ COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; + HEADER_SEARCH_PATHS = ( + "${PODS_ROOT}/Headers/Private/Yoga", + "$(inherited)", + ); INFOPLIST_FILE = RNTesterIntegrationTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = (