Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion packages/react-native/Libraries/Blob/React-RCTBlob.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,14 @@ Pod::Spec.new do |s|
s.dependency "RCT-Folly", folly_version
s.dependency "React-Codegen", version
s.dependency "ReactCommon/turbomodule/core", version
s.dependency "React-jsi", version
s.dependency "React-jsi"
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"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']
end
end
10 changes: 6 additions & 4 deletions packages/react-native/React-Core.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,12 @@ Pod::Spec.new do |s|
s.dependency "Yoga"
s.dependency "glog"

if ENV['USE_HERMES'] == "0"
s.dependency 'React-jsc'
if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1"
s.dependency "React-hermes"
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']
else
s.dependency 'React-hermes'
s.dependency 'hermes-engine'
s.dependency "React-jsc"
end
end
2 changes: 2 additions & 0 deletions packages/react-native/React/React-RCTFabric.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ Pod::Spec.new do |s|

if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1"
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']
else
s.dependency "React-jsi"
end
Expand Down
4 changes: 3 additions & 1 deletion packages/react-native/ReactCommon/React-Fabric.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,10 @@ Pod::Spec.new do |s|

if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1"
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']
else
s.dependency "React-jsi"
s.dependency "React-jsc"
end

s.subspec "animations" do |ss|
Expand Down
4 changes: 3 additions & 1 deletion packages/react-native/ReactCommon/React-FabricImage.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,9 @@ Pod::Spec.new do |s|

if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1"
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']
else
s.dependency "React-jsi"
s.dependency "React-jsc"
end
end
4 changes: 4 additions & 0 deletions packages/react-native/ReactCommon/ReactCommon.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ Pod::Spec.new do |s|
ss.dependency "glog"
if using_hermes
ss.dependency "hermes-engine"
ss.dependency "hermes-engine_debug", :configurations => ['Debug']
ss.dependency "hermes-engine_release", :configurations => ['Release']
end

ss.subspec "bridging" do |sss|
Expand All @@ -63,6 +65,8 @@ Pod::Spec.new do |s|
sss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ReactCommon\" \"$(PODS_ROOT)/RCT-Folly\"" }
if using_hermes
sss.dependency "hermes-engine"
sss.dependency "hermes-engine_debug", :configurations => ['Debug']
sss.dependency "hermes-engine_release", :configurations => ['Release']
end
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,11 @@ Pod::Spec.new do |s|
s.dependency "React-jsi", version
s.dependency "React-logger", version

if ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1"
s.dependency 'hermes-engine'
if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1"
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']
else
s.dependency "React-jsc"
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ Pod::Spec.new do |s|
s.dependency "DoubleConversion"
s.dependency "glog"
s.dependency "RCT-Folly/Futures", folly_version
s.dependency "hermes-engine"
s.dependency "React-jsi"
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']

end
3 changes: 3 additions & 0 deletions packages/react-native/ReactCommon/jsi/React-jsi.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,8 @@ Pod::Spec.new do |s|
# Just need to provide JSIDynamic in this case.
s.source_files = "jsi/JSIDynamic.{cpp,h}"
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']

end
end
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,15 @@ Pod::Spec.new do |s|
s.header_dir = "jsireact"

s.dependency "React-cxxreact", version
s.dependency "React-jsi", version
s.dependency "React-jsi"
s.dependency "React-perflogger", version
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'
if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1"
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,7 @@ Pod::Spec.new do |s|

if using_hermes
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ Pod::Spec.new do |s|

if using_hermes
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']
else
s.dependency "React-jsi"
s.dependency "React-jsc"
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,11 @@ Pod::Spec.new do |s|
s.source_files = "**/*.{cpp,h}"
s.header_dir = "ReactCommon"

s.dependency "React-jsi", version
s.dependency "React-jsi"

