Skip to content

Commit

Permalink
Remove private headers exposed by podspecs (microsoft#940)
Browse files Browse the repository at this point in the history
Summary:
X-link: facebook/litho#940

X-link: facebook/yoga#1252

Pull Request resolved: facebook#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

facebook#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]

Reviewed By: rshest

Differential Revision: D45139075

fbshipit-source-id: ad6c0b5b5a7aa5fbf849c3ca62f3fe330601b19a
  • Loading branch information
NickGerleman authored and facebook-github-bot committed Apr 26, 2023
1 parent c1dea41 commit 17f8666
Show file tree
Hide file tree
Showing 20 changed files with 43 additions and 53 deletions.
Expand Up @@ -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"
Expand All @@ -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 }
Expand Down
1 change: 1 addition & 0 deletions packages/react-native/React/React-RCTFabric.podspec
Expand Up @@ -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\"",

Expand Down
3 changes: 2 additions & 1 deletion packages/react-native/ReactCommon/React-Fabric.podspec
Expand Up @@ -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']
Expand Down Expand Up @@ -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

Expand Down
11 changes: 8 additions & 3 deletions packages/react-native/ReactCommon/yoga/Yoga.podspec
Expand Up @@ -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
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/BitUtils.h
Expand Up @@ -7,8 +7,6 @@

#pragma once

#ifdef __cplusplus

#include <cstdio>
#include <cstdint>
#include "YGEnums.h"
Expand Down Expand Up @@ -67,5 +65,3 @@ inline void setBooleanData(uint8_t& flags, size_t index, bool value) {
} // namespace detail
} // namespace yoga
} // namespace facebook

#endif
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/CompactValue.h
Expand Up @@ -7,8 +7,6 @@

#pragma once

#ifdef __cplusplus

#if defined(__has_include) && __has_include(<version>)
// needed to be able to evaluate defined(__cpp_lib_bit_cast)
#include <version>
Expand Down Expand Up @@ -212,5 +210,3 @@ constexpr bool operator!=(CompactValue a, CompactValue b) noexcept {
} // namespace detail
} // namespace yoga
} // namespace facebook

#endif
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/Utils.h
Expand Up @@ -7,8 +7,6 @@

#pragma once

#ifdef __cplusplus

#include "YGNode.h"
#include "Yoga-internal.h"
#include "CompactValue.h"
Expand Down Expand Up @@ -146,5 +144,3 @@ inline YGFloatOptional YGResolveValueMargin(
const float ownerSize) {
return value.isAuto() ? YGFloatOptional{0} : YGResolveValue(value, ownerSize);
}

#endif
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/YGConfig.h
Expand Up @@ -7,8 +7,6 @@

#pragma once

#ifdef __cplusplus

#include "Yoga-internal.h"
#include "Yoga.h"

Expand Down Expand Up @@ -77,5 +75,3 @@ struct YOGA_EXPORT YGConfig {
setCloneNodeCallback(YGCloneNodeFunc{nullptr});
}
};

#endif
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/YGFloatOptional.h
Expand Up @@ -7,8 +7,6 @@

#pragma once

#ifdef __cplusplus

