Fangjun Kuang
Committed by GitHub

Support 32-bit ARM Linux (#202)

  1 +# Modified from https://github.com/Tencent/ncnn/blob/master/.github/workflows/linux-arm-cpu-gcc.yml
  2 +name: aarch64-linux-gnu
  3 +
  4 +on:
  5 + push:
  6 + branches:
  7 + - master
  8 + paths:
  9 + - '.github/workflows/aarch64-linux-gnu.yaml'
  10 + - 'CMakeLists.txt'
  11 + - 'cmake/**'
  12 + - 'sherpa-onnx/csrc/*'
  13 + - 'toolchains/aarch64-linux-gnu.toolchain.cmake'
  14 + pull_request:
  15 + branches:
  16 + - master
  17 + paths:
  18 + - '.github/workflows/aarch64-linux-gnu.yaml'
  19 + - 'CMakeLists.txt'
  20 + - 'cmake/**'
  21 + - 'sherpa-onnx/csrc/*'
  22 + - 'toolchains/aarch64-linux-gnu.toolchain.cmake'
  23 +
  24 +concurrency:
  25 + group: aarch64-linux-gnu-${{ github.ref }}
  26 + cancel-in-progress: true
  27 +
  28 +permissions:
  29 + contents: read
  30 +
  31 +jobs:
  32 + aarch64_linux_gnu:
  33 + runs-on: ${{ matrix.os }}
  34 + strategy:
  35 + fail-fast: false
  36 + matrix:
  37 + os: [ubuntu-latest]
  38 +
  39 + steps:
  40 + - uses: actions/checkout@v2
  41 + with:
  42 + fetch-depth: 0
  43 +
  44 + - name: cache-qemu
  45 + id: cache-qemu
  46 + uses: actions/cache@v3
  47 + with:
  48 + path: qemu-install
  49 + key: qemu-aarch64-install-20220908
  50 +
  51 + - name: install-qemu-build-deps
  52 + if: steps.cache-qemu.outputs.cache-hit != 'true'
  53 + run: |
  54 + sudo apt-get update
  55 + sudo apt-get install autoconf automake autotools-dev ninja-build
  56 +
  57 + - name: checkout-qemu
  58 + if: steps.cache-qemu.outputs.cache-hit != 'true'
  59 + uses: actions/checkout@v3
  60 + with:
  61 + repository: qemu/qemu
  62 + path: qemu
  63 + ref: f5643914a9e8f79c606a76e6a9d7ea82a3fc3e65
  64 +
  65 + - name: qemu
  66 + if: steps.cache-qemu.outputs.cache-hit != 'true'
  67 + run: |
  68 + cd qemu
  69 + ./configure --prefix=$GITHUB_WORKSPACE/qemu-install --target-list=aarch64-linux-user --disable-system
  70 + make -j2
  71 + make install
  72 +
  73 + - name: cache-toolchain
  74 + id: cache-toolchain
  75 + uses: actions/cache@v3
  76 + with:
  77 + path: toolchain
  78 + key: gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
  79 +
  80 + - name: Download toolchain
  81 + if: steps.cache-toolchain.outputs.cache-hit != 'true'
  82 + shell: bash
  83 + run: |
  84 + 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
  85 +
  86 + mkdir $GITHUB_WORKSPACE/toolchain
  87 + tar xvf ./gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz --strip-components 1 -C $GITHUB_WORKSPACE/toolchain
  88 +
  89 + - name: Display toolchain info
  90 + shell: bash
  91 + run: |
  92 + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH
  93 + aarch64-linux-gnu-gcc --version
  94 +
  95 + - name: Display qemu-aarch64 -h
  96 + shell: bash
  97 + run: |
  98 + export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH
  99 + export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/aarch64-linux-gnu/libc
  100 + qemu-aarch64 -h
  101 +
  102 + - name: build aarch64-linux-gnu
  103 + shell: bash
  104 + run: |
  105 + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH
  106 +
  107 + ./build-aarch64-linux-gnu.sh
  108 +
  109 + ls -lh build-aarch64-linux-gnu/bin
  110 + ls -lh build-aarch64-linux-gnu/lib
  111 +
  112 + file build-aarch64-linux-gnu/bin/sherpa-onnx
  113 +
  114 + - name: Test sherpa-onnx
  115 + shell: bash
  116 + run: |
  117 + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH
  118 + export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH
  119 + export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/aarch64-linux-gnu/libc
  120 +
  121 +
  122 + ls -lh ./build-aarch64-linux-gnu/bin
  123 +
  124 + qemu-aarch64 ./build-aarch64-linux-gnu/bin/sherpa-onnx --help
  1 +# Modified from https://github.com/Tencent/ncnn/blob/master/.github/workflows/linux-arm-cpu-gcc.yml
  2 +name: arm-linux-gnueabihf
  3 +
  4 +on:
  5 + push:
  6 + branches:
  7 + - master
  8 + paths:
  9 + - '.github/workflows/arm-linux-gnueabihf.yaml'
  10 + - 'CMakeLists.txt'
  11 + - 'cmake/**'
  12 + - 'sherpa-onnx/csrc/*'
  13 + - 'toolchains/arm-linux-gnueabihf.toolchain.cmake'
  14 + pull_request:
  15 + branches:
  16 + - master
  17 + paths:
  18 + - '.github/workflows/arm-linux-gnueabihf.yaml'
  19 + - 'CMakeLists.txt'
  20 + - 'cmake/**'
  21 + - 'sherpa-onnx/csrc/*'
  22 + - 'toolchains/arm-linux-gnueabihf.toolchain.cmake'
  23 +
  24 +concurrency:
  25 + group: arm-linux-gnueabihf-${{ github.ref }}
  26 + cancel-in-progress: true
  27 +
  28 +permissions:
  29 + contents: read
  30 +
  31 +jobs:
  32 + arm_linux_gnueabihf:
  33 + runs-on: ${{ matrix.os }}
  34 + strategy:
  35 + fail-fast: false
  36 + matrix:
  37 + os: [ubuntu-latest]
  38 +
  39 + steps:
  40 + - uses: actions/checkout@v2
  41 + with:
  42 + fetch-depth: 0
  43 +
  44 + - name: cache-qemu
  45 + id: cache-qemu
  46 + uses: actions/cache@v3
  47 + with:
  48 + path: qemu-install
  49 + key: qemu-arm-install-20220907
  50 +
  51 + - name: install-qemu-build-deps
  52 + if: steps.cache-qemu.outputs.cache-hit != 'true'
  53 + run: |
  54 + sudo apt-get update
  55 + sudo apt-get install autoconf automake autotools-dev ninja-build
  56 +
  57 + - name: checkout-qemu
  58 + if: steps.cache-qemu.outputs.cache-hit != 'true'
  59 + uses: actions/checkout@v3
  60 + with:
  61 + repository: qemu/qemu
  62 + path: qemu
  63 + ref: f5643914a9e8f79c606a76e6a9d7ea82a3fc3e65
  64 +
  65 + - name: qemu
  66 + if: steps.cache-qemu.outputs.cache-hit != 'true'
  67 + run: |
  68 + cd qemu
  69 + ./configure --prefix=$GITHUB_WORKSPACE/qemu-install --target-list=arm-linux-user --disable-system
  70 + make -j2
  71 + make install
  72 +
  73 + - name: cache-toolchain
  74 + id: cache-toolchain
  75 + uses: actions/cache@v3
  76 + with:
  77 + path: toolchain
  78 + key: gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
  79 +
  80 + - name: Download toolchain
  81 + if: steps.cache-toolchain.outputs.cache-hit != 'true'
  82 + shell: bash
  83 + run: |
  84 + git lfs install
  85 + git clone https://huggingface.co/csukuangfj/arm-linux-gcc
  86 + ls -lh arm-linux-gcc
  87 +
  88 + mkdir $GITHUB_WORKSPACE/toolchain
  89 + 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
  90 +
  91 + - name: Display toolchain info
  92 + shell: bash
  93 + run: |
  94 + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH
  95 + arm-linux-gnueabihf-gcc --version
  96 +
  97 + - name: Display qemu-arm -h
  98 + shell: bash
  99 + run: |
  100 + export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH
  101 + export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/arm-linux-gnueabihf/libc
  102 + qemu-arm -h
  103 +
  104 + - name: build arm-linux-gnueabihf
  105 + shell: bash
  106 + run: |
  107 + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH
  108 +
  109 + ./build-arm-linux-gnueabihf.sh
  110 +
  111 + ls -lh build-arm-linux-gnueabihf/bin
  112 + ls -lh build-arm-linux-gnueabihf/lib
  113 +
  114 + file build-arm-linux-gnueabihf/bin/sherpa-onnx
  115 +
  116 + - name: Test sherpa-onnx
  117 + shell: bash
  118 + run: |
  119 + export PATH=$GITHUB_WORKSPACE/toolchain/bin:$PATH
  120 + export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH
  121 + export QEMU_LD_PREFIX=$GITHUB_WORKSPACE/toolchain/arm-linux-gnueabihf/libc
  122 +
  123 +
  124 + ls -lh ./build-arm-linux-gnueabihf/bin
  125 +
  126 + qemu-arm ./build-arm-linux-gnueabihf/bin/sherpa-onnx --help
@@ -9,6 +9,7 @@ dist/ @@ -9,6 +9,7 @@ dist/
9 sherpa_onnx.egg-info/ 9 sherpa_onnx.egg-info/
10 .DS_Store 10 .DS_Store
11 build-aarch64-linux-gnu 11 build-aarch64-linux-gnu
  12 +build-arm-linux-gnueabihf
12 sherpa-onnx-streaming-zipformer-* 13 sherpa-onnx-streaming-zipformer-*
13 sherpa-onnx-lstm-en-* 14 sherpa-onnx-lstm-en-*
14 sherpa-onnx-lstm-zh-* 15 sherpa-onnx-lstm-zh-*
  1 +#!/usr/bin/env bash
  2 +
  3 +if ! command -v arm-linux-gnueabihf-gcc &> /dev/null; then
  4 + echo "Please install a toolchain for cross-compiling."
  5 + echo "You can refer to: "
  6 + echo " https://k2-fsa.github.io/sherpa/onnx/install/arm-embedded-linux.html"
  7 + echo "for help."
  8 + exit 1
  9 +fi
  10 +
  11 +set -ex
  12 +
  13 +dir=build-arm-linux-gnueabihf
  14 +mkdir -p $dir
  15 +cd $dir
  16 +
  17 +if [ ! -f alsa-lib/src/.libs/libasound.so ]; then
  18 + echo "Start to cross-compile alsa-lib"
  19 + if [ ! -d alsa-lib ]; then
  20 + git clone --depth 1 https://github.com/alsa-project/alsa-lib
  21 + fi
  22 + pushd alsa-lib
  23 + CC=arm-linux-gnueabihf-gcc ./gitcompile --host=arm-linux-gnueabihf
  24 + popd
  25 + echo "Finish cross-compiling alsa-lib"
  26 +fi
  27 +
  28 +export CPLUS_INCLUDE_PATH=$PWD/alsa-lib/include:$CPLUS_INCLUDE_PATH
  29 +export SHERPA_ONNX_ALSA_LIB_DIR=$PWD/alsa-lib/src/.libs
  30 +
  31 +cmake \
  32 + -DCMAKE_INSTALL_PREFIX=./install \
  33 + -DCMAKE_BUILD_TYPE=Release \
  34 + -DBUILD_SHARED_LIBS=OFF \
  35 + -DSHERPA_ONNX_ENABLE_TESTS=OFF \
  36 + -DSHERPA_ONNX_ENABLE_PYTHON=OFF \
  37 + -DSHERPA_ONNX_ENABLE_CHECK=OFF \
  38 + -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
  39 + -DSHERPA_ONNX_ENABLE_JNI=OFF \
  40 + -DSHERPA_ONNX_ENABLE_C_API=OFF \
  41 + -DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \
  42 + -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-linux-gnueabihf.toolchain.cmake \
  43 + ..
  44 +
  45 +make VERBOSE=1 -j4
  46 +make install/strip
  47 +
  48 +cp -v $SHERPA_ONNX_ALSA_LIB_DIR/libasound.so* ./install/lib/
1 function(download_onnxruntime) 1 function(download_onnxruntime)
2 include(FetchContent) 2 include(FetchContent)
3 3
4 - if(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) 4 + message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
  5 + message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
  6 +
  7 + if(CMAKE_SYSTEM_NAME STREQUAL Linux AND CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
5 # For embedded systems 8 # For embedded systems
6 set(possible_file_locations 9 set(possible_file_locations
7 $ENV{HOME}/Downloads/onnxruntime-linux-aarch64-1.14.0.tgz 10 $ENV{HOME}/Downloads/onnxruntime-linux-aarch64-1.14.0.tgz
@@ -13,6 +16,18 @@ function(download_onnxruntime) @@ -13,6 +16,18 @@ function(download_onnxruntime)
13 set(onnxruntime_URL "https://github.com/microsoft/onnxruntime/releases/download/v1.14.0/onnxruntime-linux-aarch64-1.14.0.tgz") 16 set(onnxruntime_URL "https://github.com/microsoft/onnxruntime/releases/download/v1.14.0/onnxruntime-linux-aarch64-1.14.0.tgz")
14 set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/onnxruntime-linux-aarch64-1.14.0.tgz") 17 set(onnxruntime_URL2 "https://huggingface.co/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/onnxruntime-linux-aarch64-1.14.0.tgz")
15 set(onnxruntime_HASH "SHA256=9384d2e6e29fed693a4630303902392eead0c41bee5705ccac6d6d34a3d5db86") 18 set(onnxruntime_HASH "SHA256=9384d2e6e29fed693a4630303902392eead0c41bee5705ccac6d6d34a3d5db86")
  19 + elseif(CMAKE_SYSTEM_NAME STREQUAL Linux AND CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
  20 + # For embedded systems
  21 + set(possible_file_locations
  22 + $ENV{HOME}/Downloads/onnxruntime-linux-arm-1.14.0.zip
  23 + ${PROJECT_SOURCE_DIR}/onnxruntime-linux-arm-1.14.0.zip
  24 + ${PROJECT_BINARY_DIR}/onnxruntime-linux-arm-1.14.0.zip
  25 + /tmp/onnxruntime-linux-arm-1.14.0.zip
  26 + /star-fj/fangjun/download/github/onnxruntime-linux-arm-1.14.0.zip
  27 + )
  28 + set(onnxruntime_URL "https://huggingface.co/csukuangfj/onnxruntime-libs/resolve/main/onnxruntime-linux-arm-1.14.0.zip")
  29 + set(onnxruntime_URL2 "")
  30 + set(onnxruntime_HASH "SHA256=61e4a4fa2d211a24e878e25bfcdee0daee5a68ac8d2d2967c0000b0fb079385c")
16 elseif(CMAKE_SYSTEM_NAME STREQUAL Linux AND CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64) 31 elseif(CMAKE_SYSTEM_NAME STREQUAL Linux AND CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
17 # If you don't have access to the Internet, 32 # If you don't have access to the Internet,
18 # please pre-download onnxruntime 33 # please pre-download onnxruntime
  1 +# Copied from https://github.com/Tencent/ncnn/blob/master/toolchains/arm-linux-gnueabihf.toolchain.cmake
  2 +set(CMAKE_SYSTEM_NAME Linux)
  3 +set(CMAKE_SYSTEM_PROCESSOR arm)
  4 +
  5 +set(CMAKE_C_COMPILER "arm-linux-gnueabihf-gcc")
  6 +set(CMAKE_CXX_COMPILER "arm-linux-gnueabihf-g++")
  7 +
  8 +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  9 +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  10 +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  11 +
  12 +set(CMAKE_C_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")
  13 +set(CMAKE_CXX_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")
  14 +
  15 +# cache flags
  16 +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags")
  17 +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")