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() }