From 491154f4672b0894bbd74479929b2781ccc7054e Mon Sep 17 00:00:00 2001 From: Carter Jernigan Date: Wed, 15 Jun 2022 13:56:17 -0400 Subject: [PATCH] [#562] Detect and warn when running under Rosetta --- .../zcash-sdk.rosetta-conventions.gradle.kts | 47 +++++++++++++++++++ build.gradle.kts | 3 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 build-conventions/src/main/kotlin/zcash-sdk.rosetta-conventions.gradle.kts diff --git a/build-conventions/src/main/kotlin/zcash-sdk.rosetta-conventions.gradle.kts b/build-conventions/src/main/kotlin/zcash-sdk.rosetta-conventions.gradle.kts new file mode 100644 index 00000000..c5988b4f --- /dev/null +++ b/build-conventions/src/main/kotlin/zcash-sdk.rosetta-conventions.gradle.kts @@ -0,0 +1,47 @@ +import java.util.concurrent.TimeUnit +if (isRosetta()) { + logger.warn("This Gradle invocation is running under Rosetta. Use an ARM (aarch64) JDK to " + + "improve performance. One can be downloaded from https://adoptium.net/temurin/releases") +} + +@Suppress("MagicNumber") +private val maxTimeoutMillis = 5000L + +/** + * This method is safe to call from any operating system or CPU architecture. + * + * @return True if the application is running under Rosetta. + */ +fun isRosetta(): Boolean { + if (System.getProperty("os.name").toLowerCase(java.util.Locale.ROOT).startsWith("mac")) { + // Counterintuitive, but running under Rosetta is reported as Intel64 to the JVM + if (!System.getProperty("os.arch").toLowerCase(java.util.Locale.ROOT).contains("aarch64")) { + val outputValue = Runtime.getRuntime() + .exec("sysctl -in sysctl.proc_translated") + .scanOutputLine() + ?.toIntOrNull() + + if (1 == outputValue) { + return true + } + } + } + + return false +} + +fun Process.scanOutputLine(): String? { + var outputString = "" + + inputStream.use { inputStream -> + java.util.Scanner(inputStream).useDelimiter("\\A").use { scanner -> + while (scanner.hasNext()) { + outputString = scanner.next() + } + } + } + + waitFor(maxTimeoutMillis, TimeUnit.MILLISECONDS) + + return outputString.trim() +} diff --git a/build.gradle.kts b/build.gradle.kts index dd8a7bc3..f0e4431d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,6 +15,7 @@ plugins { id("com.osacky.fulladle") id("io.gitlab.arturbosch.detekt") id("zcash-sdk.ktlint-conventions") + id("zcash-sdk.rosetta-conventions") } tasks { @@ -85,4 +86,4 @@ if (firebaseTestLabKeyPath.isNotBlank()) { flankVersion.set(libs.versions.flank.get()) } -} \ No newline at end of file +}