diff --git a/binding/HarfBuzzSharp.NativeAssets.Linux/HarfBuzzSharp.NativeAssets.Linux.csproj b/binding/HarfBuzzSharp.NativeAssets.Linux/HarfBuzzSharp.NativeAssets.Linux.csproj
index 1c3ae7d00e..afaeedbfa0 100644
--- a/binding/HarfBuzzSharp.NativeAssets.Linux/HarfBuzzSharp.NativeAssets.Linux.csproj
+++ b/binding/HarfBuzzSharp.NativeAssets.Linux/HarfBuzzSharp.NativeAssets.Linux.csproj
@@ -11,12 +11,14 @@
+
+
diff --git a/binding/HarfBuzzSharp.NativeAssets.Linux/buildTransitive/net4/HarfBuzzSharp.targets b/binding/HarfBuzzSharp.NativeAssets.Linux/buildTransitive/net4/HarfBuzzSharp.targets
index e57e8091c4..06826d3c4b 100644
--- a/binding/HarfBuzzSharp.NativeAssets.Linux/buildTransitive/net4/HarfBuzzSharp.targets
+++ b/binding/HarfBuzzSharp.NativeAssets.Linux/buildTransitive/net4/HarfBuzzSharp.targets
@@ -25,6 +25,9 @@
<_NativeHarfBuzzSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-riscv64\native\libHarfBuzzSharp*.so">
riscv64\
+ <_NativeHarfBuzzSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-loongarch64\native\libHarfBuzzSharp*.so">
+ loongarch64\
+
<_NativeHarfBuzzSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-musl-x86\native\libHarfBuzzSharp*.so">
@@ -42,6 +45,9 @@
<_NativeHarfBuzzSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-musl-riscv64\native\libHarfBuzzSharp*.so">
musl-riscv64\
+ <_NativeHarfBuzzSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-musl-loongarch64\native\libHarfBuzzSharp*.so">
+ musl-loongarch64\
+
diff --git a/binding/SkiaSharp.NativeAssets.Linux.NoDependencies/SkiaSharp.NativeAssets.Linux.NoDependencies.csproj b/binding/SkiaSharp.NativeAssets.Linux.NoDependencies/SkiaSharp.NativeAssets.Linux.NoDependencies.csproj
index d782128fdb..3de0a3fdde 100644
--- a/binding/SkiaSharp.NativeAssets.Linux.NoDependencies/SkiaSharp.NativeAssets.Linux.NoDependencies.csproj
+++ b/binding/SkiaSharp.NativeAssets.Linux.NoDependencies/SkiaSharp.NativeAssets.Linux.NoDependencies.csproj
@@ -22,12 +22,14 @@ The excluded dependencies are:
+
+
@@ -35,4 +37,4 @@ The excluded dependencies are:
-
\ No newline at end of file
+
diff --git a/binding/SkiaSharp.NativeAssets.Linux.NoDependencies/buildTransitive/net4/SkiaSharp.targets b/binding/SkiaSharp.NativeAssets.Linux.NoDependencies/buildTransitive/net4/SkiaSharp.targets
index 816a0521bf..ffe1394d2b 100644
--- a/binding/SkiaSharp.NativeAssets.Linux.NoDependencies/buildTransitive/net4/SkiaSharp.targets
+++ b/binding/SkiaSharp.NativeAssets.Linux.NoDependencies/buildTransitive/net4/SkiaSharp.targets
@@ -25,6 +25,9 @@
<_NativeSkiaSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-riscv64\native\libSkiaSharp*.so">
riscv64\
+ <_NativeSkiaSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-loongarch64\native\libSkiaSharp*.so">
+ loongarch64\
+
<_NativeSkiaSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-musl-x86\native\libSkiaSharp*.so">
@@ -42,6 +45,9 @@
<_NativeSkiaSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-musl-riscv64\native\libSkiaSharp*.so">
musl-riscv64\
+ <_NativeSkiaSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-musl-loongarch64\native\libSkiaSharp*.so">
+ musl-loongarch64\
+
@@ -52,4 +58,4 @@
-
\ No newline at end of file
+
diff --git a/binding/SkiaSharp.NativeAssets.Linux/SkiaSharp.NativeAssets.Linux.csproj b/binding/SkiaSharp.NativeAssets.Linux/SkiaSharp.NativeAssets.Linux.csproj
index cb841711d4..1555c37d87 100644
--- a/binding/SkiaSharp.NativeAssets.Linux/SkiaSharp.NativeAssets.Linux.csproj
+++ b/binding/SkiaSharp.NativeAssets.Linux/SkiaSharp.NativeAssets.Linux.csproj
@@ -11,12 +11,14 @@
+
+
diff --git a/binding/SkiaSharp.NativeAssets.Linux/buildTransitive/net4/SkiaSharp.targets b/binding/SkiaSharp.NativeAssets.Linux/buildTransitive/net4/SkiaSharp.targets
index fa4eff2bb9..ffe1394d2b 100644
--- a/binding/SkiaSharp.NativeAssets.Linux/buildTransitive/net4/SkiaSharp.targets
+++ b/binding/SkiaSharp.NativeAssets.Linux/buildTransitive/net4/SkiaSharp.targets
@@ -25,6 +25,9 @@
<_NativeSkiaSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-riscv64\native\libSkiaSharp*.so">
riscv64\
+ <_NativeSkiaSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-loongarch64\native\libSkiaSharp*.so">
+ loongarch64\
+
<_NativeSkiaSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-musl-x86\native\libSkiaSharp*.so">
@@ -42,6 +45,9 @@
<_NativeSkiaSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-musl-riscv64\native\libSkiaSharp*.so">
musl-riscv64\
+ <_NativeSkiaSharpFile Include="$(MSBuildThisFileDirectory)..\..\runtimes\linux-musl-loongarch64\native\libSkiaSharp*.so">
+ musl-loongarch64\
+
diff --git a/scripts/Docker/_clang-cross-common.sh b/scripts/Docker/_clang-cross-common.sh
index 57b32a8314..cad0b6c535 100755
--- a/scripts/Docker/_clang-cross-common.sh
+++ b/scripts/Docker/_clang-cross-common.sh
@@ -3,7 +3,7 @@ set -ex
# Parameters:
# $1 - The directory containing the Dockerfile [ clang-cross/10 | clang-cross ]
-# $2 - The target architecture to build for [ arm | arm64 | riscv64 | x86 | x64 ]
+# $2 - The target architecture to build for [ arm | arm64 | riscv64 | x86 | x64 | loongarch64 ]
# $3 - The ABI [ gnu | musl ]
# $4 - The variant [ "" | alpine ]
diff --git a/scripts/Docker/alpine/clang-cross/Dockerfile b/scripts/Docker/alpine/clang-cross/Dockerfile
index ff79ffff8b..e6cdd73734 100644
--- a/scripts/Docker/alpine/clang-cross/Dockerfile
+++ b/scripts/Docker/alpine/clang-cross/Dockerfile
@@ -1,9 +1,9 @@
# Arguments:
-# IMAGE_ARCH - the architecture of the image [ amd64 | arm64v8 | riscv64 ]
+# IMAGE_ARCH - the architecture of the image [ amd64 | arm64v8 | riscv64 | loongarch64 ]
# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ]
# LLVM_VERSION - the version of the LLVM compiler [ 13 | * ]
-# TOOLCHAIN_VERSION - the version of the GCC toolchain [ 9 | * ]
-# TOOLCHAIN_ARCH - the architecture of the GCC toolchain [ arm-alpine-linux-musleabihf | aarch64-alpine-linux-musl | riscv64-alpine-linux-musl ]
+# TOOLCHAIN_VERSION - the version of the GCC toolchain [ 14 | * ]
+# TOOLCHAIN_ARCH - the architecture of the GCC toolchain [ arm-alpine-linux-musleabihf | aarch64-alpine-linux-musl | riscv64-alpine-linux-musl | loongarch64-alpine-linux-musl ]
ARG IMAGE_ARCH=amd64
FROM ${IMAGE_ARCH}/debian:12
@@ -11,11 +11,12 @@ FROM ${IMAGE_ARCH}/debian:12
# Set the architecture-specific variables based on the value of the BUILD_ARCH argument
ARG BUILD_ARCH=arm64
RUN case ${BUILD_ARCH} in \
- arm) TOOLCHAIN_ARCH=armv7-alpine-linux-musleabihf ; TOOLCHAIN_ARCH_TARGET=armv7-alpine-linux-musleabihf ;; \
- arm64) TOOLCHAIN_ARCH=aarch64-alpine-linux-musl ; TOOLCHAIN_ARCH_TARGET=aarch64-alpine-linux-musl ;; \
- riscv64) TOOLCHAIN_ARCH=riscv64-alpine-linux-musl ; TOOLCHAIN_ARCH_TARGET=riscv64-alpine-linux-musl ;; \
- x86) TOOLCHAIN_ARCH=i586-alpine-linux-musl ; TOOLCHAIN_ARCH_TARGET=i586-alpine-linux-musl ;; \
- x64) TOOLCHAIN_ARCH=x86_64-alpine-linux-musl ; TOOLCHAIN_ARCH_TARGET=x86_64-alpine-linux-musl ;; \
+ arm) TOOLCHAIN_ARCH=armv7-alpine-linux-musleabihf ; TOOLCHAIN_ARCH_TARGET=armv7-alpine-linux-musleabihf ;; \
+ arm64) TOOLCHAIN_ARCH=aarch64-alpine-linux-musl ; TOOLCHAIN_ARCH_TARGET=aarch64-alpine-linux-musl ;; \
+ loongarch64) TOOLCHAIN_ARCH=loongarch64-alpine-linux-musl ; TOOLCHAIN_ARCH_TARGET=loongarch64-alpine-linux-musl ;; \
+ riscv64) TOOLCHAIN_ARCH=riscv64-alpine-linux-musl ; TOOLCHAIN_ARCH_TARGET=riscv64-alpine-linux-musl ;; \
+ x86) TOOLCHAIN_ARCH=i586-alpine-linux-musl ; TOOLCHAIN_ARCH_TARGET=i586-alpine-linux-musl ;; \
+ x64) TOOLCHAIN_ARCH=x86_64-alpine-linux-musl ; TOOLCHAIN_ARCH_TARGET=x86_64-alpine-linux-musl ;; \
*) echo "Unsupported architecture: ${BUILD_ARCH}" && exit 1 ;; \
esac \
&& echo "export TOOLCHAIN_ARCH=${TOOLCHAIN_ARCH}" > /etc/skia-env \
@@ -33,16 +34,18 @@ RUN apt-get update \
ARG MACHINE_ARCH=x86_64
RUN . /etc/skia-env \
&& case "${BUILD_ARCH}" in \
- arm) APK_ARCH=armv7 ;; \
- arm64) APK_ARCH=aarch64 ;; \
- riscv64) APK_ARCH=riscv64 ;; \
- x86) APK_ARCH=x86 ;; \
- x64) APK_ARCH=x86_64 ;; \
+ arm) APK_ARCH=armv7 ;; \
+ arm64) APK_ARCH=aarch64 ;; \
+ loongarch64) APK_ARCH=loongarch64 ;; \
+ riscv64) APK_ARCH=riscv64 ;; \
+ x86) APK_ARCH=x86 ;; \
+ x64) APK_ARCH=x86_64 ;; \
*) echo "Unsupported architecture: ${BUILD_ARCH}" && exit 1 ;; \
esac \
&& case "${BUILD_ARCH}" in \
- riscv64) DISTRO_VERSION=3.20 ;; \
- *) DISTRO_VERSION=3.17 ;; \
+ loongarch64) DISTRO_VERSION=3.21 ;; \
+ riscv64) DISTRO_VERSION=3.20 ;; \
+ *) DISTRO_VERSION=3.17 ;; \
esac \
&& APK_DIR="$(mktemp -d)" \
&& curl -SLO --create-dirs --output-dir "$APK_DIR" "https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic/v2.12.14/$MACHINE_ARCH/apk.static" \
diff --git a/scripts/Docker/alpine/clang-cross/build-local.sh b/scripts/Docker/alpine/clang-cross/build-local.sh
index 591b9d2d64..88ba2c33bf 100755
--- a/scripts/Docker/alpine/clang-cross/build-local.sh
+++ b/scripts/Docker/alpine/clang-cross/build-local.sh
@@ -2,7 +2,7 @@
set -ex
# Parameters:
-# $1 - The target architecture to build for [ arm | arm64 | riscv64 | x86 | x64 ]
+# $1 - The target architecture to build for [ arm | arm64 | riscv64 | x86 | x64 | loongarch64 ]
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
diff --git a/scripts/Docker/debian/clang-cross/13/Dockerfile b/scripts/Docker/debian/clang-cross/13/Dockerfile
new file mode 100644
index 0000000000..82117ac81c
--- /dev/null
+++ b/scripts/Docker/debian/clang-cross/13/Dockerfile
@@ -0,0 +1,88 @@
+# Arguments:
+# IMAGE_ARCH - the architecture of the image [ amd64 | arm64v8 | riscv64 | loongarch64 ]
+# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ]
+# LLVM_VERSION - the version of the LLVM compiler [ 19 | * ]
+# TOOLCHAIN_VERSION - the version of the GCC toolchain [ 14 | * ]
+# TOOLCHAIN_ARCH - the architecture of the GCC toolchain [ arm-linux-gnueabihf | aarch64-linux-gnu | riscv64-linux-gnu | loongarch64-linux-gnu ]
+# TOOLCHAIN_ARCH_SHORT - the short form architecture of the GCC toolchain [ armhf | arm64 | riscv64 | loong64 ]
+
+ARG IMAGE_ARCH=amd64
+FROM ${IMAGE_ARCH}/debian:trixie
+
+# Set the architecture-specific variables based on the value of the BUILD_ARCH argument
+ARG BUILD_ARCH=arm64
+RUN case ${BUILD_ARCH} in \
+ arm) TOOLCHAIN_ARCH=arm-linux-gnueabihf ; TOOLCHAIN_ARCH_SHORT=armhf ; TOOLCHAIN_ARCH_TARGET=armv7a-linux-gnueabihf ;; \
+ arm64) TOOLCHAIN_ARCH=aarch64-linux-gnu ; TOOLCHAIN_ARCH_SHORT=arm64 ; TOOLCHAIN_ARCH_TARGET=aarch64-linux-gnu ;; \
+ loongarch64) TOOLCHAIN_ARCH=loongarch64-linux-gnu ; TOOLCHAIN_ARCH_SHORT=loong64 ; TOOLCHAIN_ARCH_TARGET=loongarch64-linux-gnu ;; \
+ riscv64) TOOLCHAIN_ARCH=riscv64-linux-gnu ; TOOLCHAIN_ARCH_SHORT=riscv64 ; TOOLCHAIN_ARCH_TARGET=riscv64-linux-gnu ;; \
+ x86) TOOLCHAIN_ARCH=i686-linux-gnu ; TOOLCHAIN_ARCH_SHORT=i386 ; TOOLCHAIN_ARCH_TARGET=i686-linux-gnu ;; \
+ x64) TOOLCHAIN_ARCH=x86-64-linux-gnu ; TOOLCHAIN_ARCH_SHORT=amd64 ; TOOLCHAIN_ARCH_TARGET=x86_64-linux-gnu ;; \
+ *) echo "Unsupported architecture: ${BUILD_ARCH}" && exit 1 ;; \
+ esac \
+ && echo "export TOOLCHAIN_ARCH=${TOOLCHAIN_ARCH}" > /etc/skia-env \
+ && echo "export TOOLCHAIN_ARCH_SHORT=${TOOLCHAIN_ARCH_SHORT}" >> /etc/skia-env \
+ && echo "export TOOLCHAIN_ARCH_TARGET=${TOOLCHAIN_ARCH_TARGET}" >> /etc/skia-env
+
+# Install the required packages
+ARG LLVM_VERSION=19
+RUN apt-get update \
+ && apt-get install -y \
+ curl python3 git clang-${LLVM_VERSION} ninja-build xz-utils \
+ && rm -rf /var/lib/apt/lists/*
+
+# Install the cross-compilation GCC toolchain
+ARG TOOLCHAIN_VERSION=14
+RUN . /etc/skia-env \
+ && apt-get update \
+ && apt-get install -y \
+ libc6-dev-${TOOLCHAIN_ARCH_SHORT}-cross \
+ libstdc++-${TOOLCHAIN_VERSION}-dev-${TOOLCHAIN_ARCH_SHORT}-cross \
+ libgcc-${TOOLCHAIN_VERSION}-dev-${TOOLCHAIN_ARCH_SHORT}-cross \
+ binutils-${TOOLCHAIN_ARCH} \
+ && rm -rf /var/lib/apt/lists/*
+
+# Make the script more flexible and use "current" instead of the actual version
+# libpthread.so.0 for loong64 is in https://packages.debian.org/trixie/all/libc6-loong64-cross/filelist that use GCC 14 and Glibc 2.41 to programmed
+RUN . /etc/skia-env \
+ && TOOLCHAIN_ARCH=$(echo ${TOOLCHAIN_ARCH} | sed 's/x86-64/x86_64/g') \
+ && ln -s /usr/${TOOLCHAIN_ARCH}/include/c++/${TOOLCHAIN_VERSION} /usr/${TOOLCHAIN_ARCH}/include/c++/current \
+ && sed -i "s/\/usr\/${TOOLCHAIN_ARCH}\/lib\///g" /usr/${TOOLCHAIN_ARCH}/lib/libpthread.so.0 \
+ && sed -i "s/\/usr\/${TOOLCHAIN_ARCH}\/lib\///g" /usr/${TOOLCHAIN_ARCH}/lib/libc.so
+
+# Install the cross-compilation skia build dependencies (fontconfig)
+# In order to compat Loongnix 25, LoongArch APT_REPO use loongnix 25 mirrors.
+RUN . /etc/skia-env \
+ && mkdir -p /skia-utils/libfontconfig-dev \
+ && cd /skia-utils/libfontconfig-dev \
+ && APT_REPO=http://deb.debian.org/debian \
+ && case "${TOOLCHAIN_ARCH_SHORT}" in \
+ loong64) FC_VERSION=2.15.0-1.1 ; FC_PKG=libfontconfig-dev ; APT_REPO=https://pkg.loongnix.cn/loongnix/25 ;; \
+ riscv64) FC_VERSION=2.15.0-2.1 ; FC_PKG=libfontconfig-dev ;; \
+ *) FC_VERSION=2.13.1-2 ; FC_PKG=libfontconfig1-dev ;; \
+ esac \
+ && curl ${APT_REPO}/pool/main/f/fontconfig/${FC_PKG}_${FC_VERSION}_${TOOLCHAIN_ARCH_SHORT}.deb -L -o libfontconfig-dev.deb \
+ && ar vx libfontconfig-dev.deb \
+ && tar -xJvf data.tar.xz \
+ && rm libfontconfig-dev.deb \
+ && TOOLCHAIN_ARCH=$(echo ${TOOLCHAIN_ARCH} | sed 's/x86-64/x86_64/g') \
+ && cp -R usr/lib/*/* /usr/${TOOLCHAIN_ARCH}/lib/ \
+ && cp -R usr/include/* /usr/${TOOLCHAIN_ARCH}/include/
+
+# Install the .NET SDK
+ARG DOTNET_SDK_VERSION=8.0
+ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
+RUN curl https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh -L -o dotnet-install.sh \
+ && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \
+ && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
+ && rm dotnet-install.sh \
+ && dotnet help \
+ && dotnet --info
+
+ENV CC=clang-${LLVM_VERSION} CXX=clang++-${LLVM_VERSION}
+
+WORKDIR /work
+
+COPY ./startup.sh /
+RUN chmod +x /startup.sh
+ENTRYPOINT [ "/startup.sh" ]
diff --git a/scripts/Docker/debian/clang-cross/13/startup.sh b/scripts/Docker/debian/clang-cross/13/startup.sh
new file mode 100644
index 0000000000..512bb431bf
--- /dev/null
+++ b/scripts/Docker/debian/clang-cross/13/startup.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+set -e
+
+source /etc/skia-env
+
+exec "$@"
diff --git a/scripts/Docker/debian/clang-cross/build-local.sh b/scripts/Docker/debian/clang-cross/build-local.sh
index e1f5249d93..e4155cd9e6 100644
--- a/scripts/Docker/debian/clang-cross/build-local.sh
+++ b/scripts/Docker/debian/clang-cross/build-local.sh
@@ -2,8 +2,9 @@
set -ex
# Parameters:
-# $1 - The target architecture to build for [ arm | arm64 | riscv64 | x86 | x64 ]
-# $2 - The Debian distro version [ 10 | 12 ]
+# $1 - The target architecture to build for [ arm | arm64 | riscv64 | x86 | x64 | loongarch64 ]
+# $2 - The Debian distro version [ 10 | 12 | 13 ]
+# LoongArch needs to get the packages from loongnix25
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
diff --git a/scripts/azure-templates-stages.yml b/scripts/azure-templates-stages.yml
index f49bc35c0c..8a47256c53 100644
--- a/scripts/azure-templates-stages.yml
+++ b/scripts/azure-templates-stages.yml
@@ -362,11 +362,15 @@ stages:
matrix:
- arch: x64
docker: scripts/Docker/debian/amd64
+ - arch: loongarch64
+ docker: scripts/Docker/debian/clang-cross/13
+ target: externals-linux-clang-cross
+ additionalArgs: --verifyGlibcMax=2.38
- ${{ each arch in split('arm,arm64,x86,riscv64', ',') }}: # separate x64 as it fails when cross-compiling
- arch: ${{ arch }}
docker: scripts/Docker/debian/clang-cross/10
target: externals-linux-clang-cross
- - ${{ each arch in split('arm,arm64,x64,riscv64', ',') }}: # removed x86 as it is having issues building
+ - ${{ each arch in split('arm,arm64,x64,riscv64,loongarch64', ',') }}: # removed x86 as it is having issues building
- arch: ${{ arch }}
variant: alpine
docker: scripts/Docker/alpine/clang-cross
@@ -521,6 +525,10 @@ stages:
- name: native_linux_arm_alpine_nodeps_linux
- name: native_linux_arm_linux
- name: native_linux_arm_nodeps_linux
+ - name: native_linux_loongarch64_alpine_linux
+ - name: native_linux_loongarch64_alpine_nodeps_linux
+ - name: native_linux_loongarch64_linux
+ - name: native_linux_loongarch64_nodeps_linux
- name: native_linux_riscv64_alpine_linux
- name: native_linux_riscv64_alpine_nodeps_linux
- name: native_linux_riscv64_linux
diff --git a/scripts/cake/native-shared.cake b/scripts/cake/native-shared.cake
index 860be68d29..b8c32d4f48 100644
--- a/scripts/cake/native-shared.cake
+++ b/scripts/cake/native-shared.cake
@@ -119,6 +119,8 @@ string ReduceArch(string arch)
return "arm64";
case "riscv64":
return "riscv64";
+ case "loongarch64":
+ return "loongarch64";
}
throw new Exception($"Unknown architecture: {arch}");