From bc65f1dae7c140bdfc3e3da23958e44b2ff61a3d Mon Sep 17 00:00:00 2001 From: heyujiao99 Date: Thu, 7 Aug 2025 16:52:24 +0800 Subject: [PATCH] Add support for linux riscv64 Signed-off-by: heyujiao99 --- buildSrc/src/main/java/gradlebuild/JniPlugin.java | 2 ++ buildSrc/src/main/java/gradlebuild/NcursesPlugin.java | 6 +++++- native-platform/src/main/cpp/posix.cpp | 6 +++++- .../java/net/rubygrapefruit/platform/SystemInfo.java | 2 +- .../platform/internal/MutableSystemInfo.java | 3 +++ .../net/rubygrapefruit/platform/internal/Platform.java | 9 +++++++++ 6 files changed, 25 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/java/gradlebuild/JniPlugin.java b/buildSrc/src/main/java/gradlebuild/JniPlugin.java index 6ee439b22..107fdfd36 100644 --- a/buildSrc/src/main/java/gradlebuild/JniPlugin.java +++ b/buildSrc/src/main/java/gradlebuild/JniPlugin.java @@ -252,6 +252,7 @@ public static class JniRules extends RuleSource { addPlatform(platformContainer, "osx_aarch64", "osx", "aarch64"); addPlatform(platformContainer, "linux_amd64", "linux", "amd64"); addPlatform(platformContainer, "linux_aarch64", "linux", "aarch64"); + addPlatform(platformContainer, "linux_riscv64", "linux", "riscv64"); addPlatform(platformContainer, "windows_i386", "windows", "i386"); addPlatform(platformContainer, "windows_amd64", "windows", "amd64"); addPlatform(platformContainer, "windows_aarch64", "windows", "aarch64"); @@ -266,6 +267,7 @@ public static class JniRules extends RuleSource { // The core Gradle toolchain for gcc only targets x86 and x86_64 out of the box. // https://github.com/gradle/gradle/blob/36614ee523e5906ddfa1fed9a5dc00a5addac1b0/subprojects/platform-native/src/main/java/org/gradle/nativeplatform/toolchain/internal/gcc/AbstractGccCompatibleToolChain.java toolChain.target("linux_aarch64"); + toolChain.target("linux_riscv64"); }); } if (toolChainRegistry.stream().noneMatch(toolChain -> toolChain.getName().equals("clang"))) { diff --git a/buildSrc/src/main/java/gradlebuild/NcursesPlugin.java b/buildSrc/src/main/java/gradlebuild/NcursesPlugin.java index ec219d83e..8ab935658 100644 --- a/buildSrc/src/main/java/gradlebuild/NcursesPlugin.java +++ b/buildSrc/src/main/java/gradlebuild/NcursesPlugin.java @@ -30,7 +30,7 @@ public class NcursesPlugin extends RuleSource { if (!os.isLinux()) { builder.add(NCURSES_5); } else { - for (String d : ImmutableList.of("/lib", "/lib64", "/lib/x86_64-linux-gnu", "/lib/aarch64-linux-gnu", "/usr/lib")) { + for (String d : ImmutableList.of("/lib", "/lib64", "/lib/x86_64-linux-gnu", "/lib/aarch64-linux-gnu", "/lib/riscv64-linux-gnu", "/usr/lib")) { File libDir = new File(d); if (new File(libDir, "libncurses.so.6").isFile() || new File(libDir, "libncursesw.so.6").isFile()) { builder.add(new NcursesVersion("6")); @@ -52,6 +52,8 @@ public class NcursesPlugin extends RuleSource { addPlatform(platformContainer, "linux_amd64_ncurses6", "linux", "amd64"); addPlatform(platformContainer, "linux_aarch64_ncurses5", "linux", "aarch64"); addPlatform(platformContainer, "linux_aarch64_ncurses6", "linux", "aarch64"); + addPlatform(platformContainer, "linux_riscv64_ncurses5", "linux", "riscv64"); + addPlatform(platformContainer, "linux_riscv64_ncurses6", "linux", "riscv64"); } @Mutate void configureBinaries(@Each NativeBinarySpecInternal binarySpec, Collection ncursesVersions) { @@ -80,6 +82,8 @@ private boolean isNcursesVersion(NativePlatform targetPlatform, NcursesVersion n // https://github.com/gradle/gradle/blob/36614ee523e5906ddfa1fed9a5dc00a5addac1b0/subprojects/platform-native/src/main/java/org/gradle/nativeplatform/toolchain/internal/gcc/AbstractGccCompatibleToolChain.java toolChain.target("linux_aarch64_ncurses5"); toolChain.target("linux_aarch64_ncurses6"); + toolChain.target("linux_riscv64_ncurses5"); + toolChain.target("linux_riscv64_ncurses6"); }); } diff --git a/native-platform/src/main/cpp/posix.cpp b/native-platform/src/main/cpp/posix.cpp index fd69af8a2..3092400c1 100644 --- a/native-platform/src/main/cpp/posix.cpp +++ b/native-platform/src/main/cpp/posix.cpp @@ -35,7 +35,11 @@ #include #include #include -#include +#if defined(__linux__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 32 + #include +#else + #include +#endif jmethodID fileStatDetailsMethodId; diff --git a/native-platform/src/main/java/net/rubygrapefruit/platform/SystemInfo.java b/native-platform/src/main/java/net/rubygrapefruit/platform/SystemInfo.java index 20a9b71b2..d8c8f7d0b 100644 --- a/native-platform/src/main/java/net/rubygrapefruit/platform/SystemInfo.java +++ b/native-platform/src/main/java/net/rubygrapefruit/platform/SystemInfo.java @@ -21,7 +21,7 @@ */ @ThreadSafe public interface SystemInfo extends NativeIntegration { - enum Architecture { i386, amd64, aarch64 } + enum Architecture { i386, amd64, aarch64, riscv64} /** * Returns the name of the kernel for the current operating system. diff --git a/native-platform/src/main/java/net/rubygrapefruit/platform/internal/MutableSystemInfo.java b/native-platform/src/main/java/net/rubygrapefruit/platform/internal/MutableSystemInfo.java index 460b32c54..74be9208d 100644 --- a/native-platform/src/main/java/net/rubygrapefruit/platform/internal/MutableSystemInfo.java +++ b/native-platform/src/main/java/net/rubygrapefruit/platform/internal/MutableSystemInfo.java @@ -62,6 +62,9 @@ public Architecture getArchitecture() { if (machineArchitecture.equals("aarch64") || machineArchitecture.equals("arm64")) { return Architecture.aarch64; } + if (machineArchitecture.equals("riscv64")) { + return Architecture.riscv64; + } throw new NativeException(String.format("Cannot determine architecture from kernel architecture name '%s'.", machineArchitecture)); } diff --git a/native-platform/src/main/java/net/rubygrapefruit/platform/internal/Platform.java b/native-platform/src/main/java/net/rubygrapefruit/platform/internal/Platform.java index 81c1db76c..df3184023 100644 --- a/native-platform/src/main/java/net/rubygrapefruit/platform/internal/Platform.java +++ b/native-platform/src/main/java/net/rubygrapefruit/platform/internal/Platform.java @@ -62,6 +62,8 @@ public static Platform current() { platform = new Linux32Bit(); } else if (arch.equals("aarch64")) { platform = new LinuxAarch64(); + } else if (arch.equals("riscv64")) { + platform = new LinuxRiscv64(); } } else if (osName.contains("os x") || osName.contains("darwin")) { if (arch.equals("i386")) { @@ -306,6 +308,13 @@ public String getId() { } } + private static class LinuxRiscv64 extends Linux { + @Override + public String getId() { + return "linux-riscv64"; + } + } + private abstract static class FreeBSD extends Unix { @Override public List getLibraryVariants() {