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
155 changes: 140 additions & 15 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -277,11 +277,48 @@ jobs:
echo "- OS: ${{ runner.os }}" >> $GITHUB_STEP_SUMMARY

MacOS:
runs-on: macos-latest
runs-on: ${{ matrix.os }}
needs: Linux
strategy:
fail-fast: true
matrix:
include:
- os: macos-15-intel
arch: x64
- os: macos-15
arch: arm64
env:
BUILD_TYPE: ${{ startsWith(github.ref, 'refs/tags/') && 'Release' || 'Debug' }}
steps:
- name: "Set macOS Build Presets"
id: mac_build
shell: bash
run: |
case "${{ matrix.arch }}" in
x64)
configure_preset="macos-ninja-x64"
build_dir="${GITHUB_WORKSPACE}/../../_temp/macos-x64"
;;
arm64)
configure_preset="macos-ninja-arm64"
build_dir="${GITHUB_WORKSPACE}/../../_temp/macos-arm64"
;;
*)
echo "Unsupported matrix.arch: ${{ matrix.arch }}" >&2
exit 1
;;
esac

if [[ "${{ github.ref }}" == refs/tags/* ]]; then
build_preset="${configure_preset}-release"
else
build_preset="${configure_preset}"
fi

echo "CONFIGURE_PRESET=${configure_preset}" >> "$GITHUB_OUTPUT"
echo "BUILD_PRESET=${build_preset}" >> "$GITHUB_OUTPUT"
echo "BUILD_DIR=${build_dir}" >> "$GITHUB_OUTPUT"

- uses: actions/checkout@v6
with:
submodules: true
Expand All @@ -305,18 +342,18 @@ jobs:
- name: 'Run CMake'
uses: lukka/run-cmake@v10
with:
configurePreset: 'macos-ninja'
buildPreset: ${{ startsWith(github.ref, 'refs/tags/') && 'macos-ninja-release' || 'macos-ninja' }}
configurePreset: ${{ steps.mac_build.outputs.CONFIGURE_PRESET }}
buildPreset: ${{ steps.mac_build.outputs.BUILD_PRESET }}

- name: 'Run CTest'
run: ctest -C ${{ env.BUILD_TYPE }}
working-directory: "${{ github.workspace }}/../../_temp/macos"
working-directory: "${{ steps.mac_build.outputs.BUILD_DIR }}"

- name: "Check file existence"
uses: andstor/file-existence-action@v3
with:
allow_failure: true
files: "${{ github.workspace }}/../../_temp/macos/src/libsimple.dylib, ${{ github.workspace }}/../../_temp/macos/test/dict/jieba.dict.utf8"
files: "${{ steps.mac_build.outputs.BUILD_DIR }}/src/libsimple.dylib, ${{ steps.mac_build.outputs.BUILD_DIR }}/test/dict/jieba.dict.utf8"

- uses: actions/setup-node@v6
with:
Expand All @@ -331,9 +368,9 @@ jobs:
run: |
brew install python-setuptools
npm install
npm run p -- --ext_path="${{ github.workspace }}/../../_temp/macos/src/" --dict_path="${{ github.workspace }}/../../_temp/macos/test/dict/"
npm run p -- --ext_path="${{ steps.mac_build.outputs.BUILD_DIR }}/src/" --dict_path="${{ steps.mac_build.outputs.BUILD_DIR }}/test/dict/"
# don't run this as it's toooo slow
# npm run b -- --ext_path="${{ github.workspace }}/../../_temp/macos/src/" --dict_path="${{ github.workspace }}/../../_temp/macos/test/dict/"
# npm run b -- --ext_path="${{ steps.mac_build.outputs.BUILD_DIR }}/src/" --dict_path="${{ steps.mac_build.outputs.BUILD_DIR }}/test/dict/"

# python run
# - name: run python example
Expand All @@ -344,35 +381,35 @@ jobs:
- name: Package
if: startsWith(github.ref, 'refs/tags/')
run: |
mkdir libsimple-osx-x64
mkdir libsimple-osx-${{ matrix.arch }}
sudo xattr -r -d com.apple.quarantine src/libsimple.dylib
cp -r src/libsimple.dylib test/dict libsimple-osx-x64/
zip -r libsimple-osx-x64.zip libsimple-osx-x64
working-directory: "${{ github.workspace }}/../../_temp/macos"
cp -r src/libsimple.dylib test/dict libsimple-osx-${{ matrix.arch }}/
zip -r libsimple-osx-${{ matrix.arch }}.zip libsimple-osx-${{ matrix.arch }}
working-directory: "${{ steps.mac_build.outputs.BUILD_DIR }}"

- name: Release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
draft: true
files: "${{ github.workspace }}/../../_temp/macos/libsimple-osx-x64.zip"
files: "${{ steps.mac_build.outputs.BUILD_DIR }}/libsimple-osx-${{ matrix.arch }}.zip"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: build-iOS
if: success()
if: ${{ success() && matrix.arch == 'arm64' }}
run: ./build-ios.sh

- name: Package iOS
if: startsWith(github.ref, 'refs/tags/')
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.arch == 'arm64' }}
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/')
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.arch == 'arm64' }}
uses: softprops/action-gh-release@v2
with:
draft: true
Expand Down Expand Up @@ -438,3 +475,91 @@ jobs:
files: "${{ github.workspace }}/libsimple-android-${{ matrix.abi }}.zip"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

OHOS:
runs-on: ubuntu-latest
needs: Linux
env:
OHOS_SDK_URL: ${{ secrets.OHOS_SDK_URL }}
OHOS_SDK_VERSION: v6.0.0.1
steps:
- uses: actions/checkout@v6
with:
submodules: true

- name: Download and extract OHOS SDK
shell: bash
run: |
set -euxo pipefail
sdk_root="${RUNNER_TEMP}/ohos-sdk"
sdk_archive="${RUNNER_TEMP}/ohos-sdk.tar.gz"
mkdir -p "${sdk_root}"

if [ -n "${OHOS_SDK_URL:-}" ]; then
curl -L --retry 3 --retry-all-errors --max-time 3600 "${OHOS_SDK_URL}" -o "${sdk_archive}"
else
sdk_base_url="https://github.com/openharmony-rs/ohos-sdk/releases/download/${OHOS_SDK_VERSION}"
curl -L --retry 3 --retry-all-errors --max-time 3600 "${sdk_base_url}/ohos-sdk-windows_linux-public.tar.gz.aa" -o "${sdk_archive}.aa"
curl -L --retry 3 --retry-all-errors --max-time 3600 "${sdk_base_url}/ohos-sdk-windows_linux-public.tar.gz.ab" -o "${sdk_archive}.ab"
cat "${sdk_archive}.aa" "${sdk_archive}.ab" > "${sdk_archive}"
fi

tar -xzf "${sdk_archive}" -C "${sdk_root}"

toolchain_file="$(find "${sdk_root}" -type f -path '*/native/build/cmake/ohos.toolchain.cmake' | head -n 1 || true)"
if [ -z "${toolchain_file}" ]; then
mapfile -t zips < <(find "${sdk_root}" -type f -name '*.zip')
if [ "${#zips[@]}" -eq 0 ]; then
echo "No SDK zip files found under ${sdk_root}." >&2
find "${sdk_root}" -maxdepth 4 -print
exit 1
fi

# Fast path: native build only needs Linux native/toolchains SDK packages.
mapfile -t preferred_zips < <(printf '%s\n' "${zips[@]}" | grep -E '/linux/(native|toolchains)-linux-x64-.*\.zip$' || true)
if [ "${#preferred_zips[@]}" -gt 0 ]; then
for f in "${preferred_zips[@]}"; do unzip -q -o "${f}" -d "$(dirname "${f}")"; done
else
for f in "${zips[@]}"; do unzip -q -o "${f}" -d "$(dirname "${f}")"; done
fi

toolchain_file="$(find "${sdk_root}" -type f -path '*/native/build/cmake/ohos.toolchain.cmake' | head -n 1 || true)"
if [ -z "${toolchain_file}" ]; then
for f in "${zips[@]}"; do unzip -q -o "${f}" -d "$(dirname "${f}")"; done
toolchain_file="$(find "${sdk_root}" -type f -path '*/native/build/cmake/ohos.toolchain.cmake' | head -n 1 || true)"
fi
fi

if [ -z "${toolchain_file}" ]; then
echo "Failed to locate OHOS toolchain after extraction." >&2
find "${sdk_root}" -maxdepth 5 -print
exit 1
fi

ohos_sdk="${toolchain_file%/native/build/cmake/ohos.toolchain.cmake}"
echo "OHOS_SDK=${ohos_sdk}" >> "${GITHUB_ENV}"

- name: Build OHOS
run: ./build-ohos.sh

- name: Verify OHOS outputs
run: |
test -f "output/bin/libsimple.so"
test -f "output/bin/dict/jieba.dict.utf8"

- name: Package OHOS
if: startsWith(github.ref, 'refs/tags/')
run: |
mkdir libsimple-ohos-arm64-v8a
cp -r output/bin/libsimple.so output/bin/dict libsimple-ohos-arm64-v8a/
zip -r libsimple-ohos-arm64-v8a.zip libsimple-ohos-arm64-v8a
working-directory: "${{ github.workspace }}"

- name: Release OHOS
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
draft: true
files: "${{ github.workspace }}/libsimple-ohos-arm64-v8a.zip"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
54 changes: 54 additions & 0 deletions CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,34 @@
}
}
},
{
"name": "macos-ninja-x64",
"displayName": "macOS Ninja (x64)",
"description": "Configure for macOS x64 build",
"inherits": "macos-ninja",
"binaryDir": "${sourceDir}/../../_temp/macos-x64",
"cacheVariables": {
"CMAKE_OSX_ARCHITECTURES": "x86_64",
"CMAKE_INSTALL_PREFIX": {
"type": "PATH",
"value": "${sourceDir}/../../_temp/macos-x64/install"
}
}
},
{
"name": "macos-ninja-arm64",
"displayName": "macOS Ninja (arm64)",
"description": "Configure for macOS arm64 build",
"inherits": "macos-ninja",
"binaryDir": "${sourceDir}/../../_temp/macos-arm64",
"cacheVariables": {
"CMAKE_OSX_ARCHITECTURES": "arm64",
"CMAKE_INSTALL_PREFIX": {
"type": "PATH",
"value": "${sourceDir}/../../_temp/macos-arm64/install"
}
}
},
{
"name": "windows-msvc-vs17-base",
"hidden": true,
Expand Down Expand Up @@ -166,6 +194,32 @@
"description": "Build for macOS (Release)",
"configuration": "Release"
},
{
"name": "macos-ninja-x64",
"configurePreset": "macos-ninja-x64",
"displayName": "Build macOS x64",
"description": "Build for macOS x64"
},
{
"name": "macos-ninja-x64-release",
"configurePreset": "macos-ninja-x64",
"displayName": "Build macOS x64 (Release)",
"description": "Build for macOS x64 (Release)",
"configuration": "Release"
},
{
"name": "macos-ninja-arm64",
"configurePreset": "macos-ninja-arm64",
"displayName": "Build macOS arm64",
"description": "Build for macOS arm64"
},
{
"name": "macos-ninja-arm64-release",
"configurePreset": "macos-ninja-arm64",
"displayName": "Build macOS arm64 (Release)",
"description": "Build for macOS arm64 (Release)",
"configuration": "Release"
},
{
"name": "windows-msvc-vs17",
"configurePreset": "windows-msvc-vs17",
Expand Down
38 changes: 26 additions & 12 deletions build-ohos.sh
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,21 +1,35 @@
#!/bin/sh

current_dir=$(pwd)/$(dirname "$0")
set -eu

current_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
build_dir="${current_dir}/build-ohos"
lib_prefix="${current_dir}/output"
lib_prefix="${current_dir}/output"
: "${OHOS_SDK:?OHOS_SDK is required}"
CMAKE="${OHOS_SDK}/native/build-tools/cmake/bin/cmake"
TOOLCHAIN_FILE="${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake"
OHOS_ARCH="arm64-v8a"
OHOS_ARCH="${OHOS_ARCH:-arm64-v8a}"

if [ ! -x "${CMAKE}" ]; then
echo "CMake not found at ${CMAKE}" >&2
exit 1
fi

if [ ! -f "${TOOLCHAIN_FILE}" ]; then
echo "OHOS toolchain file not found at ${TOOLCHAIN_FILE}" >&2
exit 1
fi

mkdir -p "$build_dir" && cd "$build_dir" || exit
mkdir -p "${build_dir}"

"$CMAKE" \
-DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE" \
-DCMAKE_INSTALL_PREFIX="$lib_prefix" \
-DOHOS_ARCH="$OHOS_ARCH" \
"${CMAKE}" \
-S "${current_dir}" \
-B "${build_dir}" \
-DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN_FILE}" \
-DCMAKE_INSTALL_PREFIX="${lib_prefix}" \
-DOHOS_ARCH="${OHOS_ARCH}" \
-DCMAKE_CXX_FLAGS="-Wno-unused-command-line-argument" \
-DCMAKE_C_FLAGS="-Wno-unused-command-line-argument" \
"$current_dir"
-DCMAKE_C_FLAGS="-Wno-unused-command-line-argument"

make
make install
"${CMAKE}" --build "${build_dir}" --parallel
"${CMAKE}" --install "${build_dir}"
Loading