2022-06-15 10:56:17 -07:00
|
|
|
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 {
|
2023-06-09 06:18:11 -07:00
|
|
|
if (System.getProperty("os.name").lowercase(java.util.Locale.ROOT).startsWith("mac")) {
|
2022-06-15 10:56:17 -07:00
|
|
|
// Counterintuitive, but running under Rosetta is reported as Intel64 to the JVM
|
2023-06-09 06:18:11 -07:00
|
|
|
if (!System.getProperty("os.arch").lowercase(java.util.Locale.ROOT).contains("aarch64")) {
|
2022-06-15 10:56:17 -07:00
|
|
|
val outputValue = Runtime.getRuntime()
|
2023-06-12 06:13:37 -07:00
|
|
|
.exec(arrayOf("sysctl", "-in", "sysctl.proc_translated"))
|
2022-06-15 10:56:17 -07:00
|
|
|
.scanOutputLine()
|
2023-06-12 06:13:37 -07:00
|
|
|
.toIntOrNull()
|
2022-06-15 10:56:17 -07:00
|
|
|
|
|
|
|
if (1 == outputValue) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2023-06-12 06:13:37 -07:00
|
|
|
fun Process.scanOutputLine(): String {
|
2022-06-15 10:56:17 -07:00
|
|
|
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()
|
|
|
|
}
|