Skip to content

Commit 09ac9b8

Browse files
authored
Add a CI workflow for building libcoro on Android
1 parent 111cc44 commit 09ac9b8

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed

.github/workflows/ci-android.yml

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
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

Comments
 (0)