if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1"
s.dependency "hermes-engine"
s.dependency "hermes-engine_debug", :configurations => ['Debug']
s.dependency "hermes-engine_release", :configurations => ['Release']
end
end
20 changes: 18 additions & 2 deletions packages/react-native/scripts/cocoapods/__tests__/jsengine-test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,21 @@ def test_setupHermes_whenHermesScriptSucceeds_installsPods
"returned by",
"prepare-hermes-for-build",
])
assert_equal($podInvocationCount, 4)
assert_equal($podInvocationCount, 6)
assert_equal($podInvocation["React-jsi"][:path], "../../ReactCommon/jsi")
assert_equal($podInvocation["React-hermes"][:path], "../../ReactCommon/hermes")
assert_equal($podInvocation["libevent"][:version], "~> 2.1.12")
hermes_engine_pod_invocation = $podInvocation["hermes-engine"]
assert_equal(hermes_engine_pod_invocation[:podspec], "../../sdks/hermes-engine/hermes-engine.podspec")
assert_equal(hermes_engine_pod_invocation[:tag], "")
hermes_engine_pod_invocation = $podInvocation["hermes-engine_release"]
assert_equal(hermes_engine_pod_invocation[:podspec], "../../sdks/hermes-engine/hermes-engine.release.podspec")
assert_equal(hermes_engine_pod_invocation[:tag], "")
assert_equal(hermes_engine_pod_invocation[:configurations], ["Release"])
hermes_engine_pod_invocation = $podInvocation["hermes-engine_debug"]
assert_equal(hermes_engine_pod_invocation[:podspec], "../../sdks/hermes-engine/hermes-engine.debug.podspec")
assert_equal(hermes_engine_pod_invocation[:tag], "")
assert_equal(hermes_engine_pod_invocation[:configurations], ["Debug"])
end

def test_setupHermes_installsPods_installsFabricSubspecWhenFabricEnabled
Expand All @@ -118,13 +126,21 @@ def test_setupHermes_installsPods_installsFabricSubspecWhenFabricEnabled
setup_hermes!(:react_native_path => @react_native_path, :fabric_enabled => fabric_enabled)

# Assert
assert_equal($podInvocationCount, 4)
assert_equal($podInvocationCount, 6)
assert_equal($podInvocation["React-jsi"][:path], "../../ReactCommon/jsi")
hermes_engine_pod_invocation = $podInvocation["hermes-engine"]
assert_equal(hermes_engine_pod_invocation[:podspec], "../../sdks/hermes-engine/hermes-engine.podspec")
assert_equal(hermes_engine_pod_invocation[:tag], "")
assert_equal($podInvocation["React-hermes"][:path], "../../ReactCommon/hermes")
assert_equal($podInvocation["libevent"][:version], "~> 2.1.12")
hermes_engine_pod_invocation = $podInvocation["hermes-engine_release"]
assert_equal(hermes_engine_pod_invocation[:podspec], "../../sdks/hermes-engine/hermes-engine.release.podspec")
assert_equal(hermes_engine_pod_invocation[:tag], "")
assert_equal(hermes_engine_pod_invocation[:configurations], ["Release"])
hermes_engine_pod_invocation = $podInvocation["hermes-engine_debug"]
assert_equal(hermes_engine_pod_invocation[:podspec], "../../sdks/hermes-engine/hermes-engine.debug.podspec")
assert_equal(hermes_engine_pod_invocation[:tag], "")
assert_equal(hermes_engine_pod_invocation[:configurations], ["Debug"])
end

