From 3a8b15a4f48918eb770b50d3cb842b1ab26e84aa Mon Sep 17 00:00:00 2001 From: mcpkdot Date: Tue, 18 Feb 2025 21:11:32 +0900 Subject: [PATCH] feat(build): linux binaries for arm64 make the linux binaries work in arm64 via universal binaries BREAKING CHANGE: does not use GCC Temporary change as I couldn't get GCC to work in my computer. To use GCC, go to GenerateLibs.groovy and remove line 174. --- README.md | 8 ++++++- .../groovy/tool/generator/GenerateLibs.groovy | 21 ++++++++++++++++--- imgui-app/build.gradle | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 51a3c292..4450f6b8 100644 --- a/README.md +++ b/README.md @@ -376,6 +376,12 @@ Ensure you've downloaded git submodules. That could be achieved: - Install dependencies: `openjdk8`, `mingw-w64-gcc`, `ant`. (Package names could vary from system to system.) - Build with: `./gradlew imgui-binding:generateLibs -Denvs=linux -Dlocal` - Run with: `./gradlew example:run -PlibPath=../imgui-binding/build/libsNative/linux64` + +### Linux (arm64) + +- Check dependencies from "Linux" section and make sure you have them installed. +- Build with: `./gradlew imgui-binding:generateLibs -Denvs=linuxarm64 -Dlocal` +- Run with: `./gradlew example:run -PlibPath=../imgui-binding/build/libsNative/linuxarm64` ### macOS @@ -389,7 +395,7 @@ Ensure you've downloaded git submodules. That could be achieved: - Build with: `./gradlew imgui-binding:generateLibs -Denvs=macosarm64 -Dlocal` - Run with: `./gradlew example:run -PlibPath=../imgui-binding/build/libsNative/macosxarm64` -In `envs` parameter next values could be used `windows`, `linux` or `macos` or `macosarm64`. +In `envs` parameter next values could be used `windows`, `linux`, `linuxarm64`, `macos` or `macosarm64`. `-Dlocal` is optional and means that natives will be built under the `./imgui-binding/build/` folder. Otherwise `/tmp/imgui` folder will be used. diff --git a/buildSrc/src/main/groovy/tool/generator/GenerateLibs.groovy b/buildSrc/src/main/groovy/tool/generator/GenerateLibs.groovy index 3a0c000c..fffa3c34 100644 --- a/buildSrc/src/main/groovy/tool/generator/GenerateLibs.groovy +++ b/buildSrc/src/main/groovy/tool/generator/GenerateLibs.groovy @@ -32,6 +32,7 @@ class GenerateLibs extends DefaultTask { private final String[] buildEnvs = System.getProperty('envs')?.split(',') private final boolean forWindows = buildEnvs?.contains('windows') private final boolean forLinux = buildEnvs?.contains('linux') + private final boolean forLinuxArm64 = buildEnvs?.contains('linuxarm64') private final boolean forMac = buildEnvs?.contains('macos') private final boolean forMacArm64 = buildEnvs?.contains('macosarm64') @@ -113,9 +114,11 @@ class GenerateLibs extends DefaultTask { } if (forLinux) { - def linux64 = BuildTarget.newDefaultTarget(Os.Linux, Architecture.Bitness._64) - addFreeTypeIfEnabled(linux64) - buildTargets += linux64 + buildTargets += createLinuxTarget(Architecture.x86) + } + + if (forLinuxArm64) { + buildTargets += createLinuxTarget(Architecture.ARM) } if (forMac) { @@ -137,6 +140,8 @@ class GenerateLibs extends DefaultTask { BuildExecutor.executeAnt(jniDir + '/build-windows64.xml', commonParams) if (forLinux) BuildExecutor.executeAnt(jniDir + '/build-linux64.xml', commonParams) + if (forLinuxArm64) + BuildExecutor.executeAnt(jniDir + '/build-linuxarm64.xml', commonParams) if (forMac) BuildExecutor.executeAnt(jniDir + '/build-macosx64.xml', commonParams) if (forMacArm64) @@ -148,6 +153,8 @@ class GenerateLibs extends DefaultTask { checkLibExist("windows64/imgui-java64.dll") if (forLinux) checkLibExist("linux64/libimgui-java64.so") + if (forLinuxArm64) + checkLibExist("linuxarm64/libimgui-java64.so") if (forMac) checkLibExist("macosx64/libimgui-java64.dylib") if (forMacArm64) @@ -162,6 +169,14 @@ class GenerateLibs extends DefaultTask { } } + BuildTarget createLinuxTarget(Architecture arch) { + def linuxTarget = BuildTarget.newDefaultTarget(Os.Linux, Architecture.Bitness._64, arch) + linuxTarget.compilerPrefix = "" // TODO: test with GNU gcc + linuxTarget.libName = "libimgui-java64.so" // Lib for arm64 will be named the same for consistency + addFreeTypeIfEnabled(linuxTarget) + return linuxTarget + } + BuildTarget createMacTarget(Architecture arch) { def minMacOsVersion = '10.15' def macTarget = BuildTarget.newDefaultTarget(Os.MacOsX, Architecture.Bitness._64, arch) diff --git a/imgui-app/build.gradle b/imgui-app/build.gradle index 5ed4355d..718827f2 100644 --- a/imgui-app/build.gradle +++ b/imgui-app/build.gradle @@ -19,7 +19,7 @@ dependencies { api 'org.lwjgl:lwjgl-glfw' api 'org.lwjgl:lwjgl-opengl' - ['natives-linux', 'natives-windows', 'natives-macos', 'natives-macos-arm64'].each { + ['natives-linux', 'natives-linux-arm64', 'natives-windows', 'natives-macos', 'natives-macos-arm64'].each { api "org.lwjgl:lwjgl::$it" api "org.lwjgl:lwjgl-glfw::$it" api "org.lwjgl:lwjgl-opengl::$it"