|
| 1 | +name: ci-android |
| 2 | + |
| 3 | +on: [pull_request, workflow_dispatch] |
| 4 | + |
| 5 | +jobs: |
| 6 | + build-libcoro-android: |
| 7 | + name: Build libcoro (arm64-v8a + OpenSSL) |
| 8 | + runs-on: ubuntu-latest |
| 9 | + timeout-minutes: 60 |
| 10 | + |
| 11 | + steps: |
| 12 | + - name: Checkout |
| 13 | + uses: actions/checkout@v4 |
| 14 | + with: |
| 15 | + submodules: recursive |
| 16 | + fetch-depth: 0 |
| 17 | + |
| 18 | + - name: Set up Android SDK |
| 19 | + uses: android-actions/setup-android@v3 |
| 20 | + |
| 21 | + - name: Install Android SDK packages |
| 22 | + shell: bash |
| 23 | + run: | |
| 24 | + sdkmanager --install \ |
| 25 | + "platform-tools" \ |
| 26 | + "platforms;android-34" \ |
| 27 | + "build-tools;34.0.0" |
| 28 | + # Accept licenses; suppress Broken pipe when nothing to accept |
| 29 | + yes | sdkmanager --licenses > /dev/null || true |
| 30 | +
|
| 31 | + - name: Install build dependencies |
| 32 | + run: | |
| 33 | + sudo apt-get update |
| 34 | + sudo apt-get install -y perl rsync curl cmake |
| 35 | +
|
| 36 | + - name: Install NDK 29.0.13846066 |
| 37 | + run: | |
| 38 | + sdkmanager --install "ndk;29.0.13846066" |
| 39 | + yes | sdkmanager --licenses > /dev/null || true |
| 40 | +
|
| 41 | + - name: Export NDK env vars |
| 42 | + run: | |
| 43 | + echo "ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk/29.0.13846066" >> $GITHUB_ENV |
| 44 | + echo "ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/29.0.13846066" >> $GITHUB_ENV |
| 45 | +
|
| 46 | + - name: Build OpenSSL prebuilts (arm64-v8a) |
| 47 | + shell: bash |
| 48 | + run: | |
| 49 | + set -euo pipefail |
| 50 | + OPENSSL_VERSION="${OPENSSL_VERSION:-3.5.0}" |
| 51 | + MIN_API_LEVEL=24 |
| 52 | + ABI="arm64-v8a" |
| 53 | + ROOT_DIR="${GITHUB_WORKSPACE}" |
| 54 | + CACHE_DIR="$ROOT_DIR/.openssl_build" |
| 55 | + SRC_DIR="$CACHE_DIR/src" |
| 56 | + BUILD_ROOT="$CACHE_DIR/build" |
| 57 | + INSTALL_ROOT="$ROOT_DIR/external/openssl" |
| 58 | + TARBALL="openssl-${OPENSSL_VERSION}.tar.gz" |
| 59 | +
|
| 60 | + mkdir -p "$SRC_DIR" "$BUILD_ROOT" "$INSTALL_ROOT" |
| 61 | + pushd "$CACHE_DIR" >/dev/null |
| 62 | + if [[ ! -f "$TARBALL" ]]; then |
| 63 | + echo "[INFO] Downloading OpenSSL $OPENSSL_VERSION" |
| 64 | + for u in \ |
| 65 | + "https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz" \ |
| 66 | + "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" \ |
| 67 | + "https://ftp.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" \ |
| 68 | + "https://mirror.yandex.ru/pub/OpenSSL/openssl-${OPENSSL_VERSION}.tar.gz"; do |
| 69 | + echo " -> $u" |
| 70 | + if curl -fsSL "$u" -o "$TARBALL.tmp"; then mv "$TARBALL.tmp" "$TARBALL"; break; fi |
| 71 | + done |
| 72 | + [[ -f "$TARBALL" ]] || { echo "[ERR ] Failed to download OpenSSL"; exit 1; } |
| 73 | + fi |
| 74 | + popd >/dev/null |
| 75 | +
|
| 76 | + if [[ ! -d "$SRC_DIR/openssl-${OPENSSL_VERSION}" ]]; then |
| 77 | + tar -xf "$CACHE_DIR/$TARBALL" -C "$SRC_DIR" |
| 78 | + fi |
| 79 | +
|
| 80 | + case "$ABI" in |
| 81 | + arm64-v8a) TGT=android-arm64;; |
| 82 | + *) echo "[ERR ] Unsupported ABI $ABI"; exit 1;; |
| 83 | + esac |
| 84 | +
|
| 85 | + BUILD_DIR="$BUILD_ROOT/$ABI" |
| 86 | + INSTALL_DIR="$INSTALL_ROOT/$ABI" |
| 87 | + rm -rf "$BUILD_DIR" "$INSTALL_DIR"; mkdir -p "$BUILD_DIR" "$INSTALL_DIR" |
| 88 | + rsync -a --delete "$SRC_DIR/openssl-${OPENSSL_VERSION}/" "$BUILD_DIR/" |
| 89 | +
|
| 90 | + pushd "$BUILD_DIR" >/dev/null |
| 91 | + export ANDROID_NDK_ROOT="$ANDROID_NDK_HOME" |
| 92 | + export ANDROID_NDK_HOME="$ANDROID_NDK_HOME" |
| 93 | + export PATH="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH" |
| 94 | + perl ./Configure "$TGT" -D__ANDROID_API__=$MIN_API_LEVEL \ |
| 95 | + --prefix="$INSTALL_DIR" --openssldir="$INSTALL_DIR" \ |
| 96 | + no-shared no-tests no-apps no-docs |
| 97 | + [[ -f Makefile ]] || { echo "[ERR ] Configure failed"; exit 1; } |
| 98 | + make -j"$(nproc)" build_libs |
| 99 | + make install_dev |
| 100 | + [[ -f "$INSTALL_DIR/lib/libssl.a" && -f "$INSTALL_DIR/lib/libcrypto.a" ]] || { echo "[ERR ] Missing libs"; exit 1; } |
| 101 | + popd >/dev/null |
| 102 | +
|
| 103 | + echo "OpenSSL installed to: $INSTALL_DIR" |
| 104 | +
|
| 105 | + - name: Configure libcoro (CMake Android toolchain) |
| 106 | + run: | |
| 107 | + ANDROID_ABI="arm64-v8a" |
| 108 | + OPENSSL_DIR="${{ github.workspace }}/external/openssl/$ANDROID_ABI" |
| 109 | + cmake -S . -B build-android-arm64 \ |
| 110 | + -DCMAKE_BUILD_TYPE=Release \ |
| 111 | + -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake" \ |
| 112 | + -DCMAKE_PREFIX_PATH="$OPENSSL_DIR" \ |
| 113 | + -DANDROID_ABI=$ANDROID_ABI \ |
| 114 | + -DANDROID_PLATFORM=24 \ |
| 115 | + -DANDROID_STL=c++_static \ |
| 116 | + -DLIBCORO_BUILD_TESTS=OFF \ |
| 117 | + -DLIBCORO_BUILD_EXAMPLES=OFF \ |
| 118 | + -DOPENSSL_ROOT_DIR="$OPENSSL_DIR" \ |
| 119 | + -DOPENSSL_USE_STATIC_LIBS=ON \ |
| 120 | + -DOPENSSL_INCLUDE_DIR="$OPENSSL_DIR/include" \ |
| 121 | + -DOPENSSL_CRYPTO_LIBRARY="$OPENSSL_DIR/lib/libcrypto.a" \ |
| 122 | + -DOPENSSL_SSL_LIBRARY="$OPENSSL_DIR/lib/libssl.a" \ |
| 123 | + -DOPENSSL_LIBRARIES="$OPENSSL_DIR/lib/libssl.a;$OPENSSL_DIR/lib/libcrypto.a" \ |
| 124 | + -DCARES_STATIC_PIC=ON \ |
| 125 | + -DCARES_BUILD_TOOLS=OFF |
| 126 | +
|
| 127 | + - name: Build libcoro |
| 128 | + run: | |
| 129 | + cmake --build build-android-arm64 --config Release -j |
| 130 | + file build-android-arm64/libcoro.a || true |
| 131 | + ls -lah build-android-arm64 || true |
| 132 | +
|
| 133 | + - name: Upload libcoro static lib |
| 134 | + if: success() |
| 135 | + uses: actions/upload-artifact@v4 |
| 136 | + with: |
| 137 | + name: libcoro-android-arm64 |
| 138 | + path: | |
| 139 | + build-android-arm64/**/*.a |
0 commit comments