From d954cc40b8636db590ab7e32bf3d06c89b767791 Mon Sep 17 00:00:00 2001 From: Shawn Dempsey Date: Fri, 29 Jul 2022 08:49:26 -0700 Subject: [PATCH] [RN][macos] Enable Hermes for RNTester-macOS target Summary: **Context** On Core RN, Hermes for iOS can be enabled by setting a flag in the Podfile https://reactnative.dev/docs/hermes#ios | Since React Native 0.64, Hermes also runs on iOS. To enable Hermes for iOS, edit your ios/Podfile file and make the change illustrated below: ``` use_react_native!( :path => config[:reactNativePath], # to enable hermes on iOS, change `false` to `true` and then install pods # By default, Hermes is disabled on Old Architecture, and enabled on New Architecture. # You can enable/disable it manually by replacing `flags[:hermes_enabled]` with `true` or `false`. :hermes_enabled => true ) ``` In the RNTester Podfile, Hermes is enabled using envvar: https://github.com/facebook/react-native/blob/main/packages/rn-tester/Podfile#L27 ``` # Hermes is now enabled by default. # The following line will only disable Hermes if the USE_HERMES envvar is SET to a value other than 1 (e.g. USE_HERMES=0). hermes_enabled = !ENV.has_key?('USE_HERMES') || ENV['USE_HERMES'] == '1' ``` Build command: `USE_HERMES=1 bundle exec pod install` This will install the Hermes runtime Pod (not build it from scratch) & thus enable the `RCT_USE_HERMES` macro. https://www.internalfb.com/code/fbsource/[9f57823a75a40d3f8559c8f1b7ae0add8e95d6dc]/xplat/js/react-native-github/packages/rn-tester/RNTester/AppDelegate.mm?lines=10-16 --- On RN Desktop, the Hermes flag was [set to false](https://github.com/microsoft/react-native-macos/pull/780) due to M1 build reasons which have since been resolved. - https://github.com/microsoft/react-native-macos/issues/952 - https://github.com/microsoft/react-native-macos/issues/781 Curiously, the `RNTester-macOS` target AppDelegate was never updated to import & use Hermes when `RCT_USE_HERMES` was `true`. Only the `RNTester` for mobile had the correct Hermes usage. **RNTester-macOS:** https://github.com/microsoft/react-native-macos/blob/main/packages/rn-tester/RNTester-macOS/AppDelegate.mm **RNTester:** https://github.com/microsoft/react-native-macos/blob/main/packages/rn-tester/RNTester/AppDelegate.mm -- The documentation for enabling Hermes on RN Desktop macOS are outdated: https://microsoft.github.io/react-native-windows/docs/hermes#hermes-on-macos > Install the npm package yarn add 'hermes-engine-darwin@^0.4.3' * `hermes-engine-darwin` npm package is no longer required > Add (or uncomment) the following pod dependencies to your macOS target in your Podfile: pod 'React-Core/Hermes', :path => '../node_modules/react-native-macos/' pod 'hermes', :path => '../node_modules/hermes-engine-darwin' pod 'libevent', :podspec => '../node_modules/react-native-macos/third-party-podspecs/libevent.podspec' * Setting `USE_HERMES=1` during `pod install` replaces these manual steps > Copy Run pod install Be sure to set your target's deployment target to at least 10.14 before running pod install * `USE_HERMES=1 bundle exec pod install --verbose` --- **Change** * Remove `pods(:hermes_enabled => true)` in favor of passing `USE_HERMES=1` to `pod install` (This is how it's done on RNTester iOS) * Copy Hermes support to `RNTester-macOS` AppDelegate Test Plan: ## Hermes Enabled ``` cd packages/rn-tester # Ensure fresh pod install & `RCT_USE_HERMES` works rm -rf Pods # Install pods USE_HERMES=1 bundle exec pod install --verbose # Note the installing of hermes-engine -> Installing hermes-engine (0.11.0) > Copying hermes-engine from `/Users/shawndempsey/Library/Caches/CocoaPods/Pods/Release/hermes-engine/0.11.0-84e3a` to `Pods/hermes-engine` # Open in xcode open RNTesterPods.xcworkspace ``` `React-hermes` should be installed {F756792783} |Connect to Hermes w/ Flipper| |https://pxl.cl/28RTj| --- ## Hermes disabled ``` bundle exec pod install --verbose ``` `React-hermes` is **not** installed {F756795691} |Herms is not active| |https://pxl.cl/28RWK| Reviewers: lyahdav, ericroz, chpurrer, #seller_expansion Reviewed By: lyahdav Differential Revision: https://phabricator.intern.facebook.com/D38277077 Tasks: T127659495 Tags: marketplace, marketplace_seller_expansion --- packages/rn-tester/Podfile | 2 +- .../rn-tester/RNTester-macOS/AppDelegate.mm | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/rn-tester/Podfile b/packages/rn-tester/Podfile index 781a29eebbc6c0..5fe1b46b3a6b4e 100644 --- a/packages/rn-tester/Podfile +++ b/packages/rn-tester/Podfile @@ -87,7 +87,7 @@ end target 'RNTester-macOS' do platform :osx, '10.15' - pods(:hermes_enabled => false) + pods() end target 'RNTester-macOSUnitTests' do diff --git a/packages/rn-tester/RNTester-macOS/AppDelegate.mm b/packages/rn-tester/RNTester-macOS/AppDelegate.mm index 77a7d7d89e0843..372ae3fac63112 100644 --- a/packages/rn-tester/RNTester-macOS/AppDelegate.mm +++ b/packages/rn-tester/RNTester-macOS/AppDelegate.mm @@ -8,8 +8,21 @@ #import "AppDelegate.h" -#import +#ifndef RCT_USE_HERMES +#if __has_include() +#define RCT_USE_HERMES 1 +#else +#define RCT_USE_HERMES 0 +#endif +#endif + +#if RCT_USE_HERMES +#import +#else #import +#endif + +#import #import #import #import @@ -106,7 +119,11 @@ - (NSURL *)sourceURLForBridge:(__unused RCTBridge *)bridge #endif __weak __typeof(self) weakSelf = self; +#if RCT_USE_HERMES + return std::make_unique( +#else return std::make_unique( +#endif facebook::react::RCTJSIExecutorRuntimeInstaller([weakSelf, bridge](facebook::jsi::Runtime &runtime) { if (!bridge) { return;