Hermes: Copy build scripts to RN

Summary:
Copy Hermes build scripts to React Native repository for greater control over the build pipeline when used in RN.

Changelog: [Internal]

Reviewed By: neildhar

Differential Revision: D36295406

fbshipit-source-id: 54bf4173b6c75db35de828378e6f5782a248ed2e
This commit is contained in:
Héctor Ramos
2022-05-20 12:43:44 +02:00
committed by fortmarek
parent 20f8d134c7
commit 7382b4d72f
7 changed files with 157 additions and 4 deletions
+2
View File
@@ -983,6 +983,7 @@ jobs:
environment:
- HERMES_WS_DIR: *hermes_workspace_root
steps:
- checkout
- *attach_hermes_workspace
- restore_cache:
key: v1-hermes-{{ .Environment.CIRCLE_JOB }}-{{ checksum "/tmp/hermes/hermesversion" }}
@@ -990,6 +991,7 @@ jobs:
name: Set up workspace
command: |
mkdir -p /tmp/hermes/osx-bin
cp ~/react-native/sdks/hermes-engine/utils/* "$HERMES_WS_DIR/hermes/utils/."
- run:
name: Install dependencies
command: |
+1 -1
View File
@@ -52,8 +52,8 @@
"scripts/react_native_pods_utils/script_phases.sh",
"scripts/react_native_pods.rb",
"scripts/react-native-xcode.sh",
"sdks/hermes-engine",
"sdks/hermesc",
"sdks/hermes-engine.podspec",
"template.config.js",
"template",
"third-party-podspecs"
+3 -2
View File
@@ -689,8 +689,9 @@ def downloadAndConfigureHermesSource(react_native_path)
Pod::UI.puts "[Hermes] Extracting Hermes tarball (#{hermes_tag_sha.slice(0,6)})"
system("tar -zxf #{hermes_tarball_path} --strip-components=1 --directory #{hermes_dir}")
# TODO: Integrate this temporary hermes-engine.podspec into the actual one located in facebook/hermes
system("cp #{sdks_dir}/hermes-engine.podspec #{hermes_dir}/hermes-engine.podspec")
# Use React Native's own scripts to build Hermes
system("cp #{sdks_dir}/hermes-engine/hermes-engine.podspec #{hermes_dir}/hermes-engine.podspec")
system("cp #{sdks_dir}/hermes-engine/utils/* #{hermes_dir}/utils/.")
hermes_dir
end
@@ -38,7 +38,6 @@ Pod::Spec.new do |spec|
spec.xcconfig = { "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", "CLANG_CXX_LIBRARY" => "compiler-default", "GCC_PREPROCESSOR_DEFINITIONS" => "HERMES_ENABLE_DEBUGGER=1" }
# TODO: Consider moving Hermes build scripts to react_native_pods.rb for greater control over when they're executed
spec.prepare_command = <<-EOS
# When true, debug build will be used.
# See `build-apple-framework.sh` for details
+118
View File
@@ -0,0 +1,118 @@
#!/bin/bash
# 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.
if [ "$DEBUG" = true ]; then
BUILD_TYPE="Debug"
else
BUILD_TYPE="Release"
fi
function command_exists {
command -v "${1}" > /dev/null 2>&1
}
if command_exists "cmake"; then
if command_exists "ninja"; then
BUILD_SYSTEM="Ninja"
else
BUILD_SYSTEM="Unix Makefiles"
fi
else
echo >&2 'CMake is required to install Hermes, install it with: brew install cmake'
exit 1
fi
function get_release_version {
ruby -rcocoapods-core -rjson -e "puts Pod::Specification.from_file('hermes-engine.podspec').version"
}
function get_ios_deployment_target {
ruby -rcocoapods-core -rjson -e "puts Pod::Specification.from_file('hermes-engine.podspec').deployment_target('ios')"
}
function get_mac_deployment_target {
ruby -rcocoapods-core -rjson -e "puts Pod::Specification.from_file('hermes-engine.podspec').deployment_target('osx')"
}
# Build host hermes compiler for internal bytecode
function build_host_hermesc {
cmake -S . -B build_host_hermesc
cmake --build ./build_host_hermesc --target hermesc
}
# Utility function to configure an Apple framework
function configure_apple_framework {
local build_cli_tools enable_bitcode
if [[ $1 == iphoneos || $1 == catalyst ]]; then
enable_bitcode="true"
else
enable_bitcode="false"
fi
if [[ $1 == macosx ]]; then
build_cli_tools="true"
else
build_cli_tools="false"
fi
cmake -S . -B "build_$1" -G "$BUILD_SYSTEM" \
-DHERMES_APPLE_TARGET_PLATFORM:STRING="$1" \
-DCMAKE_OSX_ARCHITECTURES:STRING="$2" \
-DCMAKE_OSX_DEPLOYMENT_TARGET:STRING="$3" \
-DHERMES_ENABLE_DEBUGGER:BOOLEAN=true \
-DHERMES_ENABLE_LIBFUZZER:BOOLEAN=false \
-DHERMES_ENABLE_FUZZILLI:BOOLEAN=false \
-DHERMES_ENABLE_TEST_SUITE:BOOLEAN=false \
-DHERMES_ENABLE_BITCODE:BOOLEAN="$enable_bitcode" \
-DHERMES_BUILD_APPLE_FRAMEWORK:BOOLEAN=true \
-DHERMES_BUILD_APPLE_DSYM:BOOLEAN=true \
-DHERMES_ENABLE_TOOLS:BOOLEAN="$build_cli_tools" \
-DIMPORT_HERMESC:PATH="$PWD/build_host_hermesc/ImportHermesc.cmake" \
-DCMAKE_INSTALL_PREFIX:PATH=../destroot \
-DCMAKE_BUILD_TYPE="$BUILD_TYPE"
}
# Utility function to build an Apple framework
function build_apple_framework {
echo "Building framework for $1 with architectures: $2"
build_host_hermesc
[ ! -f "$PWD/build_host_hermesc/ImportHermesc.cmake" ] &&
echo "Host hermesc is required to build apple frameworks!"
configure_apple_framework "$1" "$2" "$3"
if [[ "$BUILD_SYSTEM" == "Ninja" ]]; then
(cd "./build_$1" && ninja install/strip)
else
(cd "./build_$1" && make install/strip)
fi
}
# Accepts an array of frameworks and will place all of
# the architectures into an universal folder and then remove
# the merged frameworks from destroot
function create_universal_framework {
cd ./destroot/Library/Frameworks || exit 1
local platforms=("$@")
local args=""
echo "Creating universal framework for platforms: ${platforms[*]}"
for i in "${!platforms[@]}"; do
args+="-framework ${platforms[$i]}/hermes.framework "
done
mkdir universal
xcodebuild -create-xcframework $args -output "universal/hermes.xcframework"
for platform in $@; do
rm -r "$platform"
done
cd - || exit 1
}
+19
View File
@@ -0,0 +1,19 @@
#!/bin/bash
# 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.
. ./utils/build-apple-framework.sh
if [ ! -d destroot/Library/Frameworks/universal/hermes.xcframework ]; then
ios_deployment_target=$(get_ios_deployment_target)
build_apple_framework "iphoneos" "arm64" "$ios_deployment_target"
build_apple_framework "iphonesimulator" "x86_64;arm64" "$ios_deployment_target"
build_apple_framework "catalyst" "x86_64;arm64" "$ios_deployment_target"
create_universal_framework "iphoneos" "iphonesimulator" "catalyst"
else
echo "Skipping; Clean \"destroot\" to rebuild".
fi
+14
View File
@@ -0,0 +1,14 @@
#!/bin/bash
# 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.
. ./utils/build-apple-framework.sh
if [ ! -d destroot/Library/Frameworks/macosx/hermes.framework ]; then
mac_deployment_target=$(get_mac_deployment_target)
build_apple_framework "macosx" "x86_64;arm64" "$mac_deployment_target"
else
echo "Skipping; Clean \"destroot\" to rebuild".
fi