From 676885d7f6551ed0de7dc1a10670ef35c2aa0b17 Mon Sep 17 00:00:00 2001 From: Carter Jernigan Date: Thu, 16 Jun 2022 07:39:45 -0400 Subject: [PATCH] [#493] Warn when running under Rosetta --- .../secant.rosetta-conventions.gradle.kts | 47 +++++++++++++++++++ build.gradle.kts | 1 + 2 files changed, 48 insertions(+) create mode 100644 build-conventions-secant/src/main/kotlin/secant.rosetta-conventions.gradle.kts diff --git a/build-conventions-secant/src/main/kotlin/secant.rosetta-conventions.gradle.kts b/build-conventions-secant/src/main/kotlin/secant.rosetta-conventions.gradle.kts new file mode 100644 index 00000000..c5988b4f --- /dev/null +++ b/build-conventions-secant/src/main/kotlin/secant.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 e266d615..39dcdc18 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,7 @@ plugins { id("io.gitlab.arturbosch.detekt") id("org.jetbrains.kotlinx.kover") id("secant.ktlint-conventions") + id("secant.rosetta-conventions") } tasks {