Skip to content

Commit

Permalink
patching flipper
Browse files Browse the repository at this point in the history
  • Loading branch information
hilat-autofleet committed Sep 11, 2024
1 parent 9ed1972 commit 431b844
Show file tree
Hide file tree
Showing 4 changed files with 215 additions and 2 deletions.
2 changes: 2 additions & 0 deletions examples/client/Locomotion/ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ target 'Locomotion' do
pod 'nanopb', :modular_headers => true

post_install do |installer|
puts 'Patching `Flipper` to compile with rn71'
%x(patch Pods/Flipper/xplat/Flipper/FlipperTransportTypes.h -N < patches/Flipper.patch)
react_native_post_install(
installer,
# Set `mac_catalyst_enabled` to `true` in order to apply patches
Expand Down
2 changes: 1 addition & 1 deletion examples/client/Locomotion/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1108,6 +1108,6 @@ SPEC CHECKSUMS:
Yoga: c618b544ff8bd8865cdca602f00cbcdb92fd6d31
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a

PODFILE CHECKSUM: 7361af9f15a97707191446fd9b9a1015127e4d0c
PODFILE CHECKSUM: 7674ea95849adcdf66f7bfddb75854b541112a11

COCOAPODS: 1.15.2
11 changes: 11 additions & 0 deletions examples/client/Locomotion/ios/patches/Flipper.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--- FlipperTransportTypes.h.original 2024-09-11 15:26:34
+++ Pods/Flipper/xplat/Flipper/FlipperTransportTypes.h 2024-09-10 15:52:09
@@ -6,7 +6,7 @@
*/

#pragma once
-
+#include <functional>
#include <string>

namespace facebook {
202 changes: 201 additions & 1 deletion examples/client/Locomotion/patches/react-native+0.71.0.patch
Original file line number Diff line number Diff line change
@@ -1 +1,201 @@

diff --git a/node_modules/react-native/scripts/.packager.env b/node_modules/react-native/scripts/.packager.env
new file mode 100644
index 0000000..361f5fb
--- /dev/null
+++ b/node_modules/react-native/scripts/.packager.env
@@ -0,0 +1 @@
+export RCT_METRO_PORT=8081
diff --git a/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec b/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec
index 247bc11..c9dffc4 100644
--- a/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec
+++ b/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec
@@ -43,7 +43,7 @@ elsif isNightly
destination_path = download_nightly_hermes(react_native_path, version)
# set tarball as hermes engine
source[:http] = "file://#{destination_path}"
-elsif File.exists?(hermestag_file) && isInCI
+elsif File.exists(hermestag_file) && isInCI
Pod::UI.puts '[Hermes] Detected that you are on a React Native release branch, building Hermes from source but fetched from tag...'.yellow if Object.const_defined?("Pod::UI")
hermestag = File.read(hermestag_file).strip
source[:git] = git
diff --git a/node_modules/react-native/sdks/hermes/hermes-engine.podspec b/node_modules/react-native/sdks/hermes/hermes-engine.podspec
new file mode 100644
index 0000000..c9dffc4
--- /dev/null
+++ b/node_modules/react-native/sdks/hermes/hermes-engine.podspec
@@ -0,0 +1,143 @@
+# Copyright (c) Meta Platforms, Inc. and affiliates.
+#
+# This source code is licensed under the MIT license found in the
+# LICENSE file in the root directory of this source tree.
+
+require "json"
+require_relative "./hermes-utils.rb"
+
+react_native_path = File.join(__dir__, "..", "..")
+
+# Whether Hermes is built for Release or Debug is determined by the PRODUCTION envvar.
+build_type = ENV['PRODUCTION'] == "1" ? :release : :debug
+
+# package.json
+package = JSON.parse(File.read(File.join(react_native_path, "package.json")))
+version = package['version']
+
+# sdks/.hermesversion
+hermestag_file = File.join(react_native_path, "sdks", ".hermesversion")
+isInCI = ENV['REACT_NATIVE_CI'] === 'true'
+
+source = {}
+git = "https://github.com/facebook/hermes.git"
+
+isInMain = version.include?('1000.0.0')
+isNightly = version.start_with?('0.0.0-')
+
+if ENV.has_key?('HERMES_ENGINE_TARBALL_PATH')
+ if !File.exist?(ENV['HERMES_ENGINE_TARBALL_PATH'])
+ abort "[Hermes] HERMES_ENGINE_TARBALL_PATH is set, but points to a non-existing file: \"#{ENV['HERMES_ENGINE_TARBALL_PATH']}\"\nIf you don't want to use tarball, run `unset HERMES_ENGINE_TARBALL_PATH`"
+ end
+end
+
+if ENV.has_key?('HERMES_ENGINE_TARBALL_PATH')
+ Pod::UI.puts "[Hermes] Using pre-built Hermes binaries from local path: #{ENV['HERMES_ENGINE_TARBALL_PATH']}".yellow if Object.const_defined?("Pod::UI")
+ source[:http] = "file://#{ENV['HERMES_ENGINE_TARBALL_PATH']}"
+elsif isInMain
+ Pod::UI.puts '[Hermes] Installing hermes-engine may take slightly longer, building Hermes compiler from source...'.yellow if Object.const_defined?("Pod::UI")
+ source[:git] = git
+ source[:commit] = `git ls-remote https://github.com/facebook/hermes main | cut -f 1`.strip
+elsif isNightly
+ Pod::UI.puts '[Hermes] Nightly version, download pre-built for Hermes'.yellow if Object.const_defined?("Pod::UI")
+ destination_path = download_nightly_hermes(react_native_path, version)
+ # set tarball as hermes engine
+ source[:http] = "file://#{destination_path}"
+elsif File.exists(hermestag_file) && isInCI
+ Pod::UI.puts '[Hermes] Detected that you are on a React Native release branch, building Hermes from source but fetched from tag...'.yellow if Object.const_defined?("Pod::UI")
+ hermestag = File.read(hermestag_file).strip
+ source[:git] = git
+ source[:tag] = hermestag
+else
+ # Sample url from Maven:
+ # https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.71.0/react-native-artifacts-0.71.0-hermes-ios-debug.tar.gz
+ source[:http] = "https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/#{version}/react-native-artifacts-#{version}-hermes-ios-#{build_type.to_s}.tar.gz"
+end
+
+Pod::Spec.new do |spec|
+ spec.name = "hermes-engine"
+ spec.version = version
+ spec.summary = "Hermes is a small and lightweight JavaScript engine optimized for running React Native."
+ spec.description = "Hermes is a JavaScript engine optimized for fast start-up of React Native apps. It features ahead-of-time static optimization and compact bytecode."
+ spec.homepage = "https://hermesengine.dev"
+ spec.license = package['license']
+ spec.author = "Facebook"
+ spec.source = source
+ spec.platforms = { :osx => "10.13", :ios => "12.4" }
+
+ spec.preserve_paths = '**/*.*'
+ spec.source_files = ''
+
+ spec.xcconfig = {
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
+ "CLANG_CXX_LIBRARY" => "compiler-default"
+ }.merge!(build_type == :debug ? { "GCC_PREPROCESSOR_DEFINITIONS" => "HERMES_ENABLE_DEBUGGER=1" } : {})
+
+ if source[:http] then
+
+ spec.subspec 'Pre-built' do |ss|
+ ss.preserve_paths = ["destroot/bin/*"].concat(build_type == :debug ? ["**/*.{h,c,cpp}"] : [])
+ ss.source_files = "destroot/include/**/*.h"
+ ss.exclude_files = ["destroot/include/jsi/jsi/JSIDynamic.{h,cpp}", "destroot/include/jsi/jsi/jsilib-*.{h,cpp}"]
+ ss.header_mappings_dir = "destroot/include"
+ ss.ios.vendored_frameworks = "destroot/Library/Frameworks/universal/hermes.xcframework"
+ ss.osx.vendored_frameworks = "destroot/Library/Frameworks/macosx/hermes.framework"
+ end
+
+ elsif source[:git] then
+
+ spec.subspec 'Hermes' do |ss|
+ ss.source_files = ''
+ ss.public_header_files = 'API/hermes/*.h'
+ ss.header_dir = 'hermes'
+ end
+
+ spec.subspec 'JSI' do |ss|
+ ss.source_files = ''
+ ss.public_header_files = 'API/jsi/jsi/*.h'
+ ss.header_dir = 'jsi'
+ end
+
+ spec.subspec 'Public' do |ss|
+ ss.source_files = ''
+ ss.public_header_files = 'public/hermes/Public/*.h'
+ ss.header_dir = 'hermes/Public'
+ end
+
+ hermesc_path = ""
+
+ if ENV.has_key?('HERMES_OVERRIDE_HERMESC_PATH') && File.exist?(ENV['HERMES_OVERRIDE_HERMESC_PATH']) then
+ hermesc_path = ENV['HERMES_OVERRIDE_HERMESC_PATH']
+ else
+ # Keep hermesc_path synchronized with .gitignore entry.
+ ENV['REACT_NATIVE_PATH'] = react_native_path
+ hermesc_path = "${REACT_NATIVE_PATH}/sdks/hermes-engine/build_host_hermesc"
+ # NOTE: Prepare command is not run if the pod is not downloaded.
+ spec.prepare_command = ". #{react_native_path}/sdks/hermes-engine/utils/build-hermesc-xcode.sh #{hermesc_path}"
+ end
+
+ spec.user_target_xcconfig = {
+ 'FRAMEWORK_SEARCH_PATHS' => '"$(PODS_ROOT)/hermes-engine/destroot/Library/Frameworks/iphoneos" ' +
+ '"$(PODS_ROOT)/hermes-engine/destroot/Library/Frameworks/iphonesimulator" ' +
+ '"$(PODS_ROOT)/hermes-engine/destroot/Library/Frameworks/macosx" ' +
+ '"$(PODS_ROOT)/hermes-engine/destroot/Library/Frameworks/catalyst"',
+ 'OTHER_LDFLAGS' => '-framework "hermes"',
+ 'HERMES_CLI_PATH' => "#{hermesc_path}/bin/hermesc"
+ }
+
+ spec.script_phases = [
+ {
+ :name => 'Build Hermes',
+ :script => <<-EOS
+ . ${PODS_ROOT}/../.xcode.env
+ export CMAKE_BINARY=${CMAKE_BINARY:-#{%x(command -v cmake | tr -d '\n')}}
+ . ${REACT_NATIVE_PATH}/sdks/hermes-engine/utils/build-hermes-xcode.sh #{version} #{hermesc_path}/ImportHermesc.cmake
+ EOS
+ },
+ {
+ :name => 'Copy Hermes Framework',
+ :script => ". ${REACT_NATIVE_PATH}/sdks/hermes-engine/utils/copy-hermes-xcode.sh"
+ }
+ ]
+ end
+end
diff --git a/node_modules/react-native/sdks/hermes/hermes-utils.rb b/node_modules/react-native/sdks/hermes/hermes-utils.rb
new file mode 100644
index 0000000..0842496
--- /dev/null
+++ b/node_modules/react-native/sdks/hermes/hermes-utils.rb
@@ -0,0 +1,26 @@
+# Copyright (c) Meta Platforms, Inc. and affiliates.
+#
+# This source code is licensed under the MIT license found in the
+# LICENSE file in the root directory of this source tree.
+
+require 'net/http'
+require 'rexml/document'
+
+# This function downloads the nightly prebuilt version of Hermes based on the passed version
+# and save it in the node_module/react_native/sdks/downloads folder
+# It then returns the path to the hermes tarball
+#
+# Parameters
+# - react_native_path: the path to the React Native folder in node modules. It is used as root path to store the Hermes tarball
+# - version: the version of React Native that requires the Hermes tarball
+# Returns: the path to the downloaded Hermes tarball
+def download_nightly_hermes(react_native_path, version)
+ params = "r=snapshots\&g=com.facebook.react\&a=react-native-artifacts\&c=hermes-ios-debug\&e=tar.gz\&v=#{version}-SNAPSHOT"
+ tarball_url = "http://oss.sonatype.org/service/local/artifact/maven/redirect\?#{params}"
+
+ destination_folder = "#{react_native_path}/sdks/downloads"
+ destination_path = "#{destination_folder}/hermes-ios.tar.gz"
+
+ `mkdir -p "#{destination_folder}" && curl "#{tarball_url}" -Lo "#{destination_path}"`
+ return destination_path
+end

0 comments on commit 431b844

Please sign in to comment.