Gradle で OS と アーキテクチャを判定する

blog1.mammb.com


システムプロパティから取得

単純にシステムプロパティから判定できる。

val os = System.getProperty("os.name")
val targetOs = when {
    os == "Mac OS X" -> "macos"
    os.startsWith("Win") -> "windows"
    os.startsWith("Linux") -> "linux"
    else -> throw Error("Unsupported OS: $os")
}

val arch = System.getProperty("os.arch")
var targetArch = when (arch) {
    "x86_64", "amd64" -> "x64"
    "aarch64" -> "arm64"
    else -> error("Unsupported arch: $arch")
}


OS Detector Plugin

OS Detector Plugin で取得することもできる。

os.nameos.arch の名前を正規化した形で取得できる。

例えば、os.archx8664|amd64|ia32e|em64t|x64 -> x86_64 のようになる。

plugins {
    id("com.google.osdetector") version "1.7.3"
}

val targetOs = when(osdetector.os) {
    "osx" -> "macos"
    "linux" -> "linux"
    "windows" -> "windows"
    else -> throw Error("Unsupported OS: $osdetector.os")
}
var targetArch = when (osdetector.arch) {
    "x86_64" -> "x64"
    "aarch64" -> "arm64"
    else -> error("Unsupported arch: $osdetector.arch")
}

どのように正規化されるかは、Detector.java を見るのが手っ取り早い。


DefaultNativePlatform

Gradle の内部APIから取得することができる。

val os = org.gradle.nativeplatform.platform.internal
        .DefaultNativePlatform.getCurrentOperatingSystem()
val arch = org.gradle.nativeplatform.platform.internal
        .DefaultNativePlatform.getCurrentArchitecture()
val artifact = when {
    os.isMacOsX  && arch.isArm64 -> "macos-arm64"
    os.isMacOsX  && arch.isAmd64 -> "macos-x64"
    os.isLinux   && arch.isAmd64 -> "linux-x64"
    os.isWindows && arch.isAmd64 -> "windows-x64"
    else -> throw Error("Unsupported OS: $os, ARCH: $arch")
}

タイプセーフに判定できるので、Gradle側で対応している範囲についてはこちらの対応が良い。

グラフィックライブラリなどの、プラットフォームに依存するライブラリ利用時に、以下のようにして利用できる。

dependencies {
    implementation("io.github.humbleui:${artifact}:0.109.2")
}

なお、OSだけであれば以下で取得することも可能。

org.gradle.internal.os.OperatingSystem.current()