From b09fb7f5cd21c34c9f42b2e47fc8a5e5e46ec45b Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Fri, 24 May 2024 11:18:14 +0800 Subject: [PATCH] Support Windows arm64 (#911) --- .github/workflows/windows-arm64.yaml | 59 ++++++++++++++++++ cmake/onnxruntime-win-arm64.cmake | 91 ++++++++++++++++++++++++++++ cmake/onnxruntime.cmake | 9 ++- 3 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/windows-arm64.yaml create mode 100644 cmake/onnxruntime-win-arm64.cmake diff --git a/.github/workflows/windows-arm64.yaml b/.github/workflows/windows-arm64.yaml new file mode 100644 index 000000000..4fb85a9e1 --- /dev/null +++ b/.github/workflows/windows-arm64.yaml @@ -0,0 +1,59 @@ +name: windows-arm64 + +on: + push: + branches: + - master + tags: + - '*' + paths: + - '.github/workflows/windows-arm64.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'sherpa-onnx/csrc/*' + pull_request: + branches: + - master + paths: + - '.github/workflows/windows-arm64.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'sherpa-onnx/csrc/*' + + workflow_dispatch: + +concurrency: + group: windows-arm64-${{ github.ref }} + cancel-in-progress: true + +jobs: + windows_arm64: + name: shared-${{ matrix.shared_lib }} tts-${{ matrix.with_tts }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [windows-latest] + shared_lib: [ON] + with_tts: [ON, OFF] + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Configure CMake + shell: bash + run: | + mkdir build + cd build + cmake -A ARM64 -DSHERPA_ONNX_ENABLE_TTS=${{ matrix.with_tts }} -D CMAKE_BUILD_TYPE=Release -D BUILD_SHARED_LIBS=${{ matrix.shared_lib }} -DCMAKE_INSTALL_PREFIX=./install -DBUILD_ESPEAK_NG_EXE=OFF .. + + - name: Build sherpa-onnx for windows + shell: bash + run: | + cd build + cmake --build . --config Release -- -m:2 + cmake --build . --config Release --target install -- -m:2 + + ls -lh ./bin/Release/sherpa-onnx.exe diff --git a/cmake/onnxruntime-win-arm64.cmake b/cmake/onnxruntime-win-arm64.cmake new file mode 100644 index 000000000..0705b6451 --- /dev/null +++ b/cmake/onnxruntime-win-arm64.cmake @@ -0,0 +1,91 @@ +# Copyright (c) 2022-2024 Xiaomi Corporation +message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}") +message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") +message(STATUS "CMAKE_VS_PLATFORM_NAME: ${CMAKE_VS_PLATFORM_NAME}") + +if(NOT CMAKE_SYSTEM_NAME STREQUAL Windows) + message(FATAL_ERROR "This file is for Windows only. Given: ${CMAKE_SYSTEM_NAME}") +endif() + +if(NOT (CMAKE_VS_PLATFORM_NAME STREQUAL ARM64 OR CMAKE_VS_PLATFORM_NAME STREQUAL arm64)) + message(FATAL_ERROR "This file is for Windows arm64 only. Given: ${CMAKE_VS_PLATFORM_NAME}") +endif() + +if(NOT BUILD_SHARED_LIBS) + message(FATAL_ERROR "This file is for building shared libraries. BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}") +endif() + +set(onnxruntime_URL "https://github.com/microsoft/onnxruntime/releases/download/v1.17.1/onnxruntime-win-arm64-1.17.1.zip") +set(onnxruntime_URL2 "https://hub.nuaa.cf/microsoft/onnxruntime/releases/download/v1.17.1/onnxruntime-win-arm64-1.17.1.zip") +set(onnxruntime_HASH "SHA256=47782cebcab0fd7a1f0a3f0676b088c1bc0f4fbf21666f6fe57570dc362fa5a8") + +# If you don't have access to the Internet, +# please download onnxruntime to one of the following locations. +# You can add more if you want. +set(possible_file_locations + $ENV{HOME}/Downloads/onnxruntime-win-arm64-1.17.1.zip + ${CMAKE_SOURCE_DIR}/onnxruntime-win-arm64-1.17.1.zip + ${CMAKE_BINARY_DIR}/onnxruntime-win-arm64-1.17.1.zip + /tmp/onnxruntime-win-arm64-1.17.1.zip +) + +foreach(f IN LISTS possible_file_locations) + if(EXISTS ${f}) + set(onnxruntime_URL "${f}") + file(TO_CMAKE_PATH "${onnxruntime_URL}" onnxruntime_URL) + message(STATUS "Found local downloaded onnxruntime: ${onnxruntime_URL}") + set(onnxruntime_URL2) + break() + endif() +endforeach() + +FetchContent_Declare(onnxruntime + URL + ${onnxruntime_URL} + ${onnxruntime_URL2} + URL_HASH ${onnxruntime_HASH} +) + +FetchContent_GetProperties(onnxruntime) +if(NOT onnxruntime_POPULATED) + message(STATUS "Downloading onnxruntime from ${onnxruntime_URL}") + FetchContent_Populate(onnxruntime) +endif() +message(STATUS "onnxruntime is downloaded to ${onnxruntime_SOURCE_DIR}") + +find_library(location_onnxruntime onnxruntime + PATHS + "${onnxruntime_SOURCE_DIR}/lib" + NO_CMAKE_SYSTEM_PATH +) + +message(STATUS "location_onnxruntime: ${location_onnxruntime}") + +add_library(onnxruntime SHARED IMPORTED) + +set_target_properties(onnxruntime PROPERTIES + IMPORTED_LOCATION ${location_onnxruntime} + INTERFACE_INCLUDE_DIRECTORIES "${onnxruntime_SOURCE_DIR}/include" +) + +set_property(TARGET onnxruntime + PROPERTY + IMPORTED_IMPLIB "${onnxruntime_SOURCE_DIR}/lib/onnxruntime.lib" +) + +file(COPY ${onnxruntime_SOURCE_DIR}/lib/onnxruntime.dll + DESTINATION + ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE} +) + +file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/*.dll") + +message(STATUS "onnxruntime lib files: ${onnxruntime_lib_files}") + +if(SHERPA_ONNX_ENABLE_PYTHON) + install(FILES ${onnxruntime_lib_files} DESTINATION ..) +else() + install(FILES ${onnxruntime_lib_files} DESTINATION lib) +endif() + +install(FILES ${onnxruntime_lib_files} DESTINATION bin) diff --git a/cmake/onnxruntime.cmake b/cmake/onnxruntime.cmake index ae22bfab0..a446e624a 100644 --- a/cmake/onnxruntime.cmake +++ b/cmake/onnxruntime.cmake @@ -87,9 +87,14 @@ function(download_onnxruntime) if(SHERPA_ONNX_ENABLE_GPU) message(FATAL_ERROR "GPU support for Win32 is not supported!") endif() + elseif(CMAKE_VS_PLATFORM_NAME STREQUAL ARM64 OR CMAKE_VS_PLATFORM_NAME STREQUAL arm64) + # for 64-bit windows (arm64) + if(NOT BUILD_SHARED_LIBS) + message(FATAL_ERROR "Please pass -DBUILD_SHARED_LIBS=ON to cmake") + endif() + include(onnxruntime-win-arm64) else() - # for 64-bit windows - + # for 64-bit windows (x64) if(BUILD_SHARED_LIBS) message(STATUS "Use dynamic onnxruntime libraries") if(SHERPA_ONNX_ENABLE_GPU)