From cb29adcdce5bff7556e8be24efe5221755c444df Mon Sep 17 00:00:00 2001
From: kasperk81 <83082615+kasperk81@users.noreply.github.com>
Date: Mon, 10 Mar 2025 13:46:03 +0000
Subject: [PATCH] add linux/musl-riscv64 build
---
.github/workflows/ci.yml | 7 +--
README.md | 4 +-
UpdateLibgit2ToSha.ps1 | 1 +
docker/linux | 43 ++++++++++++++++---
docker/musl | 8 ----
dockerbuild.sh | 10 +++--
nuget.package/libgit2/LibGit2Sharp.dll.config | 1 +
7 files changed, 53 insertions(+), 21 deletions(-)
delete mode 100644 docker/musl
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 16c2c540..125fbce2 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -33,12 +33,16 @@ jobs:
name: linux-arm64
- os: ubuntu-24.04
name: linux-ppc64le
+ - os: ubuntu-24.04
+ name: linux-riscv64
- os: ubuntu-24.04
name: linux-musl-x64
- os: ubuntu-24.04
name: linux-musl-arm
- os: ubuntu-24.04
name: linux-musl-arm64
+ - os: ubuntu-24.04
+ name: linux-musl-riscv64
- os: macos-14
name: osx-x64
- os: macos-14
@@ -55,9 +59,6 @@ jobs:
- name: Build macOS
if: runner.os == 'macOS'
run: ./build.libgit2.sh
- - name: Setup QEMU
- if: matrix.name == 'linux-musl-arm' || matrix.name == 'linux-musl-arm64'
- run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
- name: Build Linux
if: runner.os == 'Linux'
run: ./dockerbuild.sh
diff --git a/README.md b/README.md
index a6f68879..2b0e1131 100644
--- a/README.md
+++ b/README.md
@@ -12,8 +12,8 @@ the following platforms:
- Windows (x86, x64, arm64)
- macOS (x64, arm64)
- Linux
- - glibc: (x64, arm, arm64, ppc64le)
- - musl: (x64, arm, arm64)
+ - glibc: (x64, arm, arm64, ppc64le, riscv64)
+ - musl: (x64, arm, arm64, riscv64)
[lg2s-nb]: https://www.nuget.org/packages/LibGit2Sharp.NativeBinaries
[lg2]: https://libgit2.github.com/
diff --git a/UpdateLibgit2ToSha.ps1 b/UpdateLibgit2ToSha.ps1
index a3111d3d..00ca2ace 100644
--- a/UpdateLibgit2ToSha.ps1
+++ b/UpdateLibgit2ToSha.ps1
@@ -124,6 +124,7 @@ Push-Location $libgit2Directory
+
diff --git a/docker/linux b/docker/linux
index 7e4131a9..7ed2c50c 100644
--- a/docker/linux
+++ b/docker/linux
@@ -1,9 +1,42 @@
-FROM kmturley/crossbuild
-ARG ARCH='amd64'
-ENV CROSS_TRIPLE=${ARCH}
-RUN apt update && apt -y install pkg-config
+FROM ubuntu:24.04
+ARG ARCH=amd64
+ARG IS_MUSL=false
+
+# 1. Install common host utilities
+RUN apt-get update && apt-get install -y \
+ build-essential cmake git pkg-config wget xz-utils
+
+# 2. Setup GLIBC Cross-Compilers (if not musl)
+RUN if [ "$IS_MUSL" = "false" ]; then \
+ if [ "$ARCH" = "arm64" ]; then apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu && echo "CC=aarch64-linux-gnu-gcc\nCXX=aarch64-linux-gnu-g++" >> /env_vars; \
+ elif [ "$ARCH" = "armhf" ]; then apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf && echo "CC=arm-linux-gnueabihf-gcc\nCXX=arm-linux-gnueabihf-g++" >> /env_vars; \
+ elif [ "$ARCH" = "powerpc64le" ]; then apt-get install -y gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu && echo "CC=powerpc64le-linux-gnu-gcc\nCXX=powerpc64le-linux-gnu-g++" >> /env_vars; \
+ elif [ "$ARCH" = "riscv64" ]; then apt-get install -y gcc-riscv64-linux-gnu g++-riscv64-linux-gnu && echo "CC=riscv64-linux-gnu-gcc\nCXX=riscv64-linux-gnu-g++" >> /env_vars; \
+ else echo "CC=gcc\nCXX=g++" >> /env_vars; fi \
+ fi
+
+# 3. Setup MUSL Cross-Compilers via Dyne.org mirror (if musl)
+RUN if [ "$IS_MUSL" = "true" ]; then \
+ if [ "$ARCH" = "arm64" ]; then FILE_NAME="dyne-gcc-musl-arm_64.tar.xz" && BIN_PREFIX="aarch64-linux-musl"; \
+ elif [ "$ARCH" = "armhf" ]; then FILE_NAME="dyne-gcc-musl-arm_hf.tar.xz" && BIN_PREFIX="arm-linux-musleabihf"; \
+ elif [ "$ARCH" = "riscv64" ]; then FILE_NAME="dyne-gcc-musl-riscv_64.tar.xz" && BIN_PREFIX="riscv64-linux-musl"; \
+ else FILE_NAME="dyne-gcc-musl-x86_64.tar.xz" && BIN_PREFIX="x86_64-linux-musl"; fi && \
+ mkdir -p /opt/musl-cross && \
+ wget "https://files.dyne.org/musl/${FILE_NAME}" && \
+ tar -xJf ${FILE_NAME} -C /opt/musl-cross --strip-components=1 && \
+ rm ${FILE_NAME} && \
+ echo "CC=/opt/musl-cross/gcc-musl/bin/${BIN_PREFIX}-gcc" >> /env_vars && \
+ echo "CXX=/opt/musl-cross/gcc-musl/bin/${BIN_PREFIX}-g++" >> /env_vars && \
+ echo "AR=/opt/musl-cross/gcc-musl/bin/${BIN_PREFIX}-ar" >> /env_vars && \
+ echo "AS=/opt/musl-cross/gcc-musl/bin/${BIN_PREFIX}-as" >> /env_vars && \
+ echo "CFLAGS=-I/opt/musl-cross/gcc-musl/${BIN_PREFIX}/include" >> /env_vars && \
+ echo "CXXFLAGS=-I/opt/musl-cross/gcc-musl/${BIN_PREFIX}/include" >> /env_vars && \
+ echo "LDFLAGS=-L/opt/musl-cross/gcc-musl/${BIN_PREFIX}/lib" >> /env_vars && \
+ echo "PKG_CONFIG_PATH=/opt/musl-cross/gcc-musl/${BIN_PREFIX}/lib/pkgconfig" >> /env_vars; \
+ fi
WORKDIR /nativebinaries
COPY . /nativebinaries/
-CMD ["/bin/bash", "-c", "./build.libgit2.sh"]
+# Inject environmental paths dynamically to run the libgit2 build script natively
+CMD ["/bin/bash", "-c", "export $(cat /env_vars | xargs) && ./build.libgit2.sh"]
diff --git a/docker/musl b/docker/musl
deleted file mode 100644
index 1cfa1e4e..00000000
--- a/docker/musl
+++ /dev/null
@@ -1,8 +0,0 @@
-ARG ARCH='amd64'
-FROM multiarch/alpine:${ARCH}-v3.13
-RUN apk add --no-cache bash build-base cmake
-
-WORKDIR /nativebinaries
-COPY . /nativebinaries/
-
-CMD ["/bin/bash", "-c", "./build.libgit2.sh"]
\ No newline at end of file
diff --git a/dockerbuild.sh b/dockerbuild.sh
index c42fa150..c7b07c10 100755
--- a/dockerbuild.sh
+++ b/dockerbuild.sh
@@ -9,17 +9,21 @@ elif [[ $RID =~ arm ]]; then
arch="armhf"
elif [[ $RID =~ ppc64le ]]; then
arch="powerpc64le"
+elif [[ $RID =~ riscv64 ]]; then
+ arch="riscv64"
else
arch="amd64"
fi
if [[ $RID == linux-musl* ]]; then
- dockerfile="docker/musl"
+ is_musl="true"
else
- dockerfile="docker/linux"
+ is_musl="false"
fi
-docker buildx build -t $RID -f $dockerfile --build-arg ARCH=$arch .
+docker build -t $RID -f docker/linux \
+ --build-arg ARCH=$arch \
+ --build-arg IS_MUSL=$is_musl .
docker run -t -e RID=$RID --name=$RID $RID
diff --git a/nuget.package/libgit2/LibGit2Sharp.dll.config b/nuget.package/libgit2/LibGit2Sharp.dll.config
index 95f4b0bc..25074a9a 100644
--- a/nuget.package/libgit2/LibGit2Sharp.dll.config
+++ b/nuget.package/libgit2/LibGit2Sharp.dll.config
@@ -3,6 +3,7 @@
+