From 4d153f81eff946361b406a95c5eb7f82d840e9c1 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Sun, 29 Jan 2023 23:58:57 -0800 Subject: [PATCH 1/3] Restore Dynamic framework with JSC in the Old Architecture Summary: I discovered that 0.69 and 0.70 could run React Native as Dynamic framework with JSC and starting from 0.71 that's not possible anymore. This diff restore that possibility. ## Changelog [iOS][Fixed] - Add Back dynamic framework support for the old architecture Differential Revision: D42829137 fbshipit-source-id: 191591e85ecc5a2e509d283c52a18ab00b4319a5 --- React-Core.podspec | 4 ++++ React/CoreModules/React-CoreModules.podspec | 1 + 2 files changed, 5 insertions(+) diff --git a/React-Core.podspec b/React-Core.podspec index b0bc4959222..0048703bf5b 100644 --- a/React-Core.podspec +++ b/React-Core.podspec @@ -114,4 +114,8 @@ Pod::Spec.new do |s| s.dependency "React-jsiexecutor", version s.dependency "Yoga" s.dependency "glog" + + if ENV['USE_HERMES'] == "0" + s.dependency 'React-jsc' + end end diff --git a/React/CoreModules/React-CoreModules.podspec b/React/CoreModules/React-CoreModules.podspec index 90c8adf1bc2..89f79da17b4 100644 --- a/React/CoreModules/React-CoreModules.podspec +++ b/React/CoreModules/React-CoreModules.podspec @@ -44,4 +44,5 @@ Pod::Spec.new do |s| s.dependency "React-RCTImage", version s.dependency "ReactCommon/turbomodule/core", version s.dependency "React-jsi", version + s.dependency 'React-RCTBlob' end From 42e0bfcb89b00391d604b4ca7baa1b30b86679d8 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Sun, 29 Jan 2023 23:58:57 -0800 Subject: [PATCH 2/3] Restore Dynamic framework with Hermes in the Old Architecture Summary: I discovered that 0.69 could run React Native as Dynamic framework with Hermes and starting from 0.70 that's not possible anymore. This diff restore that possibility. Notice that now Hermes provisdes JSI and Dynamic Frameworks requires that all the dependencies are explicitly defined, therefore, whenever we have a pod that depended on `React-jsi`, now it also has to explicitly depends on `hermes-engine` ## Changelog [iOS][Fixed] - Add Back dynamic framework support for the Old Architecture with Hermes Differential Revision: https://internalfb.com/D42829728 fbshipit-source-id: 107b524e833db1cd81a8821adff1143ffc758afa --- Libraries/Blob/React-RCTBlob.podspec | 4 ++++ React-Core.podspec | 23 ++++++++++++++----- ReactCommon/ReactCommon.podspec | 8 ++++++- ReactCommon/cxxreact/React-cxxreact.podspec | 4 ++++ ReactCommon/hermes/React-hermes.podspec | 1 + .../jsiexecutor/React-jsiexecutor.podspec | 4 ++++ 6 files changed, 37 insertions(+), 7 deletions(-) diff --git a/Libraries/Blob/React-RCTBlob.podspec b/Libraries/Blob/React-RCTBlob.podspec index 3d69eeced3a..b3a557dbaea 100644 --- a/Libraries/Blob/React-RCTBlob.podspec +++ b/Libraries/Blob/React-RCTBlob.podspec @@ -45,4 +45,8 @@ Pod::Spec.new do |s| s.dependency "React-Core/RCTBlobHeaders", version s.dependency "React-Core/RCTWebSocket", version s.dependency "React-RCTNetwork", version + + if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" + s.dependency "hermes-engine" + end end diff --git a/React-Core.podspec b/React-Core.podspec index 0048703bf5b..31db1b23d9a 100644 --- a/React-Core.podspec +++ b/React-Core.podspec @@ -75,12 +75,20 @@ Pod::Spec.new do |s| s.subspec "Default" do |ss| ss.source_files = "React/**/*.{c,h,m,mm,S,cpp}" - ss.exclude_files = "React/CoreModules/**/*", - "React/DevSupport/**/*", - "React/Fabric/**/*", - "React/FBReactNativeSpec/**/*", - "React/Tests/**/*", - "React/Inspector/**/*" + exclude_files = [ + "React/CoreModules/**/*", + "React/DevSupport/**/*", + "React/Fabric/**/*", + "React/FBReactNativeSpec/**/*", + "React/Tests/**/*", + "React/Inspector/**/*" + ] + # If we are using Hermes (the default is use hermes, so USE_HERMES can be nil), we don't have jsc installed + # So we have to exclude the JSCExecutorFactory + if ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1" + exclude_files = exclude_files.append("React/CxxBridge/JSCExecutorFactory.{h,mm}") + end + ss.exclude_files = exclude_files ss.private_header_files = "React/Cxx*/*.h" end @@ -117,5 +125,8 @@ Pod::Spec.new do |s| if ENV['USE_HERMES'] == "0" s.dependency 'React-jsc' + else + s.dependency 'React-hermes' + s.dependency 'hermes-engine' end end diff --git a/ReactCommon/ReactCommon.podspec b/ReactCommon/ReactCommon.podspec index 39701310f6a..da424368772 100644 --- a/ReactCommon/ReactCommon.podspec +++ b/ReactCommon/ReactCommon.podspec @@ -19,7 +19,7 @@ end folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32 -Wno-gnu-zero-variadic-macro-arguments' folly_version = '2021.07.22.00' boost_compiler_flags = '-Wno-documentation' - +using_hermes = ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1" Pod::Spec.new do |s| s.name = "ReactCommon" s.module_name = "ReactCommon" @@ -49,6 +49,9 @@ Pod::Spec.new do |s| s.dependency "React-logger", version ss.dependency "DoubleConversion" ss.dependency "glog" + if using_hermes + ss.dependency "hermes-engine" + end ss.subspec "bridging" do |sss| sss.dependency "React-jsi", version @@ -56,6 +59,9 @@ Pod::Spec.new do |s| sss.exclude_files = "react/bridging/tests" sss.header_dir = "react/bridging" sss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ReactCommon\" \"$(PODS_ROOT)/RCT-Folly\"" } + if using_hermes + sss.dependency "hermes-engine" + end end ss.subspec "core" do |sss| diff --git a/ReactCommon/cxxreact/React-cxxreact.podspec b/ReactCommon/cxxreact/React-cxxreact.podspec index a2c66cf7eb5..26747a5b69f 100644 --- a/ReactCommon/cxxreact/React-cxxreact.podspec +++ b/ReactCommon/cxxreact/React-cxxreact.podspec @@ -47,4 +47,8 @@ Pod::Spec.new do |s| s.dependency "React-perflogger", version s.dependency "React-jsi", version s.dependency "React-logger", version + + if ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1" + s.dependency 'hermes-engine' + end end diff --git a/ReactCommon/hermes/React-hermes.podspec b/ReactCommon/hermes/React-hermes.podspec index 96bb1d0e152..425ef3c84c4 100644 --- a/ReactCommon/hermes/React-hermes.podspec +++ b/ReactCommon/hermes/React-hermes.podspec @@ -53,4 +53,5 @@ Pod::Spec.new do |s| s.dependency "glog" s.dependency "RCT-Folly/Futures", folly_version s.dependency "hermes-engine" + s.dependency "React-jsi" end diff --git a/ReactCommon/jsiexecutor/React-jsiexecutor.podspec b/ReactCommon/jsiexecutor/React-jsiexecutor.podspec index 23a29b9ff45..e97969d5e84 100644 --- a/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +++ b/ReactCommon/jsiexecutor/React-jsiexecutor.podspec @@ -41,4 +41,8 @@ Pod::Spec.new do |s| s.dependency "RCT-Folly", folly_version s.dependency "DoubleConversion" s.dependency "glog" + + if ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1" + s.dependency 'hermes-engine' + end end From db824c1b7c2869a669b711df8a87a044dfee8725 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Sun, 29 Jan 2023 23:59:18 -0800 Subject: [PATCH 3/3] Add Tests in CircleCI to check dynamic frameworks with the old arch Summary: This diff adds 4 tests in CircleCI to make sure we don't regress in the support of Dynamic Frameworks for the old architecture. ## Changelog [iOS][Fixed] - Add CircleCI tests for dynamic frameworks with the Old Architecture. Differential Revision: D42829895 fbshipit-source-id: 4d1983356f53942b1804c89628877d9e0ec04b08 --- .circleci/config.yml | 66 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 464cef6c10b..14cc5daaabc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -853,7 +853,7 @@ jobs: default: "StaticLibraries" description: Which kind of option we want to use for `use_frameworks!` type: enum - enum: ["StaticLibraries", "StaticFrameworks"] #TODO: Add "DynamicFrameworks" + enum: ["StaticLibraries", "StaticFrameworks", "DynamicFrameworks"] environment: - PROJECT_NAME: "iOSTemplateProject" - HERMES_WS_DIR: *hermes_workspace_root @@ -906,6 +906,8 @@ jobs: if [[ << parameters.use_frameworks >> == "StaticFrameworks" ]]; then export USE_FRAMEWORKS=static + elif [[ << parameters.use_frameworks >> == "DynamicFrameworks" ]]; then + export USE_FRAMEWORKS=dynamic fi bundle exec pod install @@ -1636,7 +1638,7 @@ workflows: flavor: ["Debug", "Release"] jsengine: ["Hermes", "JSC"] flipper: ["WithFlipper", "WithoutFlipper"] - use_frameworks: [ "StaticLibraries", "StaticFrameworks" ] #TODO: make it works with DynamicFrameworks + use_frameworks: ["StaticLibraries", "StaticFrameworks", "DynamicFrameworks"] exclude: - architecture: "NewArch" flavor: "Release" @@ -1648,11 +1650,21 @@ workflows: jsengine: "Hermes" flipper: "WithFlipper" use_frameworks: "StaticFrameworks" + - architecture: "NewArch" + flavor: "Release" + jsengine: "Hermes" + flipper: "WithFlipper" + use_frameworks: "DynamicFrameworks" - architecture: "NewArch" flavor: "Release" jsengine: "Hermes" flipper: "WithoutFlipper" use_frameworks: "StaticFrameworks" + - architecture: "NewArch" + flavor: "Release" + jsengine: "Hermes" + flipper: "WithoutFlipper" + use_frameworks: "DynamicFrameworks" - architecture: "NewArch" flavor: "Release" jsengine: "JSC" @@ -1663,11 +1675,21 @@ workflows: jsengine: "JSC" flipper: "WithFlipper" use_frameworks: "StaticFrameworks" + - architecture: "NewArch" + flavor: "Release" + jsengine: "JSC" + flipper: "WithFlipper" + use_frameworks: "DynamicFrameworks" - architecture: "NewArch" flavor: "Release" jsengine: "JSC" flipper: "WithoutFlipper" use_frameworks: "StaticFrameworks" + - architecture: "NewArch" + flavor: "Release" + jsengine: "JSC" + flipper: "WithoutFlipper" + use_frameworks: "DynamicFrameworks" - architecture: "OldArch" flavor: "Release" jsengine: "Hermes" @@ -1678,6 +1700,11 @@ workflows: jsengine: "Hermes" flipper: "WithFlipper" use_frameworks: "StaticFrameworks" + - architecture: "OldArch" + flavor: "Release" + jsengine: "Hermes" + flipper: "WithFlipper" + use_frameworks: "DynamicFrameworks" - architecture: "OldArch" flavor: "Release" jsengine: "JSC" @@ -1688,6 +1715,11 @@ workflows: jsengine: "JSC" flipper: "WithFlipper" use_frameworks: "StaticFrameworks" + - architecture: "OldArch" + flavor: "Release" + jsengine: "JSC" + flipper: "WithFlipper" + use_frameworks: "DynamicFrameworks" - architecture: "NewArch" flavor: "Debug" jsengine: "Hermes" @@ -1718,6 +1750,36 @@ workflows: jsengine: "JSC" flipper: "WithFlipper" use_frameworks: "StaticFrameworks" + - architecture: "NewArch" + flavor: "Debug" + jsengine: "Hermes" + flipper: "WithFlipper" + use_frameworks: "DynamicFrameworks" + - architecture: "NewArch" + flavor: "Debug" + jsengine: "Hermes" + flipper: "WithoutFlipper" + use_frameworks: "DynamicFrameworks" + - architecture: "NewArch" + flavor: "Debug" + jsengine: "JSC" + flipper: "WithFlipper" + use_frameworks: "DynamicFrameworks" + - architecture: "NewArch" + flavor: "Debug" + jsengine: "JSC" + flipper: "WithoutFlipper" + use_frameworks: "DynamicFrameworks" + - architecture: "OldArch" + flavor: "Debug" + jsengine: "Hermes" + flipper: "WithFlipper" + use_frameworks: "DynamicFrameworks" + - architecture: "OldArch" + flavor: "Debug" + jsengine: "JSC" + flipper: "WithFlipper" + use_frameworks: "DynamicFrameworks" - test_ios_rntester: requires: - build_hermes_macos