mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: This diff adds prepare command to hermes-engine.podspec. That command creates dummy `universal/hermes.xcframework` and `maocosx/hermes.framework`. This allow us to utilise CocoaPods auto-linking, and remove manual linking/cleanup code. Also we now do not pollute user project with "Copy Hermes Framework" script phase. Which was quite bad on its own, and also caused annoying bugs on the CI. allow-large-files Changelog: [iOS][Changed] - Prepare dummy hermes.xcframework before pod install. Reviewed By: cipolleschi Differential Revision: D41533994 fbshipit-source-id: d7d098ba5e882ac2d036335c23d7cda447d75b8d
144 lines
5.9 KiB
Ruby
144 lines
5.9 KiB
Ruby
# 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['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" } : {})
|
|
|
|
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
|