Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions .github/workflows/create_release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,55 @@ jobs:
tag_name: ${{ env.CURRENT_VERSION }}
files: ${{ env.PUBLISH_DIR }}/${{ runner.os }}.zip
generate_release_notes: true

create_android_release:
# See: .github/workflows/create_release_pr.yaml
if: ${{ github.head_ref == 'prepare_for_release' && github.event.pull_request.merged == true }}
env:
OUTPUT_DIR: libedax_output
PUBLISH_DIR: dst
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
matrix:
android_abi: [arm64-v8a, armeabi-v7a, x86_64, x86]

steps:
- uses: actions/checkout@v5

- uses: dart-lang/setup-dart@v1

- name: inject current version
shell: bash
run: echo "CURRENT_VERSION=$(dart pub deps --style compact | grep "libedax4dart" | cut -c 14-)" >> $GITHUB_ENV

- name: Setup Android NDK
uses: nttld/setup-ndk@v1
with:
ndk-version: r25c
add-to-path: true

- name: Install p7zip
run: sudo apt-get update && sudo apt-get install -y p7zip-full

- name: Build Android libedax
shell: bash
env:
android_abi: ${{ matrix.android_abi }}
dst: ${{ env.OUTPUT_DIR }}
run: ./scripts/build_libedax_android.sh

- name: compress Android files
shell: bash
run: |
mkdir -p ${{ env.PUBLISH_DIR }}
cd ${{ env.OUTPUT_DIR }}/android/${{ matrix.android_abi }}
zip -r ../../../${{ env.PUBLISH_DIR }}/Android-${{ matrix.android_abi }}.zip .

- uses: softprops/action-gh-release@v2
env:
GITHUB_TOKEN: ${{ secrets.PAT }}
with:
tag_name: ${{ env.CURRENT_VERSION }}
files: ${{ env.PUBLISH_DIR }}/Android-${{ matrix.android_abi }}.zip
generate_release_notes: true
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ With using libedax4dart, you can execute functions equivalent to [edax](https://
- macos: `libedax.universal.dylib`
- windows: `libedax-x64.dll`
- linux: `libedax.so`
- android: `libedax-{arch}.so` (where {arch} is arm64-v8a, armeabi-v7a, x86_64, or x86)
- (Optional) data for edax
- `book.dat`
- `eval.dat`
Expand Down
90 changes: 90 additions & 0 deletions scripts/build_libedax_android.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#!/bin/bash
# shellcheck disable=SC2154,SC2086
set -euxo pipefail

# NOTE: require some environment variables.
# android_abi: Android ABI (arm64-v8a, armeabi-v7a, x86_64, x86)
# dst: output directory (e.g. build)
#
# example:
# android_abi="arm64-v8a" dst="." ./scripts/build_libedax_android.sh

if [ -z "${android_abi:-}" ]; then
echo "Error: android_abi environment variable is required"
exit 1
fi

# Clone and setup edax-reversi
rm -rf edax-reversi
git clone https://github.com/sensuikan1973/edax-reversi
cd edax-reversi
git remote update --prune
git switch libedax_sensuikan1973
git checkout "$(cat ../.libedax-version)"

# Download eval data
mkdir -p data
curl -OL https://github.com/abulmo/edax-reversi/releases/download/v4.4/eval.7z
7za x eval.7z -y

# Set up Android NDK toolchain
export ANDROID_NDK_ROOT=$ANDROID_NDK_LATEST_HOME

# Detect the correct prebuilt directory based on the host OS
if [[ "$OSTYPE" == "darwin"* ]]; then
export NDK_TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
export NDK_TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
else
echo "Error: Unsupported OS type: $OSTYPE"
exit 1
fi

# Set up compiler and flags based on architecture
case "$android_abi" in
"arm64-v8a")
export CC=$NDK_TOOLCHAIN/bin/aarch64-linux-android21-clang
export ARCH_FLAGS="-march=armv8-a"
export OUTPUT_NAME="libedax-arm64-v8a.so"
;;
"armeabi-v7a")
export CC=$NDK_TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
export ARCH_FLAGS="-march=armv7-a -mfpu=neon"
export OUTPUT_NAME="libedax-armeabi-v7a.so"
;;
"x86_64")
export CC=$NDK_TOOLCHAIN/bin/x86_64-linux-android21-clang
export ARCH_FLAGS="-m64"
export OUTPUT_NAME="libedax-x86_64.so"
;;
"x86")
export CC=$NDK_TOOLCHAIN/bin/i686-linux-android21-clang
export ARCH_FLAGS="-m32"
export OUTPUT_NAME="libedax-x86.so"
;;
*)
echo "Error: Unsupported android_abi: $android_abi"
exit 1
;;
esac

# Build libedax for Android
mkdir -p bin
cd src

# Custom build command for Android SO file
$CC -std=c99 -O3 -DNDEBUG -DLIB_BUILD -DANDROID -fPIC -shared $ARCH_FLAGS \
all.c -o ../bin/$OUTPUT_NAME -lm -llog

cd ../../

# Setup output directory structure
mkdir -p "${dst:-.}/android/$android_abi/bin"
mkdir -p "${dst:-.}/android/$android_abi/data"

# Copy built library and data
cp "edax-reversi/bin/$OUTPUT_NAME" "${dst:-.}/android/$android_abi/bin/"
cp -r edax-reversi/data/* "${dst:-.}/android/$android_abi/data/"

echo "Android libedax build completed for $android_abi"
echo "Output: ${dst:-.}/android/$android_abi/bin/$OUTPUT_NAME"
Loading