diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5482c7d4..21180d33 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,6 +43,12 @@ jobs: name: osx-x64 - os: macos-13 name: osx-arm64 + - os: ubuntu-24.04 + name: android-arm + param: -android-arm + - os: ubuntu-24.04 + name: android-arm64 + param: -android-arm64 fail-fast: false steps: - name: Checkout @@ -56,23 +62,31 @@ jobs: if: runner.os == 'macOS' run: ./build.libgit2.sh - name: Setup QEMU - if: matrix.name == 'linux-musl-arm' || matrix.name == 'linux-musl-arm64' + if: contains(matrix.name, 'linux-musl-arm') run: docker run --rm --privileged multiarch/qemu-user-static:register --reset + - name: Setup Android NDK + if: contains(matrix.name, 'android') + run: | + chmod +x install_ndk.sh + ./install_ndk.sh - name: Build Linux - if: runner.os == 'Linux' + if: runner.os == 'Linux' && (!contains(matrix.name, 'android')) run: ./dockerbuild.sh + - name: Build for Android + if: runner.os == 'Linux' && contains(matrix.name, 'android') + run: ./build.libgit2.sh - name: Upload artifacts uses: actions/upload-artifact@v4.4.3 with: name: ${{ matrix.name }} path: nuget.package/runtimes/${{ matrix.name }} package: - name: Create package - needs: build - runs-on: ubuntu-24.04 - env: - DOTNET_NOLOGO: true - steps: + name: Create package + needs: build + runs-on: ubuntu-24.04 + env: + DOTNET_NOLOGO: true + steps: - name: Checkout uses: actions/checkout@v4.2.2 with: diff --git a/build.libgit2.sh b/build.libgit2.sh index 3ac9e48e..fe807f53 100755 --- a/build.libgit2.sh +++ b/build.libgit2.sh @@ -26,16 +26,54 @@ pushd libgit2/build export _BINPATH=`pwd` -cmake -DCMAKE_BUILD_TYPE:STRING=Release \ - -DBUILD_TESTS:BOOL=OFF \ - -DUSE_SSH=exec \ - -DLIBGIT2_FILENAME=git2-$SHORTSHA \ - -DCMAKE_OSX_ARCHITECTURES=$OSXARCHITECTURE \ - -DUSE_HTTPS=$USEHTTPS \ - -DUSE_BUNDLED_ZLIB=ON \ - .. -cmake --build . +# Проверка, собираем ли для Android +if [[ "$RID" == *"android"* ]]; then + echo "Building for Android: $RID" + export ANDROID_TOOLCHAIN_ROOT="${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64" + export android_target_abi=21 + + if [[ "$RID" == "android-arm64" ]]; then + export TOOLCHAIN_FILE="../cmake-toolchains/libgit2-arm64-toolchain.cmake" + else + export TOOLCHAIN_FILE="../cmake-toolchains/libgit2-armv7-toolchain.cmake" + fi + + cmake -DCMAKE_BUILD_TYPE=Release \ + -DUSE_SSH=OFF \ + -DBUILD_TESTS=OFF \ + -DBUILD_CLI=OFF \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_FUZZERS=OFF \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_C_STANDARD=99 \ + -DLIBGIT2_FILENAME=git2-$SHORTSHA \ + -DUSE_HTTPS=$USEHTTPS \ + -DUSE_BUNDLED_ZLIB=ON \ + -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE" \ + .. +else + # Сборка для Mac/Linux по умолчанию + if [[ $OS == "Darwin" ]]; then + cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTS=OFF \ + -DUSE_SSH=exec \ + -DLIBGIT2_FILENAME=git2-$SHORTSHA \ + -DCMAKE_OSX_ARCHITECTURES=$OSXARCHITECTURE \ + -DUSE_HTTPS=$USEHTTPS \ + -DUSE_BUNDLED_ZLIB=ON \ + .. + else + cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTS=OFF \ + -DUSE_SSH=exec \ + -DLIBGIT2_FILENAME=git2-$SHORTSHA \ + -DUSE_HTTPS=$USEHTTPS \ + -DUSE_BUNDLED_ZLIB=ON \ + .. + fi +fi +cmake --build . popd if [[ $RID == "" ]]; then diff --git a/cmake-toolchains/libgit2-arm64-toolchain.cmake b/cmake-toolchains/libgit2-arm64-toolchain.cmake new file mode 100644 index 00000000..9b0d1dd4 --- /dev/null +++ b/cmake-toolchains/libgit2-arm64-toolchain.cmake @@ -0,0 +1,12 @@ +SET(CMAKE_SYSTEM_NAME Linux) +SET(CMAKE_SYSTEM_VERSION Android) + +SET(CMAKE_C_COMPILER $ENV{ANDROID_TOOLCHAIN_ROOT}/bin/aarch64-linux-android$ENV{android_target_abi}-clang) +SET(CMAKE_CXX_COMPILER $ENV{ANDROID_TOOLCHAIN_ROOT}/bin/aarch64-linux-android$ENV{android_target_abi}-clang++) +SET(CMAKE_FIND_ROOT_PATH $ENV{ANDROID_TOOLCHAIN_ROOT}/sysroot/) + +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + + diff --git a/cmake-toolchains/libgit2-armv7-toolchain.cmake b/cmake-toolchains/libgit2-armv7-toolchain.cmake new file mode 100644 index 00000000..44d8d763 --- /dev/null +++ b/cmake-toolchains/libgit2-armv7-toolchain.cmake @@ -0,0 +1,12 @@ +SET(CMAKE_SYSTEM_NAME Linux) +SET(CMAKE_SYSTEM_VERSION Android) + +SET(CMAKE_C_COMPILER $ENV{ANDROID_TOOLCHAIN_ROOT}/bin/armv7a-linux-androideabi$ENV{android_target_abi}-clang) +SET(CMAKE_CXX_COMPILER $ENV{ANDROID_TOOLCHAIN_ROOT}/bin/armv7a-linux-androideabi$ENV{android_target_abi}-clang++) +SET(CMAKE_FIND_ROOT_PATH $ENV{ANDROID_TOOLCHAIN_ROOT}/sysroot/) + +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + + diff --git a/install_ndk.sh b/install_ndk.sh new file mode 100644 index 00000000..03e45aaa --- /dev/null +++ b/install_ndk.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +export build_root=$HOME/libsbuild +mkdir -p $build_root +cd $build_root + +echo "Downloading: Android SDK" +# ANDROID_HOME is android sdk root, is sdk root, not ndk root +export TOOLS=$build_root/tools +export ANDROID_CMD_TOOLS=$TOOLS/android-cmdline-tools +export ANDROID_HOME=$build_root/android-sdk +export CMAKE_VERSION=3.31.1 +export NDK_VERSION=26.3.11579264 + +mkdir -p $ANDROID_CMD_TOOLS +mkdir -p $ANDROID_HOME +curl -L -o cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip + +rm -rf $ANDROID_CMD_TOOLS + +unzip cmdline-tools.zip -d $TOOLS/ +mv $TOOLS/cmdline-tools $ANDROID_CMD_TOOLS +export ANDROID_SDKMANAGER=$ANDROID_CMD_TOOLS/bin/sdkmanager +chmod +x $ANDROID_SDKMANAGER +echo "install cmake by Android sdkmanager" +yes | $ANDROID_SDKMANAGER --install "cmake;$CMAKE_VERSION" --sdk_root=$ANDROID_HOME +# $ANDROID_HOME/cmdline-tools/bin/sdkmanager --list --sdk_root=$ANDROID_HOME +# cmake root dir +export CMAKE_DIR=$ANDROID_HOME/cmake/$CMAKE_VERSION +# cmake +export CMAKE_PATH=$CMAKE_DIR/bin/cmake + +echo "print cmake version" +$CMAKE_PATH --version + +echo "downloading android ndk..." +# channel 0 stable, 1 beta, 3 canary, see: https://github.com/android/ndk-samples/wiki/Configure-NDK-Path#the-sdkmanager-command-line-tool +yes | $ANDROID_SDKMANAGER --channel=0 --install "ndk;$NDK_VERSION" --sdk_root=$ANDROID_HOME + +echo "set sdk.dir to local.properties for gradle" +REPO_PATH=${1:-$GITHUB_WORKSPACE} +REPO_PATH=${REPO_PATH:-/home/runner/work/libgit2sharp.nativebinaries/libgit2sharp.nativebinaries} +LOCAL_PROPERTIES_PATH=$REPO_PATH/local.properties +echo -e "\nsdk.dir=$ANDROID_HOME" >> $LOCAL_PROPERTIES_PATH +echo "local.properties at: $LOCAL_PROPERTIES_PATH" +echo "cat local.properties:" +cat $LOCAL_PROPERTIES_PATH + + +echo "Installation complete"