From bce1ff6c8da3933cbb757d4a57c2cd857540f986 Mon Sep 17 00:00:00 2001 From: Leslie Zhai Date: Fri, 8 Dec 2023 05:14:12 +0800 Subject: [PATCH] [experimental] Add native lib for Linux loongarch64 (#526) * Build on loongarch64 Signed-off-by: Leslie Zhai * Remove linux-loongarch64 dockcross * Remove linux-loongarch64 from native-all --------- Signed-off-by: Leslie Zhai --- Makefile.common | 16 +++++++++++++++- build.sbt | 1 + src/main/java/org/xerial/snappy/OSInfo.java | 4 ++++ .../native/Linux/loongarch64/libsnappyjava.so | Bin 0 -> 51400 bytes 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/org/xerial/snappy/native/Linux/loongarch64/libsnappyjava.so diff --git a/Makefile.common b/Makefile.common index 10898ef..9eba009 100755 --- a/Makefile.common +++ b/Makefile.common @@ -51,7 +51,7 @@ endif # os=Default is meant to be generic unix/linux # To support new CPU architecture, add a new target name here -known_os_archs := Linux-x86 Linux-x86_64 Linux-arm Linux-armv6 Linux-armv7 Linux-android-arm Linux-android-aarch64 Linux-aarch64 Linux-ppc Linux-ppc64 Linux-ppc64le Linux-s390 Linux-s390x Mac-x86 Mac-x86_64 Mac-aarch64 FreeBSD-x86_64 Windows-x86 Windows-x86_64 Windows-aarch64 SunOS-x86 SunOS-sparc SunOS-x86_64 AIX-ppc AIX-ppc64 Linux-riscv Linux-riscv64 +known_os_archs := Linux-x86 Linux-x86_64 Linux-arm Linux-armv6 Linux-armv7 Linux-android-arm Linux-android-aarch64 Linux-aarch64 Linux-ppc Linux-ppc64 Linux-ppc64le Linux-s390 Linux-s390x Mac-x86 Mac-x86_64 Mac-aarch64 FreeBSD-x86_64 Windows-x86 Windows-x86_64 Windows-aarch64 SunOS-x86 SunOS-sparc SunOS-x86_64 AIX-ppc AIX-ppc64 Linux-riscv Linux-riscv64 Linux-loongarch Linux-loongarch64 os_arch := $(OS_NAME)-$(OS_ARCH) IBM_JDK_7 := $(findstring IBM, $(shell $(JAVA) -version 2>&1 | grep IBM | grep "JRE 1.7")) @@ -310,6 +310,20 @@ Windows-aarch64_CXXFLAGS := -Ilib/inc_mac -I$(JAVA_HOME)/include -O2 -fPIC -mar Windows-aarch64_LINKFLAGS := -Wl,--kill-at -shared -static Windows-aarch64_LIBNAME := snappyjava.dll +Linux-loongarch_CXX := $(CROSS_PREFIX)g++ +Linux-loongarch_STRIP := $(CROSS_PREFIX)strip +Linux-loongarch_CXXFLAGS := -Ilib/inc_linux -I$(JAVA_HOME)/include -O2 -fPIC -fvisibility=hidden -std=c++11 +Linux-loongarch_LINKFLAGS := -shared +Linux-loongarch_LIBNAME := libsnappyjava.so +Linux-loongarch_SNAPPY_FLAGS:= + +Linux-loongarch64_CXX := $(CROSS_PREFIX)g++ +Linux-loongarch64_STRIP := $(CROSS_PREFIX)strip +Linux-loongarch64_CXXFLAGS := -Ilib/inc_linux -I$(JAVA_HOME)/include -O2 -fPIC -fvisibility=hidden -std=c++11 +Linux-loongarch64_LINKFLAGS := -shared +Linux-loongarch64_LIBNAME := libsnappyjava.so +Linux-loongarch64_SNAPPY_FLAGS:= + CXX := $($(os_arch)_CXX) STRIP := $($(os_arch)_STRIP) diff --git a/build.sbt b/build.sbt index fdc2bd1..bc62659 100644 --- a/build.sbt +++ b/build.sbt @@ -110,6 +110,7 @@ OsgiKeys.additionalHeaders := Map( "org/xerial/snappy/native/Linux/armv7/libsnappyjava.so;osname=linux;processor=arm_le", "org/xerial/snappy/native/Linux/ppc64/libsnappyjava.so;osname=linux;processor=ppc64le", "org/xerial/snappy/native/Linux/s390x/libsnappyjava.so;osname=linux;processor=s390x", + "org/xerial/snappy/native/Linux/loongarch64/libsnappyjava.so;osname=linux;processor=loongarch64", "org/xerial/snappy/native/AIX/ppc/libsnappyjava.a;osname=aix;processor=ppc", "org/xerial/snappy/native/AIX/ppc64/libsnappyjava.a;osname=aix;processor=ppc64", "org/xerial/snappy/native/SunOS/x86/libsnappyjava.so;osname=sunos;processor=x86", diff --git a/src/main/java/org/xerial/snappy/OSInfo.java b/src/main/java/org/xerial/snappy/OSInfo.java index dcb05d9..be4a747 100755 --- a/src/main/java/org/xerial/snappy/OSInfo.java +++ b/src/main/java/org/xerial/snappy/OSInfo.java @@ -48,6 +48,7 @@ public class OSInfo { public static final String IBMZ_64 = "s390x"; public static final String AARCH_64 = "aarch64"; public static final String RISCV_64 = "riscv64"; + public static final String LOONGARCH_64 = "loongarch64"; static { // x86 mappings @@ -97,6 +98,9 @@ public class OSInfo { // RISC-V mappings archMapping.put(RISCV_64, RISCV_64); + + // LoongArch64 mappings + archMapping.put(LOONGARCH_64, LOONGARCH_64); } public static void main(String[] args) { diff --git a/src/main/resources/org/xerial/snappy/native/Linux/loongarch64/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/Linux/loongarch64/libsnappyjava.so new file mode 100644 index 0000000000000000000000000000000000000000..534a9d0b613eab384cbeb394931244d9c30752c6 GIT binary patch literal 51400 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 literal 0 HcmV?d00001