end
4 changes: 4 additions & 0 deletions packages/react-native/scripts/cocoapods/jsengine.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,11 @@ def setup_hermes!(react_native_path: "../node_modules/react-native", fabric_enab
# We have custom logic to compute the source for hermes-engine. See sdks/hermes-engine/*
hermestag_file = File.join(react_native_path, "sdks", ".hermesversion")
hermestag = File.exist?(hermestag_file) ? File.read(hermestag_file).strip : ''

pod 'hermes-engine', :podspec => "#{react_native_path}/sdks/hermes-engine/hermes-engine.podspec", :tag => hermestag
pod 'hermes-engine_debug', :podspec => "#{react_native_path}/sdks/hermes-engine/hermes-engine.debug.podspec", :tag => hermestag, :configurations => ["Debug"]
pod 'hermes-engine_release', :podspec => "#{react_native_path}/sdks/hermes-engine/hermes-engine.release.podspec", :tag => hermestag, :configurations => ["Release"]

pod 'React-hermes', :path => "#{react_native_path}/ReactCommon/hermes"
pod 'libevent', '~> 2.1.12'
end
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,14 @@ function populateMockFilesystemWithHermesBuildScripts() {
path.join(SDKS_DIR, 'hermes-engine/hermes-engine.podspec'),
'Dummy file',
);
fs.writeFileSync(
path.join(SDKS_DIR, 'hermes-engine/hermes-engine.debug.podspec'),
'Dummy file',
);
fs.writeFileSync(
path.join(SDKS_DIR, 'hermes-engine/hermes-engine.release.podspec'),
'Dummy file',
);
fs.writeFileSync(
path.join(SDKS_DIR, 'hermes-engine/hermes-utils.rb'),
'Dummy file',
Expand Down
18 changes: 10 additions & 8 deletions packages/react-native/scripts/hermes/hermes-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -168,15 +168,17 @@ function copyPodSpec() {
if (!fs.existsSync(HERMES_DIR)) {
fs.mkdirSync(HERMES_DIR, {recursive: true});
}
const podspec = 'hermes-engine.podspec';
fs.copyFileSync(
path.join(SDKS_DIR, 'hermes-engine', podspec),
path.join(HERMES_DIR, podspec),
);
const utils = 'hermes-utils.rb';

copyFromSDKToHermes('hermes-engine.debug.podspec');
copyFromSDKToHermes('hermes-engine.release.podspec');
copyFromSDKToHermes('hermes-engine.podspec');
copyFromSDKToHermes('hermes-utils.rb');
}

function copyFromSDKToHermes(filename) {
fs.copyFileSync(
path.join(SDKS_DIR, 'hermes-engine', utils),
path.join(HERMES_DIR, utils),
path.join(SDKS_DIR, 'hermes-engine', filename),
path.join(HERMES_DIR, filename),
);
}

Expand Down
2 changes: 1 addition & 1 deletion packages/react-native/scripts/react-native-xcode.sh
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ if [[ -z "$HERMES_ENABLED" ]]; then
USE_HERMES=false
fi

HERMES_ENGINE_PATH="$PODS_ROOT/hermes-engine"
HERMES_ENGINE_PATH="$PODS_ROOT/hermes-engine_$CONFIGURATION"
[ -z "$HERMES_CLI_PATH" ] && HERMES_CLI_PATH="$HERMES_ENGINE_PATH/destroot/bin/hermesc"

# Hermes is enabled in new projects by default, so we cannot assume that USE_HERMES=1 is set as an envvar.
Expand Down
114 changes: 114 additions & 0 deletions packages/react-native/sdks/hermes-engine/hermes-engine.debug.podspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
# 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 = :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")
build_from_source = ENV['BUILD_FROM_SOURCE'] === 'true'

git = "https://github.com/facebook/hermes.git"

abort_if_invalid_tarball_provided!

source = compute_hermes_source(build_from_source, hermestag_file, git, version, build_type, react_native_path)

Pod::Spec.new do |spec|
spec.name = "hermes-engine_debug"
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.pod_target_xcconfig = {
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
"CLANG_CXX_LIBRARY" => "compiler-default"
}.merge!(build_type == :debug ? { "GCC_PREPROCESSOR_DEFINITIONS" => "HERMES_ENABLE_DEBUGGER=1" } : {})

spec.ios.vendored_frameworks = "destroot/Library/Frameworks/ios/hermes.framework"
spec.osx.vendored_frameworks = "destroot/Library/Frameworks/macosx/hermes.framework"

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 = "${PODS_ROOT}/hermes-engine/build_host_hermesc"

if ENV.has_key?('HERMES_OVERRIDE_HERMESC_PATH') && File.exist?(ENV['HERMES_OVERRIDE_HERMESC_PATH']) then
hermesc_path = ENV['HERMES_OVERRIDE_HERMESC_PATH']
end

spec.user_target_xcconfig = {
'HERMES_CLI_PATH' => "#{hermesc_path}/bin/hermesc"
}

spec.prepare_command = ". #{react_native_path}/sdks/hermes-engine/utils/create-dummy-hermes-xcframework.sh"

CMAKE_BINARY = %x(command -v cmake | tr -d '\n')
# NOTE: Script phases are sorted alphabetically inside Xcode project
spec.script_phases = [
{
:name => '[RN] [1] Build Hermesc',
:script => <<-EOS
. ${PODS_ROOT}/../.xcode.env
export CMAKE_BINARY=${CMAKE_BINARY:-#{CMAKE_BINARY}}
. ${REACT_NATIVE_PATH}/sdks/hermes-engine/utils/build-hermesc-xcode.sh #{hermesc_path}
EOS
},
{
:name => '[RN] [2] Build Hermes',
:script => <<-EOS
. ${PODS_ROOT}/../.xcode.env
export CMAKE_BINARY=${CMAKE_BINARY:-#{CMAKE_BINARY}}
. ${REACT_NATIVE_PATH}/sdks/hermes-engine/utils/build-hermes-xcode.sh #{version} #{hermesc_path}/ImportHermesc.cmake
EOS
}
]
end
end
Loading