From 0ea188f8db576186f4e4b7f21827d072a7f273c2 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sat, 18 Jan 2025 14:45:02 +0100 Subject: [PATCH] Linux: support cross-compile native library for ARM64 on x86_64 Linux (issue #899) --- .github/workflows/natives.yml | 4 ++ .../flatlaf-natives-linux/README.md | 25 +++++-- .../flatlaf-natives-linux/build.gradle.kts | 68 +++++++++++++++++- .../flatlaf-natives-linux/lib/README.md | 4 ++ .../lib/aarch64/libjawt.so | Bin 0 -> 69544 bytes .../flatlaf-natives-windows/README.md | 4 +- 6 files changed, 95 insertions(+), 10 deletions(-) create mode 100644 flatlaf-natives/flatlaf-natives-linux/lib/README.md create mode 100644 flatlaf-natives/flatlaf-natives-linux/lib/aarch64/libjawt.so diff --git a/.github/workflows/natives.yml b/.github/workflows/natives.yml index b575eed8..96f2a44d 100644 --- a/.github/workflows/natives.yml +++ b/.github/workflows/natives.yml @@ -36,6 +36,10 @@ jobs: if: matrix.os == 'ubuntu' run: sudo apt install libxt-dev + - name: install g++-aarch64-linux-gnu + if: matrix.os == 'ubuntu' + run: sudo apt install g++-aarch64-linux-gnu + - name: Setup Java 11 uses: actions/setup-java@v4 with: diff --git a/flatlaf-natives/flatlaf-natives-linux/README.md b/flatlaf-natives/flatlaf-natives-linux/README.md index 3dd00c68..4be74776 100644 --- a/flatlaf-natives/flatlaf-natives-linux/README.md +++ b/flatlaf-natives/flatlaf-natives-linux/README.md @@ -5,12 +5,15 @@ This sub-project contains the source code for the FlatLaf Linux native library. The native library can be built only on Linux and requires a C++ compiler. +The native library is available for following CPU architectures: `x86_64` (or +`amd64`) and `arm64` (or `aarch64`). + To be able to build FlatLaf on any platform, and without C++ compiler, the -pre-built native library is checked into Git at +pre-built native libraries are checked into Git at [flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/](https://github.com/JFormDesigner/FlatLaf/tree/main/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives). -The native library was built on a GitHub server with the help of GitHub Actions. -See: +The native libraries were built on a GitHub server with the help of GitHub +Actions. See: [Native Libraries](https://github.com/JFormDesigner/FlatLaf/actions/workflows/natives.yml) workflow. Then the produced Artifacts ZIP was downloaded and the native library checked into Git. @@ -18,19 +21,27 @@ checked into Git. ## Development -To build the library on Linux, some packages needs to be installed. +To build the library on Linux, some packages needs to be installed: + +- `build-essential` - GCC and development tools +- `libxt-dev` - X11 toolkit development headers +- `g++-aarch64-linux-gnu` - GNU C++ compiler for the arm64 architecture (only on + x86_64 Linux for cross-compiling for arm64 architecture) ### Ubuntu -`build-essential` contains GCC and development tools. `libxt-dev` contains the -X11 toolkit development headers. - ~~~ sudo apt update sudo apt install build-essential libxt-dev ~~~ +Only on x86_64 Linux for cross-compiling for arm64 architecture: + +~~~ +sudo apt install g++-aarch64-linux-gnu +~~~ + ### CentOS diff --git a/flatlaf-natives/flatlaf-natives-linux/build.gradle.kts b/flatlaf-natives/flatlaf-natives-linux/build.gradle.kts index 737385e3..abfad042 100644 --- a/flatlaf-natives/flatlaf-natives-linux/build.gradle.kts +++ b/flatlaf-natives/flatlaf-natives-linux/build.gradle.kts @@ -45,8 +45,11 @@ tasks { if( org.gradle.internal.os.OperatingSystem.current().isLinux ) { val osArch = System.getProperty( "os.arch" ) - if( osArch == "amd64" || osArch == "x86-64" ) + if( osArch == "amd64" ) { dependsOn( "linkReleaseX86-64" ) + if( file( "/usr/bin/aarch64-linux-gnu-gcc" ).exists() ) + dependsOn( "linkCrossAarch64" ) + } if( osArch == "aarch64" ) dependsOn( "linkReleaseAarch64" ) } @@ -97,4 +100,67 @@ tasks { } } } + + if( org.gradle.internal.os.OperatingSystem.current().isLinux && + System.getProperty( "os.arch" ) == "amd64" && + file( "/usr/bin/aarch64-linux-gnu-gcc" ).exists() ) + { + register( "compileCrossAarch64Cpp" ) { + val include = layout.projectDirectory.dir( "src/main/headers" ) + val src = layout.projectDirectory.dir( "src/main/cpp" ) + workingDir = file( layout.buildDirectory.dir( "obj/main/release/aarch64-cross" ) ) + + doFirst { + workingDir.mkdirs() + } + + commandLine = listOf( + "aarch64-linux-gnu-gcc", + "-c", + "-fPIC", + "-fvisibility=hidden", + "-O3", + "-I", "${javaHome}/include", + "-I", "${javaHome}/include/linux", + "-I", "$include", + + "$src/ApiVersion.cpp", + "$src/X11WmUtils.cpp", + ) + } + + register( "linkCrossAarch64" ) { + dependsOn( "compileCrossAarch64Cpp" ) + + val nativesDir = project( ":flatlaf-core" ).projectDir.resolve( "src/main/resources/com/formdev/flatlaf/natives" ) + val libraryName = "libflatlaf-linux-arm64.so" + val outDir = file( layout.buildDirectory.dir( "lib/main/release/aarch64-cross" ) ) + val objDir = file( layout.buildDirectory.dir( "obj/main/release/aarch64-cross" ) ) + + doFirst { + outDir.mkdirs() + } + + commandLine = listOf( + "aarch64-linux-gnu-gcc", + "-shared", + "-Wl,-soname,$libraryName", + "-o", "$outDir/$libraryName", + + "$objDir/ApiVersion.o", + "$objDir/X11WmUtils.o", + + "-L${layout.projectDirectory}/lib/aarch64", + "-ljawt", + ) + + doLast { + // copy shared library to flatlaf-core resources + copy { + from( "$outDir/$libraryName" ) + into( nativesDir ) + } + } + } + } } diff --git a/flatlaf-natives/flatlaf-natives-linux/lib/README.md b/flatlaf-natives/flatlaf-natives-linux/lib/README.md new file mode 100644 index 00000000..f0f72077 --- /dev/null +++ b/flatlaf-natives/flatlaf-natives-linux/lib/README.md @@ -0,0 +1,4 @@ +Contains libraries used to compile FlatLaf native libraries. + +- `aarch64/libjawt.so` is `/lib/libjawt.so` from Eclipse Temurin 11.0.25+9 aarch64, + which is required to cross build aarch64/arm64 .so on x86_64 diff --git a/flatlaf-natives/flatlaf-natives-linux/lib/aarch64/libjawt.so b/flatlaf-natives/flatlaf-natives-linux/lib/aarch64/libjawt.so new file mode 100644 index 0000000000000000000000000000000000000000..1c03d7df1523c62187a4c15fd9d25e4794dfed8d GIT binary patch literal 69544 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 MzS5{@JIVb20?{8XYXATM literal 0 HcmV?d00001 diff --git a/flatlaf-natives/flatlaf-natives-windows/README.md b/flatlaf-natives/flatlaf-natives-windows/README.md index c164e381..f8504fb8 100644 --- a/flatlaf-natives/flatlaf-natives-windows/README.md +++ b/flatlaf-natives/flatlaf-natives-windows/README.md @@ -8,8 +8,8 @@ The native library can be built only on Windows and requires a C++ compiler. Tested with Microsoft Visual C++ (MSVC) 2019 and 2022 (comes with Visual Studio 2019 and 2022). -The native library is available for folloging CPU architectures: `x86_64` (or -`amd64`), `x86` and `arm64`. +The native library is available for following CPU architectures: `x86_64` (or +`amd64`), `x86` and `arm64` (or `aarch64`). To be able to build FlatLaf on any platform, and without C++ compiler, the pre-built DLLs are checked into Git at