From 6563c99c4937d31478b62601fb02479ac8f830cf Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 25 Apr 2022 12:15:41 -0700 Subject: [PATCH] Honor the REACT_NATIVE_OVERRIDE_HERMES_DIR variable when searching for `hermesc` Summary: When searching for the `hermesc` path, we should also honor the `REACT_NATIVE_OVERRIDE_HERMES_DIR` variable. Changelog: [Internal] [Changed] - Honor the REACT_NATIVE_OVERRIDE_HERMES_DIR variable when searching for `hermesc` Reviewed By: neildhar Differential Revision: D35903601 fbshipit-source-id: 31e1255a558eece8cd84669861328db72e9ed17b --- .../com/facebook/react/utils/PathUtils.kt | 18 +++++++++++++++++- .../com/facebook/react/utils/PathUtilsTest.kt | 14 ++++++++++++++ react.gradle | 5 ++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PathUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PathUtils.kt index 594bc267d2a..6915cc679c1 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PathUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/PathUtils.kt @@ -129,7 +129,8 @@ internal fun detectOSAwareHermesCommand(projectRoot: File, hermesCommand: String } // 2. If the project is building hermes-engine from source, use hermesc from there - val builtHermesc = File(projectRoot, HERMESC_BUILT_FROM_SOURCE_PATH) + val builtHermesc = + getBuiltHermescFile(projectRoot, System.getenv("REACT_NATIVE_OVERRIDE_HERMES_DIR")) if (builtHermesc.exists()) { return builtHermesc.absolutePath } @@ -151,6 +152,21 @@ internal fun detectOSAwareHermesCommand(projectRoot: File, hermesCommand: String "node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc") } +/** + * Gets the location where Hermesc should be. If nothing is specified, built hermesc is assumed to + * be inside [HERMESC_BUILT_FROM_SOURCE_PATH]. Otherwise user can specify an override with + * [pathOverride], which is assumed to be an absolute path where Hermes source code is + * provided/built. + * + * @param projectRoot The root of the Project. + */ +internal fun getBuiltHermescFile(projectRoot: File, pathOverride: String?) = + if (!pathOverride.isNullOrBlank()) { + File(pathOverride, "build/bin/hermesc") + } else { + File(projectRoot, HERMESC_BUILT_FROM_SOURCE_PATH) + } + internal fun getHermesOSBin(): String { if (Os.isWindows()) return "win64-bin" if (Os.isMac()) return "osx-bin" diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/PathUtilsTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/PathUtilsTest.kt index fafc7ceda4b..34e10cb4cb9 100644 --- a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/PathUtilsTest.kt +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/PathUtilsTest.kt @@ -231,4 +231,18 @@ class PathUtilsTest { assertEquals(expected.toString(), detectOSAwareHermesCommand(tempFolder.root, "")) } + + @Test + fun getBuiltHermescFile_withoutOverride() { + assertEquals( + File(tempFolder.root, "node_modules/react-native/sdks/hermes/build/bin/hermesc"), + getBuiltHermescFile(tempFolder.root, "")) + } + + @Test + fun getBuiltHermescFile_withOverride() { + assertEquals( + File("/home/circleci/hermes/build/bin/hermesc"), + getBuiltHermescFile(tempFolder.root, "/home/circleci/hermes")) + } } diff --git a/react.gradle b/react.gradle index f3c098fdc86..c7ad3db8936 100644 --- a/react.gradle +++ b/react.gradle @@ -103,7 +103,10 @@ def getHermesCommand = { } // 2. If the project is building hermes-engine from source, use hermesc from there - def builtHermesc = new File(reactRoot, "node_modules/react-native/sdks/hermes/build/bin/hermesc") + // Also note that user can override the hermes source location with + // the `REACT_NATIVE_OVERRIDE_HERMES_DIR` env variable. + def hermesOverrideDir = System.getenv("REACT_NATIVE_OVERRIDE_HERMES_DIR") + def builtHermesc = hermesOverrideDir ? new File(hermesOverrideDir, "build/bin/hermesc") : new File(reactRoot, "node_modules/react-native/sdks/hermes/build/bin/hermesc") if (builtHermesc.exists()) { return builtHermesc.getAbsolutePath() }