From 5b81694b1d9a54801b5d6322c8b1f6daa946112e Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Sun, 21 Jan 2024 17:51:11 +0300 Subject: [PATCH] CI: Android support (#197) --- .github/workflows/build.yml | 43 +++++++++++++ scripts/ci-build-android.sh | 123 ++++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100755 scripts/ci-build-android.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d665ed78..8bd6a4e9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -258,3 +258,46 @@ jobs: with: name: msvc-${{ matrix.config.arch }} path: artifact/ + + android: + name: Android ${{ matrix.arch }} + runs-on: ubuntu-20.04 + env: + ndk_version: "r25c" + ANDROID_NDK: ${{ github.workspace }}/android-ndk + strategy: + matrix: + arch: [armeabi-v7a, arm64-v8a, x86, x86_64] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install deps + run: | + sudo rm /var/lib/man-db/auto-update + sudo apt-get update + sudo apt-get install -qyy wget unzip zip gcc-multilib make cmake + + - name: Cache NDK + id: cache-ndk + uses: actions/cache@v3 + with: + key: android-ndk-${{ env.ndk_version }}-linux + path: ${{ env.ANDROID_NDK }} + + - name: Install NDK + run: | + wget --progress=bar:force "http://dl.google.com/android/repository/android-ndk-${ndk_version}-linux.zip" + unzip -q "android-ndk-${ndk_version}-linux.zip" + rm "android-ndk-${ndk_version}-linux.zip" + mv "android-ndk-${ndk_version}" "${ANDROID_NDK}" + if: ${{ steps.cache-ndk.outputs.cache-hit != 'true' }} + + - name: Build + run: ./scripts/ci-build-android.sh ${{ matrix.arch }} + + #- name: Upload Artifact + # uses: actions/upload-artifact@v3 + # with: + # name: irrlicht-android-${{ matrix.arch }} + # path: ${{ runner.temp }}/pkg/${{ matrix.arch }} diff --git a/scripts/ci-build-android.sh b/scripts/ci-build-android.sh new file mode 100755 index 00000000..a865e56a --- /dev/null +++ b/scripts/ci-build-android.sh @@ -0,0 +1,123 @@ +#!/bin/bash -e + +# NOTE: this code is mostly copied from minetest_android_deps +# + +png_ver=1.6.40 +jpeg_ver=3.0.1 + +download () { + get_tar_archive libpng "https://download.sourceforge.net/libpng/libpng-${png_ver}.tar.gz" + get_tar_archive libjpeg "https://download.sourceforge.net/libjpeg-turbo/libjpeg-turbo-${jpeg_ver}.tar.gz" +} + +build () { + # Build libjpg and libpng first because Irrlicht needs them + mkdir -p libpng + pushd libpng + $srcdir/libpng/configure --host=$CROSS_PREFIX + make && make DESTDIR=$PWD install + popd + + mkdir -p libjpeg + pushd libjpeg + cmake $srcdir/libjpeg "${CMAKE_FLAGS[@]}" -DENABLE_SHARED=OFF + make && make DESTDIR=$PWD install + popd + + local libpng=$PWD/libpng/usr/local/lib/libpng.a + local libjpeg=$(echo $PWD/libjpeg/opt/libjpeg-turbo/lib*/libjpeg.a) + cmake $srcdir/irrlicht "${CMAKE_FLAGS[@]}" \ + -DBUILD_SHARED_LIBS=OFF \ + -DPNG_LIBRARY=$libpng \ + -DPNG_PNG_INCLUDE_DIR=$(dirname "$libpng")/../include \ + -DJPEG_LIBRARY=$libjpeg \ + -DJPEG_INCLUDE_DIR=$(dirname "$libjpeg")/../include + make + + cp -p lib/Android/libIrrlichtMt.a $libpng $libjpeg $pkgdir/ + cp -a $srcdir/irrlicht/include $pkgdir/include + cp -a $srcdir/irrlicht/media/Shaders $pkgdir/Shaders +} + +get_tar_archive () { + # $1: folder to extract to, $2: URL + local filename="${2##*/}" + [ -d "$1" ] && return 0 + wget -c "$2" -O "$filename" + mkdir -p "$1" + tar -xaf "$filename" -C "$1" --strip-components=1 + rm "$filename" +} + +_setup_toolchain () { + local toolchain=$(echo "$ANDROID_NDK"/toolchains/llvm/prebuilt/*) + if [ ! -d "$toolchain" ]; then + echo "Android NDK path not specified or incorrect"; return 1 + fi + export PATH="$toolchain/bin:$ANDROID_NDK:$PATH" + + unset CFLAGS CPPFLAGS CXXFLAGS + + TARGET_ABI="$1" + API=21 + if [ "$TARGET_ABI" == armeabi-v7a ]; then + CROSS_PREFIX=armv7a-linux-androideabi + CFLAGS="-mthumb" + CXXFLAGS="-mthumb" + elif [ "$TARGET_ABI" == arm64-v8a ]; then + CROSS_PREFIX=aarch64-linux-android + elif [ "$TARGET_ABI" == x86 ]; then + CROSS_PREFIX=i686-linux-android + CFLAGS="-mssse3 -mfpmath=sse" + CXXFLAGS="-mssse3 -mfpmath=sse" + elif [ "$TARGET_ABI" == x86_64 ]; then + CROSS_PREFIX=x86_64-linux-android + else + echo "Invalid ABI given"; return 1 + fi + export CC=$CROSS_PREFIX$API-clang + export CXX=$CROSS_PREFIX$API-clang++ + export AR=llvm-ar + export RANLIB=llvm-ranlib + export CFLAGS="-fPIC ${CFLAGS}" + export CXXFLAGS="-fPIC ${CXXFLAGS}" + + CMAKE_FLAGS=( + "-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake" + "-DANDROID_ABI=$TARGET_ABI" "-DANDROID_NATIVE_API_LEVEL=$API" + "-DCMAKE_BUILD_TYPE=Release" + ) + + # make sure pkg-config doesn't interfere + export PKG_CONFIG=/bin/false + + export MAKEFLAGS="-j$(nproc)" +} + +_run_build () { + local abi=$1 + irrdir=$PWD + + mkdir -p $RUNNER_TEMP/src + cd $RUNNER_TEMP/src + srcdir=$PWD + [ -d irrlicht ] || ln -s $irrdir irrlicht + download + + builddir=$RUNNER_TEMP/build/irrlicht-$abi + pkgdir=$RUNNER_TEMP/pkg/$abi/Irrlicht + rm -rf "$pkgdir" + mkdir -p "$builddir" "$pkgdir" + + cd "$builddir" + build +} + +if [ $# -lt 1 ]; then + echo "Usage: ci-build-android.sh " + exit 1 +fi + +_setup_toolchain $1 +_run_build $1