From 280113b2a81c5f954e3cd49aed2f3ac8f9f897d4 Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Tue, 31 Oct 2023 13:04:20 +0800 Subject: [PATCH 1/8] Support static linking onnxruntime for 64-bit ARM --- .github/workflows/aarch64-linux-gnu.yaml | 36 ++++++++++- build-aarch64-linux-gnu.sh | 7 ++- cmake/onnxruntime-linux-aarch64-static.cmake | 64 ++++++++++++++++++++ cmake/onnxruntime-linux-aarch64.cmake | 4 ++ cmake/onnxruntime-linux-arm-static.cmake | 8 --- cmake/onnxruntime-linux-arm.cmake | 4 ++ cmake/onnxruntime.cmake | 6 +- sherpa-onnx/csrc/CMakeLists.txt | 2 +- 8 files changed, 117 insertions(+), 14 deletions(-) create mode 100644 cmake/onnxruntime-linux-aarch64-static.cmake diff --git a/.github/workflows/aarch64-linux-gnu.yaml b/.github/workflows/aarch64-linux-gnu.yaml index ab2416a70..ba7f9b263 100644 --- a/.github/workflows/aarch64-linux-gnu.yaml +++ b/.github/workflows/aarch64-linux-gnu.yaml @@ -41,16 +41,23 @@ concurrency: jobs: aarch64_linux_gnu: runs-on: ${{ matrix.os }} + name: ${{ matrix.os }} ${{ matrix.lib_type }} strategy: fail-fast: false matrix: os: [ubuntu-latest] + lib_type: [static, shared] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 + with: + key: ${{ matrix.os }}-aarch64-${{ matrix.lib_type }} + - name: cache-qemu id: cache-qemu uses: actions/cache@v3 @@ -114,6 +121,19 @@ jobs: run: | export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH + export CMAKE_CXX_COMPILER_LAUNCHER=ccache + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + + cmake --version + + lib_type=${{ matrix.lib_type }} + + if [[ $lib_type == "shared" ]]; then + export BUILD_SHARED_LIBS=ON + else + export BUILD_SHARED_LIBS=OFF + fi + ./build-aarch64-linux-gnu.sh ls -lh build-aarch64-linux-gnu/bin @@ -132,12 +152,14 @@ jobs: qemu-aarch64 ./build-aarch64-linux-gnu/bin/sherpa-onnx --help + readelf -d ./build-aarch64-linux-gnu/bin/sherpa-onnx + - name: Copy files shell: bash run: | SHERPA_ONNX_VERSION=v$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2) - dst=sherpa-onnx-${SHERPA_ONNX_VERSION}-linux-aarch64 + dst=sherpa-onnx-${SHERPA_ONNX_VERSION}-linux-aarch64-${{ matrix.lib_type }} mkdir $dst cp -a build-aarch64-linux-gnu/install/bin $dst/ @@ -148,8 +170,16 @@ jobs: tar cjvf ${dst}.tar.bz2 $dst - uses: actions/upload-artifact@v3 + if: matrix.lib_type == 'shared' + with: + name: sherpa-onnx-linux-aarch64-shared + path: sherpa-onnx-*linux-aarch64-shared.tar.bz2 + + - uses: actions/upload-artifact@v3 + if: matrix.lib_type == 'static' with: - path: sherpa-onnx-*linux-aarch64.tar.bz2 + name: sherpa-onnx-linux-aarch64-static + path: sherpa-onnx-*linux-aarch64-static.tar.bz2 - name: Release pre-compiled binaries and libs for aarch64 linux if: env.RELEASE == 'true' @@ -157,4 +187,4 @@ jobs: with: file_glob: true overwrite: true - file: sherpa-onnx-*linux-aarch64.tar.bz2 + file: sherpa-onnx-*linux-aarch64*.tar.bz2 diff --git a/build-aarch64-linux-gnu.sh b/build-aarch64-linux-gnu.sh index ee7234ad0..37c7ec726 100755 --- a/build-aarch64-linux-gnu.sh +++ b/build-aarch64-linux-gnu.sh @@ -33,10 +33,15 @@ fi export CPLUS_INCLUDE_PATH=$PWD/alsa-lib/include:$CPLUS_INCLUDE_PATH export SHERPA_ONNX_ALSA_LIB_DIR=$PWD/alsa-lib/src/.libs +if [[ x"$BUILD_SHARED_LIBS" == x"" ]]; then + # By default, use static link + BUILD_SHARED_LIBS=OFF +fi + cmake \ -DCMAKE_INSTALL_PREFIX=./install \ -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=OFF \ + -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS \ -DSHERPA_ONNX_ENABLE_TESTS=OFF \ -DSHERPA_ONNX_ENABLE_PYTHON=OFF \ -DSHERPA_ONNX_ENABLE_CHECK=OFF \ diff --git a/cmake/onnxruntime-linux-aarch64-static.cmake b/cmake/onnxruntime-linux-aarch64-static.cmake new file mode 100644 index 000000000..c9ef6f3fc --- /dev/null +++ b/cmake/onnxruntime-linux-aarch64-static.cmake @@ -0,0 +1,64 @@ +# Copyright (c) 2022-2023 Xiaomi Corporation +message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}") +message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") + +if(NOT CMAKE_SYSTEM_NAME STREQUAL Linux) + message(FATAL_ERROR "This file is for Linux only. Given: ${CMAKE_SYSTEM_NAME}") +endif() + +if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) + message(FATAL_ERROR "This file is for aarch64 only. Given: ${CMAKE_SYSTEM_PROCESSOR}") +endif() + +if(BUILD_SHARED_LIBS) + message(FATAL_ERROR "This file is for building static libraries. BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}") +endif() + +set(onnxruntime_URL "https://github.com/csukuangfj/onnxruntime-libs/releases/download/v1.16.0/onnxruntime-linux-aarch64-static_lib-1.16.0.zip") +set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/onnxruntime-libs/resolve/main/onnxruntime-linux-aarch64-static_lib-1.16.0.zip") +set(onnxruntime_HASH "SHA256=ddcb4e67bcdff53eb72265a12420c71f73acc8610054e06259e9b98770136bd5") + +# 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-linux-aarch64-static_lib-1.16.0.zip + ${PROJECT_SOURCE_DIR}/onnxruntime-linux-aarch64-static_lib-1.16.0.zip + ${PROJECT_BINARY_DIR}/onnxruntime-linux-aarch64-static_lib-1.16.0.zip + /tmp/onnxruntime-linux-aarch64-static_lib-1.16.0.zip + /star-fj/fangjun/download/github/onnxruntime-linux-aarch64-static_lib-1.16.0.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}") + +# for static libraries, we use onnxruntime_lib_files directly below +include_directories(${onnxruntime_SOURCE_DIR}/include) + +file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/lib*.a") + +set(onnxruntime_lib_files ${onnxruntime_lib_files} PARENT_SCOPE) + +message(STATUS "onnxruntime lib files: ${onnxruntime_lib_files}") +install(FILES ${onnxruntime_lib_files} DESTINATION lib) diff --git a/cmake/onnxruntime-linux-aarch64.cmake b/cmake/onnxruntime-linux-aarch64.cmake index cd67f5077..cadc9ade7 100644 --- a/cmake/onnxruntime-linux-aarch64.cmake +++ b/cmake/onnxruntime-linux-aarch64.cmake @@ -10,6 +10,10 @@ if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) message(FATAL_ERROR "This file is for aarch64 only. Given: ${CMAKE_SYSTEM_PROCESSOR}") 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/csukuangfj/onnxruntime-libs/releases/download/v1.16.0/onnxruntime-linux-aarch64-1.16.0.tgz") set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/onnxruntime-linux-aarch64-1.16.0.tgz") set(onnxruntime_HASH "SHA256=8b15781d974803203c09df7d52c84d8c9f1ac7d949a97f515e4d2f5dc978d8af") diff --git a/cmake/onnxruntime-linux-arm-static.cmake b/cmake/onnxruntime-linux-arm-static.cmake index 3814f6054..9634485df 100644 --- a/cmake/onnxruntime-linux-arm-static.cmake +++ b/cmake/onnxruntime-linux-arm-static.cmake @@ -53,14 +53,6 @@ if(NOT onnxruntime_POPULATED) 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}") - # for static libraries, we use onnxruntime_lib_files directly below include_directories(${onnxruntime_SOURCE_DIR}/include) diff --git a/cmake/onnxruntime-linux-arm.cmake b/cmake/onnxruntime-linux-arm.cmake index 27b8ee9bd..89e446c7e 100644 --- a/cmake/onnxruntime-linux-arm.cmake +++ b/cmake/onnxruntime-linux-arm.cmake @@ -10,6 +10,10 @@ if(NOT (CMAKE_SYSTEM_PROCESSOR STREQUAL arm OR CMAKE_SYSTEM_PROCESSOR STREQUAL a message(FATAL_ERROR "This file is for arm only. Given: ${CMAKE_SYSTEM_PROCESSOR}") 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/csukuangfj/onnxruntime-libs/releases/download/v1.16.0/onnxruntime-linux-arm-1.16.0.zip") set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/onnxruntime-libs/resolve/main/onnxruntime-linux-arm-1.16.0.zip") set(onnxruntime_HASH "SHA256=0a63ea99fbba3ee399d6626c36752844ae93ae19bab30e4bf00d45cc8a13da02") diff --git a/cmake/onnxruntime.cmake b/cmake/onnxruntime.cmake index 9d1a8f625..418a030f1 100644 --- a/cmake/onnxruntime.cmake +++ b/cmake/onnxruntime.cmake @@ -6,7 +6,11 @@ function(download_onnxruntime) message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") if(CMAKE_SYSTEM_NAME STREQUAL Linux AND CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) - include(onnxruntime-linux-aarch64) + if(BUILD_SHARED_LIBS) + include(onnxruntime-linux-aarch64) + else() + include(onnxruntime-linux-aarch64-static) + endif() elseif(CMAKE_SYSTEM_NAME STREQUAL Linux AND (CMAKE_SYSTEM_PROCESSOR STREQUAL arm OR CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)) if(BUILD_SHARED_LIBS) include(onnxruntime-linux-arm) diff --git a/sherpa-onnx/csrc/CMakeLists.txt b/sherpa-onnx/csrc/CMakeLists.txt index 44eec6aef..1c7031b5a 100644 --- a/sherpa-onnx/csrc/CMakeLists.txt +++ b/sherpa-onnx/csrc/CMakeLists.txt @@ -113,7 +113,7 @@ target_link_libraries(sherpa-onnx-core kaldi-native-fbank-core) target_link_libraries(sherpa-onnx-core kaldi-decoder-core) -if(BUILD_SHARED_LIBS OR APPLE OR CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) +if(BUILD_SHARED_LIBS OR APPLE) target_link_libraries(sherpa-onnx-core onnxruntime) else() target_link_libraries(sherpa-onnx-core ${onnxruntime_lib_files}) From b9bff12894566d900e66a486d09a483eaf42e02d Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Tue, 31 Oct 2023 13:20:45 +0800 Subject: [PATCH 2/8] update toolchain to use gcc 9 --- .github/workflows/aarch64-linux-gnu.yaml | 13 +++++++------ build-aarch64-linux-gnu.sh | 6 ++++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/aarch64-linux-gnu.yaml b/.github/workflows/aarch64-linux-gnu.yaml index ba7f9b263..24741dcd0 100644 --- a/.github/workflows/aarch64-linux-gnu.yaml +++ b/.github/workflows/aarch64-linux-gnu.yaml @@ -92,28 +92,29 @@ jobs: uses: actions/cache@v3 with: path: toolchain - key: gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu + key: gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz - name: Download toolchain if: steps.cache-toolchain.outputs.cache-hit != 'true' shell: bash run: | - wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz + # wget wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz + wget -qq https://huggingface.co/csukuangfj/sherpa-ncnn-toolchains/resolve/main/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz mkdir $GITHUB_WORKSPACE/toolchain - tar xvf ./gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz --strip-components 1 -C $GITHUB_WORKSPACE/toolchain + tar xf ./gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz --strip-components 1 -C $GITHUB_WORKSPACE/toolchain - name: Display toolchain info shell: bash run: | export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH - aarch64-linux-gnu-gcc --version + aarch64-none-linux-gnu-gcc --version - name: Display qemu-aarch64 -h shell: bash run: | export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH - export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/aarch64-linux-gnu/libc + export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/aarch64-none-linux-gnu/libc qemu-aarch64 -h - name: build aarch64-linux-gnu @@ -146,7 +147,7 @@ jobs: run: | export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH - export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/aarch64-linux-gnu/libc + export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/aarch64-none-linux-gnu/libc ls -lh ./build-aarch64-linux-gnu/bin diff --git a/build-aarch64-linux-gnu.sh b/build-aarch64-linux-gnu.sh index 37c7ec726..87ce3476f 100755 --- a/build-aarch64-linux-gnu.sh +++ b/build-aarch64-linux-gnu.sh @@ -1,5 +1,11 @@ #!/usr/bin/env bash +if command -v aarch64-linux-gnu-gcc &> /dev/null; then + ln -svf $(which aarch64-none-linux-gnu-gcc) ./aarch64-none-linux-gnu-gcc + ln -svf $(which aarch64-none-linux-gnu-g++) ./aarch64-none-linux-gnu-g++ + export PATH=$PWD:$PATH +fi + if ! command -v aarch64-linux-gnu-gcc &> /dev/null; then echo "Please install a toolchain for cross-compiling." echo "You can refer to: " From 59a24b4e649e262cff4221dc868903aa975e5b1f Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Tue, 31 Oct 2023 13:24:23 +0800 Subject: [PATCH 3/8] small fixes --- build-aarch64-linux-gnu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-aarch64-linux-gnu.sh b/build-aarch64-linux-gnu.sh index 87ce3476f..5c5079ae1 100755 --- a/build-aarch64-linux-gnu.sh +++ b/build-aarch64-linux-gnu.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -if command -v aarch64-linux-gnu-gcc &> /dev/null; then +if command -v aarch64-none-linux-gnu-gcc &> /dev/null; then ln -svf $(which aarch64-none-linux-gnu-gcc) ./aarch64-none-linux-gnu-gcc ln -svf $(which aarch64-none-linux-gnu-g++) ./aarch64-none-linux-gnu-g++ export PATH=$PWD:$PATH From d9193a43141125a3f2ddf54bf5cfd36a794822e7 Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Tue, 31 Oct 2023 13:27:08 +0800 Subject: [PATCH 4/8] small fixes --- build-aarch64-linux-gnu.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-aarch64-linux-gnu.sh b/build-aarch64-linux-gnu.sh index 5c5079ae1..469812384 100755 --- a/build-aarch64-linux-gnu.sh +++ b/build-aarch64-linux-gnu.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash if command -v aarch64-none-linux-gnu-gcc &> /dev/null; then - ln -svf $(which aarch64-none-linux-gnu-gcc) ./aarch64-none-linux-gnu-gcc - ln -svf $(which aarch64-none-linux-gnu-g++) ./aarch64-none-linux-gnu-g++ + ln -svf $(which aarch64-none-linux-gnu-gcc) ./aarch64-linux-gnu-gcc + ln -svf $(which aarch64-none-linux-gnu-g++) ./aarch64-linux-gnu-g++ export PATH=$PWD:$PATH fi From 5804c52b80b4cf6fe6ae7a3aafe6ad864928879d Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Tue, 31 Oct 2023 14:35:53 +0800 Subject: [PATCH 5/8] disable cxx11 abi by default --- CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ecd32c9b..2bcd3a911 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,13 @@ option(SHERPA_ONNX_ENABLE_C_API "Whether to build C API" ON) option(SHERPA_ONNX_ENABLE_WEBSOCKET "Whether to build webscoket server/client" ON) option(SHERPA_ONNX_ENABLE_GPU "Enable ONNX Runtime GPU support" OFF) option(SHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY "True to link libstdc++ statically. Used only when BUILD_SHARED_LIBS is OFF on Linux" ON) +option(SHERPA_ONNX_USE_CXX11_ABI "True to use CXX11 ABI" OFF) + +if(SHERPA_ONNX_USE_CXX11_ABI) + add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1) +else() + add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) +endif() set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") From 7bb11f8d7a77e650b02953132bcc55e38cb1a54f Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Tue, 31 Oct 2023 16:39:37 +0800 Subject: [PATCH 6/8] small fixes --- .../workflows/aarch64-linux-gnu-shared.yaml | 176 ++++++++++++++++++ ...gnu.yaml => aarch64-linux-gnu-static.yaml} | 32 +--- CMakeLists.txt | 7 - 3 files changed, 185 insertions(+), 30 deletions(-) create mode 100644 .github/workflows/aarch64-linux-gnu-shared.yaml rename .github/workflows/{aarch64-linux-gnu.yaml => aarch64-linux-gnu-static.yaml} (85%) diff --git a/.github/workflows/aarch64-linux-gnu-shared.yaml b/.github/workflows/aarch64-linux-gnu-shared.yaml new file mode 100644 index 000000000..25eb3cbd7 --- /dev/null +++ b/.github/workflows/aarch64-linux-gnu-shared.yaml @@ -0,0 +1,176 @@ +# Modified from https://github.com/Tencent/ncnn/blob/master/.github/workflows/linux-arm-cpu-gcc.yml +name: aarch64-linux-gnu-shared + +on: + push: + branches: + - master + tags: + - '*' + paths: + - '.github/workflows/aarch64-linux-gnu-shared.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'sherpa-onnx/csrc/*' + - 'toolchains/aarch64-linux-gnu.toolchain.cmake' + pull_request: + branches: + - master + paths: + - '.github/workflows/aarch64-linux-gnu-shared.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'sherpa-onnx/csrc/*' + - 'toolchains/aarch64-linux-gnu.toolchain.cmake' + + workflow_dispatch: + inputs: + release: + description: "Whether to release" + type: boolean + +env: + RELEASE: + |- # Release if there is a release tag name or a release flag in workflow_dispatch + ${{ github.event.release.tag_name != '' || github.event.inputs.release == 'true' }} + +concurrency: + group: aarch64-linux-gnu-shared-${{ github.ref }} + cancel-in-progress: true + +jobs: + aarch64_linux_gnu_shared: + runs-on: ${{ matrix.os }} + name: aarch64 shared lib test + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 + with: + key: ${{ matrix.os }}-aarch64-shared + + - name: cache-qemu + id: cache-qemu + uses: actions/cache@v3 + with: + path: qemu-install + key: qemu-aarch64-install-20220908 + + - name: install-qemu-build-deps + if: steps.cache-qemu.outputs.cache-hit != 'true' + run: | + sudo apt-get update + sudo apt-get install autoconf automake autotools-dev ninja-build + + - name: checkout-qemu + if: steps.cache-qemu.outputs.cache-hit != 'true' + uses: actions/checkout@v3 + with: + repository: qemu/qemu + path: qemu + ref: f5643914a9e8f79c606a76e6a9d7ea82a3fc3e65 + + - name: qemu + if: steps.cache-qemu.outputs.cache-hit != 'true' + run: | + cd qemu + ./configure --prefix=$GITHUB_WORKSPACE/qemu-install --target-list=aarch64-linux-user --disable-system + make -j2 + make install + + - name: cache-toolchain + id: cache-toolchain + uses: actions/cache@v3 + with: + path: toolchain + key: gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu + + - name: Download toolchain + if: steps.cache-toolchain.outputs.cache-hit != 'true' + shell: bash + run: | + wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz + + mkdir $GITHUB_WORKSPACE/toolchain + tar xvf ./gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz --strip-components 1 -C $GITHUB_WORKSPACE/toolchain + + - name: Display toolchain info + shell: bash + run: | + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH + aarch64-linux-gnu-gcc --version + + - name: Display qemu-aarch64 -h + shell: bash + run: | + export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH + export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/aarch64-linux-gnu/libc + qemu-aarch64 -h + + - name: build aarch64-linux-gnu + shell: bash + run: | + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH + + export CMAKE_CXX_COMPILER_LAUNCHER=ccache + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + + cmake --version + + export BUILD_SHARED_LIBS=ON + + ./build-aarch64-linux-gnu.sh + + ls -lh build-aarch64-linux-gnu/bin + ls -lh build-aarch64-linux-gnu/lib + + file build-aarch64-linux-gnu/bin/sherpa-onnx + + - name: Test sherpa-onnx + shell: bash + run: | + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH + export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH + export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/aarch64-linux-gnu/libc + + ls -lh ./build-aarch64-linux-gnu/bin + + qemu-aarch64 ./build-aarch64-linux-gnu/bin/sherpa-onnx --help + + readelf -d ./build-aarch64-linux-gnu/bin/sherpa-onnx + + - name: Copy files + shell: bash + run: | + SHERPA_ONNX_VERSION=v$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2) + + dst=sherpa-onnx-${SHERPA_ONNX_VERSION}-linux-aarch64-shared + mkdir $dst + + cp -a build-aarch64-linux-gnu/install/bin $dst/ + cp -a build-aarch64-linux-gnu/install/lib $dst/ + + tree $dst + + tar cjvf ${dst}.tar.bz2 $dst + + - uses: actions/upload-artifact@v3 + with: + name: sherpa-onnx-linux-aarch64-shared + path: sherpa-onnx-*linux-aarch64-shared.tar.bz2 + + - name: Release pre-compiled binaries and libs for aarch64 linux + if: env.RELEASE == 'true' + uses: svenstaro/upload-release-action@v2 + with: + file_glob: true + overwrite: true + file: sherpa-onnx-*linux-aarch64*.tar.bz2 diff --git a/.github/workflows/aarch64-linux-gnu.yaml b/.github/workflows/aarch64-linux-gnu-static.yaml similarity index 85% rename from .github/workflows/aarch64-linux-gnu.yaml rename to .github/workflows/aarch64-linux-gnu-static.yaml index 24741dcd0..1d01bfde0 100644 --- a/.github/workflows/aarch64-linux-gnu.yaml +++ b/.github/workflows/aarch64-linux-gnu-static.yaml @@ -1,5 +1,5 @@ # Modified from https://github.com/Tencent/ncnn/blob/master/.github/workflows/linux-arm-cpu-gcc.yml -name: aarch64-linux-gnu +name: aarch64-linux-gnu-static on: push: @@ -8,7 +8,7 @@ on: tags: - '*' paths: - - '.github/workflows/aarch64-linux-gnu.yaml' + - '.github/workflows/aarch64-linux-gnu-static.yaml' - 'CMakeLists.txt' - 'cmake/**' - 'sherpa-onnx/csrc/*' @@ -17,7 +17,7 @@ on: branches: - master paths: - - '.github/workflows/aarch64-linux-gnu.yaml' + - '.github/workflows/aarch64-linux-gnu-static.yaml' - 'CMakeLists.txt' - 'cmake/**' - 'sherpa-onnx/csrc/*' @@ -35,18 +35,17 @@ env: ${{ github.event.release.tag_name != '' || github.event.inputs.release == 'true' }} concurrency: - group: aarch64-linux-gnu-${{ github.ref }} + group: aarch64-linux-gnu-static-${{ github.ref }} cancel-in-progress: true jobs: - aarch64_linux_gnu: + aarch64_linux_gnu_static: runs-on: ${{ matrix.os }} - name: ${{ matrix.os }} ${{ matrix.lib_type }} + name: aarch64 static lib test strategy: fail-fast: false matrix: os: [ubuntu-latest] - lib_type: [static, shared] steps: - uses: actions/checkout@v4 @@ -56,7 +55,7 @@ jobs: - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: - key: ${{ matrix.os }}-aarch64-${{ matrix.lib_type }} + key: ${{ matrix.os }}-aarch64-static - name: cache-qemu id: cache-qemu @@ -127,13 +126,7 @@ jobs: cmake --version - lib_type=${{ matrix.lib_type }} - - if [[ $lib_type == "shared" ]]; then - export BUILD_SHARED_LIBS=ON - else - export BUILD_SHARED_LIBS=OFF - fi + export BUILD_SHARED_LIBS=OFF ./build-aarch64-linux-gnu.sh @@ -160,7 +153,7 @@ jobs: run: | SHERPA_ONNX_VERSION=v$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2) - dst=sherpa-onnx-${SHERPA_ONNX_VERSION}-linux-aarch64-${{ matrix.lib_type }} + dst=sherpa-onnx-${SHERPA_ONNX_VERSION}-linux-aarch64-static mkdir $dst cp -a build-aarch64-linux-gnu/install/bin $dst/ @@ -171,13 +164,6 @@ jobs: tar cjvf ${dst}.tar.bz2 $dst - uses: actions/upload-artifact@v3 - if: matrix.lib_type == 'shared' - with: - name: sherpa-onnx-linux-aarch64-shared - path: sherpa-onnx-*linux-aarch64-shared.tar.bz2 - - - uses: actions/upload-artifact@v3 - if: matrix.lib_type == 'static' with: name: sherpa-onnx-linux-aarch64-static path: sherpa-onnx-*linux-aarch64-static.tar.bz2 diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bcd3a911..2ecd32c9b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,13 +21,6 @@ option(SHERPA_ONNX_ENABLE_C_API "Whether to build C API" ON) option(SHERPA_ONNX_ENABLE_WEBSOCKET "Whether to build webscoket server/client" ON) option(SHERPA_ONNX_ENABLE_GPU "Enable ONNX Runtime GPU support" OFF) option(SHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY "True to link libstdc++ statically. Used only when BUILD_SHARED_LIBS is OFF on Linux" ON) -option(SHERPA_ONNX_USE_CXX11_ABI "True to use CXX11 ABI" OFF) - -if(SHERPA_ONNX_USE_CXX11_ABI) - add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1) -else() - add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) -endif() set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") From fefc0d8667884629a5fba6a6acbee274d9dc00cf Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Tue, 31 Oct 2023 16:42:52 +0800 Subject: [PATCH 7/8] small fixes --- .github/workflows/aarch64-linux-gnu-shared.yaml | 1 + .github/workflows/aarch64-linux-gnu-static.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/aarch64-linux-gnu-shared.yaml b/.github/workflows/aarch64-linux-gnu-shared.yaml index 25eb3cbd7..4b7cdfbfd 100644 --- a/.github/workflows/aarch64-linux-gnu-shared.yaml +++ b/.github/workflows/aarch64-linux-gnu-shared.yaml @@ -5,6 +5,7 @@ on: push: branches: - master + - static-link-aarch64 tags: - '*' paths: diff --git a/.github/workflows/aarch64-linux-gnu-static.yaml b/.github/workflows/aarch64-linux-gnu-static.yaml index 1d01bfde0..a6ba30722 100644 --- a/.github/workflows/aarch64-linux-gnu-static.yaml +++ b/.github/workflows/aarch64-linux-gnu-static.yaml @@ -5,6 +5,7 @@ on: push: branches: - master + - static-link-aarch64 tags: - '*' paths: From dff751d00ac4959835d1796bc4b626d05f84bfb9 Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Tue, 31 Oct 2023 16:47:05 +0800 Subject: [PATCH 8/8] small fixes --- .github/workflows/aarch64-linux-gnu-shared.yaml | 1 - .github/workflows/aarch64-linux-gnu-static.yaml | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/aarch64-linux-gnu-shared.yaml b/.github/workflows/aarch64-linux-gnu-shared.yaml index 4b7cdfbfd..25eb3cbd7 100644 --- a/.github/workflows/aarch64-linux-gnu-shared.yaml +++ b/.github/workflows/aarch64-linux-gnu-shared.yaml @@ -5,7 +5,6 @@ on: push: branches: - master - - static-link-aarch64 tags: - '*' paths: diff --git a/.github/workflows/aarch64-linux-gnu-static.yaml b/.github/workflows/aarch64-linux-gnu-static.yaml index a6ba30722..1d01bfde0 100644 --- a/.github/workflows/aarch64-linux-gnu-static.yaml +++ b/.github/workflows/aarch64-linux-gnu-static.yaml @@ -5,7 +5,6 @@ on: push: branches: - master - - static-link-aarch64 tags: - '*' paths: