diff --git a/.github/workflows/aarch64-linux-gnu.yaml b/.github/workflows/aarch64-linux-gnu.yaml new file mode 100644 index 00000000..bf68568a --- /dev/null +++ b/.github/workflows/aarch64-linux-gnu.yaml @@ -0,0 +1,124 @@ +# Modified from https://github.com/Tencent/ncnn/blob/master/.github/workflows/linux-arm-cpu-gcc.yml +name: aarch64-linux-gnu + +on: + push: + branches: + - master + paths: + - '.github/workflows/aarch64-linux-gnu.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'sherpa-onnx/csrc/*' + - 'toolchains/aarch64-linux-gnu.toolchain.cmake' + pull_request: + branches: + - master + paths: + - '.github/workflows/aarch64-linux-gnu.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'sherpa-onnx/csrc/*' + - 'toolchains/aarch64-linux-gnu.toolchain.cmake' + +concurrency: + group: aarch64-linux-gnu-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + aarch64_linux_gnu: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - 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 + + ./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 diff --git a/.github/workflows/arm-linux-gnueabihf.yaml b/.github/workflows/arm-linux-gnueabihf.yaml new file mode 100644 index 00000000..0e1d4c32 --- /dev/null +++ b/.github/workflows/arm-linux-gnueabihf.yaml @@ -0,0 +1,126 @@ +# Modified from https://github.com/Tencent/ncnn/blob/master/.github/workflows/linux-arm-cpu-gcc.yml +name: arm-linux-gnueabihf + +on: + push: + branches: + - master + paths: + - '.github/workflows/arm-linux-gnueabihf.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'sherpa-onnx/csrc/*' + - 'toolchains/arm-linux-gnueabihf.toolchain.cmake' + pull_request: + branches: + - master + paths: + - '.github/workflows/arm-linux-gnueabihf.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'sherpa-onnx/csrc/*' + - 'toolchains/arm-linux-gnueabihf.toolchain.cmake' + +concurrency: + group: arm-linux-gnueabihf-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + arm_linux_gnueabihf: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: cache-qemu + id: cache-qemu + uses: actions/cache@v3 + with: + path: qemu-install + key: qemu-arm-install-20220907 + + - 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=arm-linux-user --disable-system + make -j2 + make install + + - name: cache-toolchain + id: cache-toolchain + uses: actions/cache@v3 + with: + path: toolchain + key: gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf + + - name: Download toolchain + if: steps.cache-toolchain.outputs.cache-hit != 'true' + shell: bash + run: | + git lfs install + git clone https://huggingface.co/csukuangfj/arm-linux-gcc + ls -lh arm-linux-gcc + + mkdir $GITHUB_WORKSPACE/toolchain + tar xvf ./arm-linux-gcc/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz --strip-components 1 -C $GITHUB_WORKSPACE/toolchain + + - name: Display toolchain info + shell: bash + run: | + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH + arm-linux-gnueabihf-gcc --version + + - name: Display qemu-arm -h + shell: bash + run: | + export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH + export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/arm-linux-gnueabihf/libc + qemu-arm -h + + - name: build arm-linux-gnueabihf + shell: bash + run: | + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH + + ./build-arm-linux-gnueabihf.sh + + ls -lh build-arm-linux-gnueabihf/bin + ls -lh build-arm-linux-gnueabihf/lib + + file build-arm-linux-gnueabihf/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/arm-linux-gnueabihf/libc + + + ls -lh ./build-arm-linux-gnueabihf/bin + + qemu-arm ./build-arm-linux-gnueabihf/bin/sherpa-onnx --help diff --git a/.gitignore b/.gitignore index dc00d2e5..55661c5b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ dist/ sherpa_onnx.egg-info/ .DS_Store build-aarch64-linux-gnu +build-arm-linux-gnueabihf sherpa-onnx-streaming-zipformer-* sherpa-onnx-lstm-en-* sherpa-onnx-lstm-zh-* diff --git a/build-arm-linux-gnueabihf.sh b/build-arm-linux-gnueabihf.sh new file mode 100755 index 00000000..305cf3ce --- /dev/null +++ b/build-arm-linux-gnueabihf.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +if ! command -v arm-linux-gnueabihf-gcc &> /dev/null; then + echo "Please install a toolchain for cross-compiling." + echo "You can refer to: " + echo " https://k2-fsa.github.io/sherpa/onnx/install/arm-embedded-linux.html" + echo "for help." + exit 1 +fi + +set -ex + +dir=build-arm-linux-gnueabihf +mkdir -p $dir +cd $dir + +if [ ! -f alsa-lib/src/.libs/libasound.so ]; then + echo "Start to cross-compile alsa-lib" + if [ ! -d alsa-lib ]; then + git clone --depth 1 https://github.com/alsa-project/alsa-lib + fi + pushd alsa-lib + CC=arm-linux-gnueabihf-gcc ./gitcompile --host=arm-linux-gnueabihf + popd + echo "Finish cross-compiling alsa-lib" +fi + +export CPLUS_INCLUDE_PATH=$PWD/alsa-lib/include:$CPLUS_INCLUDE_PATH +export SHERPA_ONNX_ALSA_LIB_DIR=$PWD/alsa-lib/src/.libs + +cmake \ + -DCMAKE_INSTALL_PREFIX=./install \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DSHERPA_ONNX_ENABLE_TESTS=OFF \ + -DSHERPA_ONNX_ENABLE_PYTHON=OFF \ + -DSHERPA_ONNX_ENABLE_CHECK=OFF \ + -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \ + -DSHERPA_ONNX_ENABLE_JNI=OFF \ + -DSHERPA_ONNX_ENABLE_C_API=OFF \ + -DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \ + -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-linux-gnueabihf.toolchain.cmake \ + .. + +make VERBOSE=1 -j4 +make install/strip + +cp -v $SHERPA_ONNX_ALSA_LIB_DIR/libasound.so* ./install/lib/ diff --git a/cmake/onnxruntime.cmake b/cmake/onnxruntime.cmake index 8d4ba378..b796ea5f 100644 --- a/cmake/onnxruntime.cmake +++ b/cmake/onnxruntime.cmake @@ -1,7 +1,10 @@ function(download_onnxruntime) include(FetchContent) - if(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) + message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}") + message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") + + if(CMAKE_SYSTEM_NAME STREQUAL Linux AND CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) # For embedded systems set(possible_file_locations $ENV{HOME}/Downloads/onnxruntime-linux-aarch64-1.14.0.tgz @@ -13,6 +16,18 @@ function(download_onnxruntime) set(onnxruntime_URL "https://github.com/microsoft/onnxruntime/releases/download/v1.14.0/onnxruntime-linux-aarch64-1.14.0.tgz") set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/onnxruntime-linux-aarch64-1.14.0.tgz") set(onnxruntime_HASH "SHA256=9384d2e6e29fed693a4630303902392eead0c41bee5705ccac6d6d34a3d5db86") + elseif(CMAKE_SYSTEM_NAME STREQUAL Linux AND CMAKE_SYSTEM_PROCESSOR STREQUAL arm) + # For embedded systems + set(possible_file_locations + $ENV{HOME}/Downloads/onnxruntime-linux-arm-1.14.0.zip + ${PROJECT_SOURCE_DIR}/onnxruntime-linux-arm-1.14.0.zip + ${PROJECT_BINARY_DIR}/onnxruntime-linux-arm-1.14.0.zip + /tmp/onnxruntime-linux-arm-1.14.0.zip + /star-fj/fangjun/download/github/onnxruntime-linux-arm-1.14.0.zip + ) + set(onnxruntime_URL "https://huggingface.co/csukuangfj/onnxruntime-libs/resolve/main/onnxruntime-linux-arm-1.14.0.zip") + set(onnxruntime_URL2 "") + set(onnxruntime_HASH "SHA256=61e4a4fa2d211a24e878e25bfcdee0daee5a68ac8d2d2967c0000b0fb079385c") elseif(CMAKE_SYSTEM_NAME STREQUAL Linux AND CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64) # If you don't have access to the Internet, # please pre-download onnxruntime diff --git a/toolchains/arm-linux-gnueabihf.toolchain.cmake b/toolchains/arm-linux-gnueabihf.toolchain.cmake new file mode 100644 index 00000000..abe1a22b --- /dev/null +++ b/toolchains/arm-linux-gnueabihf.toolchain.cmake @@ -0,0 +1,17 @@ +# Copied from https://github.com/Tencent/ncnn/blob/master/toolchains/arm-linux-gnueabihf.toolchain.cmake +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR arm) + +set(CMAKE_C_COMPILER "arm-linux-gnueabihf-gcc") +set(CMAKE_CXX_COMPILER "arm-linux-gnueabihf-g++") + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +set(CMAKE_C_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon") +set(CMAKE_CXX_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon") + +# cache flags +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")