[#493] Warn when running under Rosetta

This commit is contained in:
Carter Jernigan 2022-06-16 07:39:45 -04:00 committed by Carter Jernigan
parent 59b8ed5798
commit 676885d7f6
2 changed files with 48 additions and 0 deletions

View File

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

View File

@ -11,6 +11,7 @@ plugins {
id("io.gitlab.arturbosch.detekt")
id("org.jetbrains.kotlinx.kover")
id("secant.ktlint-conventions")
id("secant.rosetta-conventions")
}
tasks {