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}");