diff --git a/.circleci/config.yml b/.circleci/config.yml index bc995158bbbbf4..a5e010bc47c79a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -679,6 +679,16 @@ jobs: # ------------------------- test_ios_template: executor: reactnativeios + parameters: + flavor: + type: string + default: "Debug" + architecture: + type: string + default: "OldArch" + jsengine: + type: string + default: "Hermes" environment: - PROJECT_NAME: "iOSTemplateProject" - HERMES_WS_DIR: *hermes_workspace_root @@ -689,13 +699,14 @@ jobs: - attach_workspace: at: . - *attach_hermes_workspace - - run: - name: Set USE_HERMES=1 - command: echo "export USE_HERMES=1" >> $BASH_ENV - - run: - name: Set HERMES_ENGINE_TARBALL_PATH - command: | - echo "export HERMES_ENGINE_TARBALL_PATH=$(ls -AU $HERMES_WS_DIR/hermes-runtime-darwin/hermes-runtime-darwin-*.tar.gz | head -1)" >> $BASH_ENV + - when: + condition: + equal: ["Hermes", << parameters.jsengine >>] + steps: + - run: + name: Set HERMES_ENGINE_TARBALL_PATH + command: | + echo "export HERMES_ENGINE_TARBALL_PATH=$(ls -AU $HERMES_WS_DIR/hermes-runtime-darwin/hermes-runtime-darwin-*.tar.gz | head -1)" >> $BASH_ENV - run: name: Create iOS template project command: | @@ -703,11 +714,34 @@ jobs: PACKAGE=$(cat build/react-native-package-version) PATH_TO_PACKAGE="$REPO_ROOT/build/$PACKAGE" node ./scripts/set-rn-template-version.js "file:$PATH_TO_PACKAGE" - node cli.js init $PROJECT_NAME --directory "/tmp/$PROJECT_NAME" --template $REPO_ROOT --verbose + node cli.js init $PROJECT_NAME --directory "/tmp/$PROJECT_NAME" --template $REPO_ROOT --verbose --skip-install + - run: + name: Install iOS dependencies - Configuration << parameters.flavor >>; New Architecture << parameters.architecture >>; JS Engine << parameters.jsengine>> + command: | + cd /tmp/$PROJECT_NAME + yarn install + cd ios + + bundle install + + if [[ << parameters.flavor >> == "Release" ]]; then + export PRODUCTION=1 + fi + + if [[ << parameters.architecture >> == "NewArch" ]]; then + export RCT_NEW_ARCH_ENABLED=1 + fi + + if [[ << parameters.jsengine >> == "JSC" ]]; then + export USE_HERMES=0 + fi + + bundle exec pod install - run: name: Build template project command: | xcodebuild build \ + -configuration << parameters.flavor >> \ -workspace /tmp/$PROJECT_NAME/ios/$PROJECT_NAME.xcworkspace \ -scheme $PROJECT_NAME \ -sdk iphonesimulator @@ -1308,6 +1342,11 @@ workflows: - test_ios_template: requires: - build_npm_package + matrix: + parameters: + architecture: ["NewArch", "OldArch"] + flavor: ["Debug", "Release"] + jsengine: ["Hermes", "JSC"] - test_ios_rntester: requires: - build_hermes_macos diff --git a/scripts/react-native-xcode.sh b/scripts/react-native-xcode.sh index 927ec76c3adc1f..e822afd58f37dc 100755 --- a/scripts/react-native-xcode.sh +++ b/scripts/react-native-xcode.sh @@ -78,13 +78,24 @@ fi # shellcheck source=/dev/null source "$REACT_NATIVE_DIR/scripts/node-binary.sh" +# If hermes-engine is in the podfile.lock, it means that Hermes is a dependency of the project +# and it is enabled. If not, it means that hermes is disabled. +HERMES_ENABLED=$(grep hermes-engine podfile.lock) + +# If hermes-engine is not in the podfile.lock, it means that the app is not using Hermes. +# Setting USE_HERMES is no the only way to set whether the app can use hermes or not: users +# can also modify manually the Podfile. +if [[ -z "$HERMES_ENABLED" ]]; then + USE_HERMES=false +fi + HERMES_ENGINE_PATH="$PODS_ROOT/hermes-engine" [ -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. # If hermes-engine is found in Pods, we can assume Hermes has not been disabled. # If hermesc is not available and USE_HERMES is either unset or true, show error. -if [[ -f "$HERMES_ENGINE_PATH" && ! -f "$HERMES_CLI_PATH" ]]; then +if [[ ! -z "$HERMES_ENABLED" && -f "$HERMES_ENGINE_PATH" && ! -f "$HERMES_CLI_PATH" ]]; then echo "error: Hermes is enabled but the hermesc binary could not be found at ${HERMES_CLI_PATH}." \ "Perhaps you need to run 'bundle exec pod install' or otherwise " \ "point the HERMES_CLI_PATH variable to your custom location." >&2 diff --git a/scripts/react_native_pods.rb b/scripts/react_native_pods.rb index 669a71130d1bca..fb0ba3cbe06eff 100644 --- a/scripts/react_native_pods.rb +++ b/scripts/react_native_pods.rb @@ -38,7 +38,7 @@ def use_react_native! ( fabric_enabled: false, new_arch_enabled: ENV['RCT_NEW_ARCH_ENABLED'] == '1', production: ENV['PRODUCTION'] == '1', - hermes_enabled: true, + hermes_enabled: ENV['USE_HERMES'] && ENV['USE_HERMES'] == '0' ? false : true, flipper_configuration: FlipperConfiguration.disabled, app_path: '..', config_file_dir: '') diff --git a/template/ios/Podfile b/template/ios/Podfile index 594b74dc56f576..d1953783520bd6 100644 --- a/template/ios/Podfile +++ b/template/ios/Podfile @@ -15,7 +15,7 @@ target 'HelloWorld' do # Hermes is now enabled by default. Disable by setting this flag to false. # Upcoming versions of React Native may rely on get_default_flags(), but # we make it explicit here to aid in the React Native upgrade process. - :hermes_enabled => true, + :hermes_enabled => flags[:hermes_enabled], :fabric_enabled => flags[:fabric_enabled], # Enables Flipper. #