diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f1fd20f..9b53754 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -138,7 +138,6 @@ jobs: files: "${{ github.workspace }}/artifacts/libsimple-windows-${{ matrix.arch }}.zip" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BUILD_TYPE: ${{ github.ref_type == 'tag' && 'Release' || 'Debug' }} Linux: runs-on: ${{ matrix.os }} @@ -147,14 +146,9 @@ jobs: matrix: os: [ubuntu-22.04, ubuntu-24.04-arm, ubuntu-latest] timeout-minutes: 60 + env: + BUILD_TYPE: ${{ startsWith(github.ref, 'refs/tags/') && 'Release' || 'Debug' }} steps: - - name: "Release Build Type" - if: startsWith(github.ref, 'refs/tags/') - run: echo "BUILD_TYPE=Release" >> $GITHUB_ENV - - name: "Debug Build Type" - if: startsWith(github.ref, 'refs/tags/') != true - run: echo "BUILD_TYPE=Debug" >> $GITHUB_ENV - - uses: actions/checkout@v6 with: fetch-depth: 0 @@ -187,15 +181,8 @@ jobs: uses: lukka/run-cmake@v10 continue-on-error: false with: - configurePreset: 'ninja-vcpkg-coverage' - buildPreset: 'ninja-vcpkg-coverage' - - - name: 'Run CMake without coverage' - if: startsWith(github.ref, 'refs/tags/') - uses: lukka/run-cmake@v10 - with: - configurePreset: 'ninja-vcpkg-release' - buildPreset: 'ninja-vcpkg-release' + configurePreset: ${{ startsWith(github.ref, 'refs/tags/') && 'ninja-vcpkg-release' || 'ninja-vcpkg-coverage' }} + buildPreset: ${{ startsWith(github.ref, 'refs/tags/') && 'ninja-vcpkg-release' || 'ninja-vcpkg-coverage' }} - name: 'Run CTest' if: ${{ startsWith(github.ref, 'refs/tags/') != true && matrix.os == 'ubuntu-latest' }} @@ -292,14 +279,9 @@ jobs: MacOS: runs-on: macos-latest needs: Linux + env: + BUILD_TYPE: ${{ startsWith(github.ref, 'refs/tags/') && 'Release' || 'Debug' }} steps: - - name: "Release Build Type" - if: startsWith(github.ref, 'refs/tags/') - run: echo "BUILD_TYPE=Release" >> $GITHUB_ENV - - name: "Debug Build Type" - if: startsWith(github.ref, 'refs/tags/') != true - run: echo "BUILD_TYPE=Debug" >> $GITHUB_ENV - - uses: actions/checkout@v6 with: submodules: true @@ -380,3 +362,79 @@ jobs: - name: build-iOS if: success() run: ./build-ios.sh + + - name: Package iOS + if: startsWith(github.ref, 'refs/tags/') + run: | + mkdir libsimple-ios-xcframework + cp -r output/libsimple.xcframework output/dict libsimple-ios-xcframework/ + zip -r libsimple-ios-xcframework.zip libsimple-ios-xcframework + working-directory: "${{ github.workspace }}" + + - name: Release iOS + if: startsWith(github.ref, 'refs/tags/') + uses: softprops/action-gh-release@v2 + with: + draft: true + files: "${{ github.workspace }}/libsimple-ios-xcframework.zip" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + Android: + runs-on: ubuntu-latest + needs: Linux + strategy: + fail-fast: true + matrix: + abi: [arm64-v8a, x86_64] + steps: + - uses: actions/checkout@v6 + with: + submodules: true + + - name: Resolve Android NDK + run: | + if [ -z "${ANDROID_NDK_LATEST_HOME:-}" ]; then + echo "ANDROID_NDK_LATEST_HOME is not available on this runner." >&2 + exit 1 + fi + echo "ANDROID_NDK_HOME=${ANDROID_NDK_LATEST_HOME}" >> "$GITHUB_ENV" + + - name: Configure Android + run: | + cmake -S "${{ github.workspace }}" -B "${{ github.workspace }}/build-android-${{ matrix.abi }}" \ + -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake" \ + -DANDROID_ABI="${{ matrix.abi }}" \ + -DANDROID_PLATFORM=android-21 \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="${{ github.workspace }}/output-android-${{ matrix.abi }}" \ + -DBUILD_TEST_EXAMPLE=OFF \ + -DBUILD_SHELL=OFF + + - name: Build Android + run: cmake --build "${{ github.workspace }}/build-android-${{ matrix.abi }}" --config Release --parallel + + - name: Install Android + run: cmake --install "${{ github.workspace }}/build-android-${{ matrix.abi }}" --config Release + + - name: Verify Android outputs + run: | + test -f "output-android-${{ matrix.abi }}/bin/libsimple.so" + test -f "output-android-${{ matrix.abi }}/bin/dict/jieba.dict.utf8" + + - name: Package Android + if: startsWith(github.ref, 'refs/tags/') + run: | + mkdir "libsimple-android-${{ matrix.abi }}" + cp -r "output-android-${{ matrix.abi }}/bin/libsimple.so" "output-android-${{ matrix.abi }}/bin/dict" "libsimple-android-${{ matrix.abi }}/" + zip -r "libsimple-android-${{ matrix.abi }}.zip" "libsimple-android-${{ matrix.abi }}" + working-directory: "${{ github.workspace }}" + + - name: Release Android + if: startsWith(github.ref, 'refs/tags/') + uses: softprops/action-gh-release@v2 + with: + draft: true + files: "${{ github.workspace }}/libsimple-android-${{ matrix.abi }}.zip" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index d7fc290..b758dbe 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![Downloads](https://img.shields.io/github/downloads/wangfenjin/simple/total)](https://img.shields.io/github/downloads/wangfenjin/simple/total) -[![build](https://github.com/wangfenjin/simple/workflows/CI/badge.svg)](https://github.com/wangfenjin/simple/actions?query=workflow%3ACI) +[![build](https://github.com/wangfenjin/simple/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/wangfenjin/simple/actions/workflows/main.yml) [![codecov](https://codecov.io/gh/wangfenjin/simple/branch/master/graph/badge.svg?token=8SHLFZ3RB4)](https://codecov.io/gh/wangfenjin/simple) [![CodeFactor](https://www.codefactor.io/repository/github/wangfenjin/simple/badge)](https://www.codefactor.io/repository/github/wangfenjin/simple) [![License: MIT](https://img.shields.io/badge/Dual_License-MIT_or_GPL_v3_later-blue.svg)](https://github.com/wangfenjin/simple/blob/master/LICENSE) diff --git a/build-ios.sh b/build-ios.sh index 6a5bbee..3097d7e 100755 --- a/build-ios.sh +++ b/build-ios.sh @@ -1,15 +1,57 @@ #!/bin/sh -current_dir=$(pwd)/$(dirname "$0") -build_dir="${current_dir}/build-ios" -lib_prefix="${current_dir}/output" +set -eu -cmake "$current_dir" -G Xcode -DCMAKE_TOOLCHAIN_FILE=contrib/ios.toolchain.cmake \ - -DPLATFORM=OS64COMBINED -DENABLE_BITCODE=1 \ - -DCMAKE_INSTALL_PREFIX="" -B "$build_dir" \ - -DDEPLOYMENT_TARGET=8.0 +script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +toolchain_file="${script_dir}/contrib/ios.toolchain.cmake" +ios_output_root="${script_dir}/output-ios" +final_output_root="${script_dir}/output" +headers_dir="${ios_output_root}/headers" -cd "$build_dir" || exit +build_variant() { + platform="$1" + build_dir="${script_dir}/build-ios-${platform}" + install_dir="${ios_output_root}/${platform}" -cmake --build "$build_dir" --config Release -cmake --install "$build_dir" --config Release --prefix "${lib_prefix}" + cmake -S "${script_dir}" -B "${build_dir}" -G Xcode \ + -DCMAKE_TOOLCHAIN_FILE="${toolchain_file}" \ + -DPLATFORM="${platform}" \ + -DENABLE_BITCODE=1 \ + -DDEPLOYMENT_TARGET=8.0 \ + -DCMAKE_INSTALL_PREFIX="" + + cmake --build "${build_dir}" --config Release + cmake --install "${build_dir}" --config Release --prefix "${install_dir}" +} + +rm -rf "${ios_output_root}" "${final_output_root}/libsimple.xcframework" "${final_output_root}/dict" +mkdir -p "${headers_dir}" "${final_output_root}" +cp "${script_dir}"/src/*.h "${headers_dir}/" + +build_variant OS64 +build_variant SIMULATOR64 +build_variant SIMULATORARM64 + +sim64_lib="${ios_output_root}/SIMULATOR64/bin/libsimple.a" +simarm64_lib="${ios_output_root}/SIMULATORARM64/bin/libsimple.a" +sim_universal_dir="${ios_output_root}/SIMULATOR_UNIVERSAL/bin" +sim_universal_lib="${sim_universal_dir}/libsimple.a" + +mkdir -p "${sim_universal_dir}" +sim64_archs="$(lipo -archs "${sim64_lib}")" +simarm64_archs="$(lipo -archs "${simarm64_lib}")" + +if printf '%s' "${sim64_archs}" | grep -q 'x86_64' && printf '%s' "${sim64_archs}" | grep -q 'arm64'; then + cp "${sim64_lib}" "${sim_universal_lib}" +elif printf '%s' "${simarm64_archs}" | grep -q 'x86_64' && printf '%s' "${simarm64_archs}" | grep -q 'arm64'; then + cp "${simarm64_lib}" "${sim_universal_lib}" +else + lipo -create "${sim64_lib}" "${simarm64_lib}" -output "${sim_universal_lib}" +fi + +xcodebuild -create-xcframework \ + -library "${ios_output_root}/OS64/bin/libsimple.a" -headers "${headers_dir}" \ + -library "${sim_universal_lib}" -headers "${headers_dir}" \ + -output "${final_output_root}/libsimple.xcframework" + +cp -R "${ios_output_root}/OS64/bin/dict" "${final_output_root}/dict"