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 @@ +