#include <cmath>
#include <limits>
#include "Yoga-internal.h"
Expand Down Expand Up @@ -70,5 +68,3 @@ inline bool operator>=(YGFloatOptional lhs, YGFloatOptional rhs) {
inline bool operator<=(YGFloatOptional lhs, YGFloatOptional rhs) {
return lhs < rhs || lhs == rhs;
}

#endif
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/YGLayout.h
Expand Up @@ -7,8 +7,6 @@

#pragma once

#ifdef __cplusplus

#include "BitUtils.h"
#include "YGFloatOptional.h"
#include "Yoga-internal.h"
Expand Down Expand Up @@ -63,5 +61,3 @@ struct YGLayout {
bool operator==(YGLayout layout) const;
bool operator!=(YGLayout layout) const { return !(*this == layout); }
};

#endif
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/YGNode.h
Expand Up @@ -7,8 +7,6 @@

#pragma once

#ifdef __cplusplus

#include <cstdint>
#include <stdio.h>
#include "CompactValue.h"
Expand Down Expand Up @@ -337,5 +335,3 @@ struct YOGA_EXPORT YGNode {
bool isNodeFlexible();
void reset();
};

#endif
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/YGNodePrint.h
Expand Up @@ -9,8 +9,6 @@

#pragma once

#ifdef __cplusplus

#include <string>

#include "Yoga.h"
Expand All @@ -28,5 +26,3 @@ void YGNodeToString(
} // namespace facebook

#endif

#endif
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/YGStyle.h
Expand Up @@ -7,8 +7,6 @@

#pragma once

#ifdef __cplusplus

#include <algorithm>
#include <array>
#include <cstdint>
Expand Down Expand Up @@ -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
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h
Expand Up @@ -7,8 +7,6 @@

#pragma once

#ifdef __cplusplus

#include <algorithm>
#include <array>
#include <cmath>
Expand Down Expand Up @@ -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
4 changes: 0 additions & 4 deletions packages/react-native/ReactCommon/yoga/yoga/log.h
Expand Up @@ -7,8 +7,6 @@

#pragma once

#ifdef __cplusplus

#include "YGEnums.h"

struct YGNode;
Expand Down Expand Up @@ -38,5 +36,3 @@ struct Log {
} // namespace detail
} // namespace yoga
} // namespace facebook

#endif
Expand Up @@ -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': {
Expand Down
Expand Up @@ -129,7 +129,7 @@ def test_installModulesDependencies_whenNewArchEnabledAndNewArchAndNoSearchPaths

# Assert
assert_equal(spec.compiler_flags, NewArchitectureHelper.folly_compiler_flags)
assert_equal(spec.pod_target_xcconfig["HEADER_SEARCH_PATHS"], "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTFabric/RCTFabric.framework/Headers\"")
assert_equal(spec.pod_target_xcconfig["HEADER_SEARCH_PATHS"], "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/Headers/Private/Yoga\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTFabric/RCTFabric.framework/Headers\"")
assert_equal(spec.pod_target_xcconfig["CLANG_CXX_LANGUAGE_STANDARD"], "c++17")
assert_equal(spec.pod_target_xcconfig["OTHER_CPLUSPLUSFLAGS"], "$(inherited) -DRCT_NEW_ARCH_ENABLED=1 -DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1")
assert_equal(
Expand Down Expand Up @@ -161,7 +161,7 @@ def test_installModulesDependencies_whenNewArchDisabledAndSearchPathsAndCompiler

# Assert
assert_equal(spec.compiler_flags, "-Wno-nullability-completeness #{NewArchitectureHelper.folly_compiler_flags}")
assert_equal(spec.pod_target_xcconfig["HEADER_SEARCH_PATHS"], "#{other_flags} \"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTFabric/RCTFabric.framework/Headers\"")
assert_equal(spec.pod_target_xcconfig["HEADER_SEARCH_PATHS"], "#{other_flags} \"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/Headers/Private/Yoga\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTFabric/RCTFabric.framework/Headers\"")
assert_equal(spec.pod_target_xcconfig["CLANG_CXX_LANGUAGE_STANDARD"], "c++17")
assert_equal(
spec.dependencies,
Expand Down
1 change: 1 addition & 0 deletions packages/react-native/scripts/cocoapods/codegen_utils.rb
Expand Up @@ -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 = []

Expand Down
Expand Up @@ -87,7 +87,7 @@ def self.install_modules_dependencies(spec, new_arch_enabled, folly_version)
current_config = hash["pod_target_xcconfig"] != nil ? hash["pod_target_xcconfig"] : {}
current_headers = current_config["HEADER_SEARCH_PATHS"] != nil ? current_config["HEADER_SEARCH_PATHS"] : ""

header_search_paths = ["\"$(PODS_ROOT)/boost\""]
header_search_paths = ["\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/Headers/Private/Yoga\""]
if ENV['USE_FRAMEWORKS']
header_search_paths << "\"$(PODS_ROOT)/DoubleConversion\""
header_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\""
Expand Down
24 changes: 24 additions & 0 deletions packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj
Expand Up @@ -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 = (
Expand Down Expand Up @@ -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 = (
Expand Down Expand Up @@ -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 = (
Expand Down Expand Up @@ -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 = (
Expand Down Expand Up @@ -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 = (
Expand Down Expand Up @@ -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 = (
Expand Down

0 comments on commit 17f8666

Please sign in to comment.