From c11785b90da95b358b3a5d34bcf852fed759f65e Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 27 Apr 2022 09:41:11 -0700 Subject: [PATCH] Update the hermesc output to be inside the $buildDir Summary: Currently, we build Hermes by specifying the Cmake flag `-B ./hermes`. That means that the output out the build is going to be placed along side the source code. This is fine, as long as the user doesn't use the `REACT_NATIVE_OVERRIDE_HERMES_DIR`, which is used inside the Hermes CI. In that case, the source location of Hermes can be changed, leading to scenarios where `hermesc` can't be found. Here I'm changing the flag to be `-B $buildDir/hermes`. Therefore the build output will always be located within the `./ReactAndroid/hermes-engine/build` folder. This is a more robust solution as the build output will be encapsulated within the `build/` folder. Changelog:i [Internal] [Changed] - Update the hermesc output to be inside the $buildDir Reviewed By: cipolleschi Differential Revision: D35964402 fbshipit-source-id: aa7e0775b282897d5a99c1c46265884d19c5f289 --- ReactAndroid/hermes-engine/build.gradle | 8 ++++---- .../kotlin/com/facebook/react/utils/PathUtils.kt | 2 +- .../com/facebook/react/utils/PathUtilsTest.kt | 16 +++++++++++----- packages/rn-tester/android/app/build.gradle | 2 +- react.gradle | 5 ++++- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/ReactAndroid/hermes-engine/build.gradle b/ReactAndroid/hermes-engine/build.gradle index d1aad236f90f0d..30a4d5e93037a8 100644 --- a/ReactAndroid/hermes-engine/build.gradle +++ b/ReactAndroid/hermes-engine/build.gradle @@ -30,7 +30,6 @@ def findCmakePath(cmakeVersion) { } return "cmake" } -logger.error("CMAKE PATH ${findCmakePath(cmakeVersion)}") def reactNativeRootDir = project(':ReactAndroid').projectDir.parent; def customDownloadDir = System.getenv("REACT_NATIVE_DOWNLOADS_DIR") @@ -40,6 +39,7 @@ def downloadsDir = customDownloadDir ? new File(customDownloadDir) : new File(re // but you can provide an override for where the hermes source code is located. def overrideHermesDir = System.getenv("REACT_NATIVE_OVERRIDE_HERMES_DIR") != null def hermesDir = System.getenv("REACT_NATIVE_OVERRIDE_HERMES_DIR") ?: new File(reactNativeRootDir, "sdks/hermes") +def hermesBuildDir = new File("$buildDir/hermes") def hermesVersion = "main" def hermesVersionFile = new File(reactNativeRootDir, "sdks/.hermesversion") @@ -86,12 +86,12 @@ task unzipHermes(dependsOn: downloadHermes, type: Copy) { task configureBuildForHermes(type: Exec) { workingDir(hermesDir) - commandLine(windowsAwareCommandLine(findCmakePath(cmakeVersion), "-S", ".", "-B", "./build", "-DJSI_DIR=" + jsiDir.absolutePath)) + commandLine(windowsAwareCommandLine(findCmakePath(cmakeVersion), "-S", ".", "-B", hermesBuildDir.toString(), "-DJSI_DIR=" + jsiDir.absolutePath)) } task buildHermes(dependsOn: configureBuildForHermes, type: Exec) { workingDir(hermesDir) - commandLine(windowsAwareCommandLine(findCmakePath(cmakeVersion), "--build", "./build", "--target", "hermesc", "-j", ndkBuildJobs)) + commandLine(windowsAwareCommandLine(findCmakePath(cmakeVersion), "--build", hermesBuildDir.toString(), "--target", "hermesc", "-j", ndkBuildJobs)) } task prepareHeadersForPrefab(type: Copy) { @@ -138,7 +138,7 @@ android { arguments "-DANDROID_STL=c++_shared" arguments "-DANDROID_PIE=True" arguments "-DANDROID_LD=lld" - arguments "-DIMPORT_HERMESC=${new File(hermesDir, "build/ImportHermesc.cmake").toString()}" + arguments "-DIMPORT_HERMESC=${new File(hermesBuildDir, "ImportHermesc.cmake").toString()}" arguments "-DJSI_DIR=${jsiDir}" arguments "-DHERMES_SLOW_DEBUG=False" arguments "-DHERMES_BUILD_SHARED_JSI=True" 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 27f115db9bda53..562ac7857c11da 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 @@ -193,4 +193,4 @@ internal fun projectPathToLibraryName(projectPath: String): String = private const val HERMESC_IN_REACT_NATIVE_PATH = "node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc" private const val HERMESC_BUILT_FROM_SOURCE_PATH = - "node_modules/react-native/sdks/hermes/build/bin/hermesc" + "node_modules/react-native/ReactAndroid/hermes-engine/build/hermes/bin/hermesc" 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 a98c63c6888f55..dd48c4bca49e41 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 @@ -170,8 +170,10 @@ class PathUtilsTest { @Test fun detectOSAwareHermesCommand_withHermescBuiltLocally() { - tempFolder.newFolder("node_modules/react-native/sdks/hermes/build/bin/") - val expected = tempFolder.newFile("node_modules/react-native/sdks/hermes/build/bin/hermesc") + tempFolder.newFolder("node_modules/react-native/ReactAndroid/hermes-engine/build/hermes/bin/") + val expected = + tempFolder.newFile( + "node_modules/react-native/ReactAndroid/hermes-engine/build/hermes/bin/hermesc") assertEquals(expected.toString(), detectOSAwareHermesCommand(tempFolder.root, "")) } @@ -206,8 +208,10 @@ class PathUtilsTest { @Test @WithOs(OS.MAC) fun detectOSAwareHermesCommand_withoutProvidedCommand_builtHermescTakesPrecedence() { - tempFolder.newFolder("node_modules/react-native/sdks/hermes/build/bin/") - val expected = tempFolder.newFile("node_modules/react-native/sdks/hermes/build/bin/hermesc") + tempFolder.newFolder("node_modules/react-native/ReactAndroid/hermes-engine/build/hermes/bin/") + val expected = + tempFolder.newFile( + "node_modules/react-native/ReactAndroid/hermes-engine/build/hermes/bin/hermesc") tempFolder.newFolder("node_modules/react-native/sdks/hermesc/osx-bin/") tempFolder.newFile("node_modules/react-native/sdks/hermesc/osx-bin/hermesc") @@ -217,7 +221,9 @@ class PathUtilsTest { @Test fun getBuiltHermescFile_withoutOverride() { assertEquals( - File(tempFolder.root, "node_modules/react-native/sdks/hermes/build/bin/hermesc"), + File( + tempFolder.root, + "node_modules/react-native/ReactAndroid/hermes-engine/build/hermes/bin/hermesc"), getBuiltHermescFile(tempFolder.root, "")) } diff --git a/packages/rn-tester/android/app/build.gradle b/packages/rn-tester/android/app/build.gradle index 3e7ac401fd9612..bd10c322f3956f 100644 --- a/packages/rn-tester/android/app/build.gradle +++ b/packages/rn-tester/android/app/build.gradle @@ -83,7 +83,7 @@ react { root = rootDir inputExcludes = ["android/**", "./**", ".gradle/**"] composeSourceMapsPath = "$rootDir/scripts/compose-source-maps.js" - hermesCommand = "$rootDir/sdks/hermes/build/bin/hermesc" + hermesCommand = "$rootDir/ReactAndroid/hermes-engine/build/hermes/bin/hermesc" enableHermesForVariant { def v -> v.name.contains("hermes") } // Codegen Configs diff --git a/react.gradle b/react.gradle index c7ad3db8936b33..2e9d8e51fb61b3 100644 --- a/react.gradle +++ b/react.gradle @@ -106,7 +106,10 @@ def getHermesCommand = { // 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") + def builtHermesc = hermesOverrideDir ? + new File(hermesOverrideDir, "build/bin/hermesc") : + new File(reactRoot, "node_modules/react-native/ReactAndroid/hermes-engine/build/hermes/bin/hermesc") + if (builtHermesc.exists()) { return builtHermesc.getAbsolutePath() }