| @@ -531,7 +531,8 @@ elseif( | |||||
| AND NOT APPLE | AND NOT APPLE | ||||
| AND NOT MSVC | AND NOT MSVC | ||||
| AND NOT WIN32 | AND NOT WIN32 | ||||
| AND NOT MGE_WITH_LARGE_ARCHIVE) | |||||
| AND NOT MGE_WITH_LARGE_ARCHIVE | |||||
| AND NOT ${MGE_ARCH} STREQUAL "riscv64") | |||||
| message(STATUS "Using GNU gold linker.") | message(STATUS "Using GNU gold linker.") | ||||
| set(MGE_COMMON_LINKER_FLAGS "-fuse-ld=gold") | set(MGE_COMMON_LINKER_FLAGS "-fuse-ld=gold") | ||||
| endif() | endif() | ||||
| @@ -1070,6 +1071,16 @@ if(APPLE) | |||||
| set(MGE_WITH_JIT_MLIR OFF) | set(MGE_WITH_JIT_MLIR OFF) | ||||
| endif() | endif() | ||||
| # riscv64 | |||||
| if(${MGE_ARCH} STREQUAL "riscv64") | |||||
| set(CMAKE_THREAD_LIBS_INIT "-lpthread") | |||||
| set(CMAKE_HAVE_THREADS_LIBRARY 1) | |||||
| set(CMAKE_USE_WIN32_THREADS_INIT 0) | |||||
| set(CMAKE_USE_PTHREADS_INIT 1) | |||||
| set(THREADS_PREFER_PTHREAD_FLAG ON) | |||||
| message(STATUS "force config thread when build riscv64, as CMAKE detect failed") | |||||
| endif() | |||||
| set(MGB_JIT ${MGE_WITH_JIT}) | set(MGB_JIT ${MGE_WITH_JIT}) | ||||
| set(MGB_JIT_MLIR ${MGE_WITH_JIT_MLIR}) | set(MGB_JIT_MLIR ${MGE_WITH_JIT_MLIR}) | ||||
| set(MGB_JIT_HALIDE ${MGE_WITH_HALIDE}) | set(MGB_JIT_HALIDE ${MGE_WITH_HALIDE}) | ||||
| @@ -10,6 +10,7 @@ | |||||
| * Windows cross build ARM-Linux (ok) | * Windows cross build ARM-Linux (ok) | ||||
| * Linux cross build ARM-Android (ok) | * Linux cross build ARM-Android (ok) | ||||
| * Linux cross build ARM-Linux (ok) | * Linux cross build ARM-Linux (ok) | ||||
| * Linux cross build RISCV(support [rvv](https://github.com/riscv/riscv-v-spec))-Linux (ok) | |||||
| * MacOS cross build ARM-Android (ok) | * MacOS cross build ARM-Android (ok) | ||||
| * MacOS cross build ARM-Linux (ok but experimental) | * MacOS cross build ARM-Linux (ok but experimental) | ||||
| * MacOS cross build IOS (ok) | * MacOS cross build IOS (ok) | ||||
| @@ -139,6 +140,14 @@ Now we support ARM-Linux on Linux and Windows fully, also experimental on MacOS | |||||
| 2: download toolchains from https://github.com/thinkski/osx-arm-linux-toolchains if use MacOS | 2: download toolchains from https://github.com/thinkski/osx-arm-linux-toolchains if use MacOS | ||||
| ``` | ``` | ||||
| ### Cross build for RISCV-Linux | |||||
| Now we support RISCV-Linux | |||||
| * commands: | |||||
| ``` | |||||
| 1: download toolchains from https://github.com/riscv-collab/riscv-gnu-toolchain | |||||
| ``` | |||||
| ### Cross build for IOS | ### Cross build for IOS | ||||
| Now we only support cross build to IOS from MACOS | Now we only support cross build to IOS from MACOS | ||||
| @@ -173,9 +182,20 @@ Now we only support cross build to IOS from MACOS | |||||
| ``` | ``` | ||||
| scripts/cmake-build/cross_build_linux_arm_inference.sh -h | scripts/cmake-build/cross_build_linux_arm_inference.sh -h | ||||
| ``` | ``` | ||||
| * cross build to RISCV-Linux: scripts/cmake-build/cross_build_linux_riscv_inference.sh | |||||
| builds MegBrain(MegEngine) for inference on Linux-RISCV platforms. | |||||
| The following command displays the usage: | |||||
| ``` | |||||
| scripts/cmake-build/cross_build_linux_riscv_inference.sh -h | |||||
| ``` | |||||
| * if board support RVV(at least 0.7), for example: nezha D1 , use -a rv64gcv0p7 | |||||
| * if board do not support RVV, use -a rv64norvv | |||||
| * cross build to IOS: scripts/cmake-build/cross_build_ios_arm_inference.sh | * cross build to IOS: scripts/cmake-build/cross_build_ios_arm_inference.sh | ||||
| builds MegBrain(MegEngine) for inference on iOS (iPhone/iPad) platforms. | builds MegBrain(MegEngine) for inference on iOS (iPhone/iPad) platforms. | ||||
| The following command displays the usage: | The following command displays the usage: | ||||
| ``` | ``` | ||||
| scripts/cmake-build/cross_build_ios_arm_inference.sh -h | scripts/cmake-build/cross_build_ios_arm_inference.sh -h | ||||
| ``` | ``` | ||||
| @@ -0,0 +1,149 @@ | |||||
| #!/usr/bin/env bash | |||||
| set -e | |||||
| ARCHS=("rv64gcv0p7" "rv64norvv") | |||||
| BUILD_TYPE=Release | |||||
| ARCH=rv64gcv0p7 | |||||
| REMOVE_OLD_BUILD=false | |||||
| NINJA_VERBOSE=OFF | |||||
| NINJA_DRY_RUN=OFF | |||||
| SPECIFIED_TARGET="install/strip" | |||||
| READLINK=readlink | |||||
| OS=$(uname -s) | |||||
| if [ $OS = "Darwin" ];then | |||||
| READLINK=greadlink | |||||
| fi | |||||
| SRC_DIR=$($READLINK -f "`dirname $0`/../../") | |||||
| source $SRC_DIR/scripts/cmake-build/utils/utils.sh | |||||
| config_ninja_default_max_jobs | |||||
| echo "EXTRA_CMAKE_ARGS: ${EXTRA_CMAKE_ARGS}" | |||||
| function usage() { | |||||
| echo "$0 args1 args2 .." | |||||
| echo "available args detail:" | |||||
| echo "-d : Build with Debug mode, default Release mode" | |||||
| echo "-a : config build arch available: ${ARCHS[@]}" | |||||
| echo "-r : remove old build dir before make, default off" | |||||
| echo "-v : ninja with verbose and explain, default off" | |||||
| echo "-n : ninja with -n dry run (don't run commands but act like they succeeded)" | |||||
| echo "-j : run N jobs in parallel for ninja, defaut is cpu_number + 2" | |||||
| echo "-e : build a specified target (always for debug, NOTICE: do not do strip/install target when use -e)" | |||||
| echo "-l : list CMakeLists.txt all options, can be use to config EXTRA_CMAKE_ARGS" | |||||
| echo "-h : show usage" | |||||
| echo "append other cmake config by config EXTRA_CMAKE_ARGS, for example, enable MGE_WITH_TEST and build with Debug mode:" | |||||
| echo "EXTRA_CMAKE_ARGS=\"-DMGE_WITH_TEST=ON\" $0 -d" | |||||
| exit -1 | |||||
| } | |||||
| while getopts "lnvrhda:e:j:" arg | |||||
| do | |||||
| case $arg in | |||||
| j) | |||||
| NINJA_MAX_JOBS=$OPTARG | |||||
| echo "config NINJA_MAX_JOBS to ${NINJA_MAX_JOBS}" | |||||
| ;; | |||||
| l) | |||||
| echo "list CMakeLists.txt all options, can be used to config EXTRA_CMAKE_ARGS" | |||||
| show_cmakelist_options | |||||
| exit 0 | |||||
| ;; | |||||
| d) | |||||
| echo "Build with Debug mode" | |||||
| BUILD_TYPE=Debug | |||||
| ;; | |||||
| a) | |||||
| tmp_arch=null | |||||
| for arch in ${ARCHS[@]}; do | |||||
| if [ "$arch" = "$OPTARG" ]; then | |||||
| echo "CONFIG BUILD ARCH to : $OPTARG" | |||||
| tmp_arch=$OPTARG | |||||
| ARCH=$OPTARG | |||||
| break | |||||
| fi | |||||
| done | |||||
| if [ "$tmp_arch" = "null" ]; then | |||||
| echo "ERR args for arch (-a)" | |||||
| echo "available arch list: ${ARCHS[@]}" | |||||
| usage | |||||
| fi | |||||
| ;; | |||||
| h) | |||||
| echo "show usage" | |||||
| usage | |||||
| ;; | |||||
| r) | |||||
| echo "config REMOVE_OLD_BUILD=true" | |||||
| REMOVE_OLD_BUILD=true | |||||
| ;; | |||||
| v) | |||||
| echo "config NINJA_VERBOSE=ON" | |||||
| NINJA_VERBOSE=ON | |||||
| ;; | |||||
| n) | |||||
| echo "config NINJA_DRY_RUN=ON" | |||||
| NINJA_DRY_RUN=ON | |||||
| ;; | |||||
| e) | |||||
| SPECIFIED_TARGET=$OPTARG | |||||
| ;; | |||||
| ?) | |||||
| echo "unkonw argument" | |||||
| usage | |||||
| ;; | |||||
| esac | |||||
| done | |||||
| echo "----------------------------------------------------" | |||||
| echo "build config summary:" | |||||
| echo "BUILD_TYPE: $BUILD_TYPE" | |||||
| echo "SPECIFIED_TARGET: ${SPECIFIED_TARGET}" | |||||
| echo "NINJA_MAX_JOBS: ${NINJA_MAX_JOBS}" | |||||
| echo "ARCH: $ARCH" | |||||
| echo "----------------------------------------------------" | |||||
| if [ ! $OS = "Linux" ];then | |||||
| echo "cross build for riscv only support from Linux" | |||||
| exit -1 | |||||
| fi | |||||
| function cmake_build() { | |||||
| BUILD_DIR=$SRC_DIR/build_dir/riscv-linux/$1/$BUILD_TYPE/build | |||||
| INSTALL_DIR=$BUILD_DIR/../install | |||||
| TOOLCHAIN=$SRC_DIR/toolchains/$2 | |||||
| echo "build dir: $BUILD_DIR" | |||||
| echo "install dir: $INSTALL_DIR" | |||||
| echo "build type: $BUILD_TYPE" | |||||
| echo "build toolchain: $TOOLCHAIN" | |||||
| try_remove_old_build $REMOVE_OLD_BUILD $BUILD_DIR $INSTALL_DIR | |||||
| echo "create build dir" | |||||
| mkdir -p $BUILD_DIR | |||||
| mkdir -p $INSTALL_DIR | |||||
| cd_real_build_dir $BUILD_DIR | |||||
| bash -c "cmake -G Ninja \ | |||||
| -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN \ | |||||
| -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ | |||||
| -DMGE_INFERENCE_ONLY=ON \ | |||||
| -DMGE_WITH_CUDA=OFF \ | |||||
| -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR \ | |||||
| ${EXTRA_CMAKE_ARGS} \ | |||||
| $SRC_DIR " | |||||
| config_ninja_target_cmd ${NINJA_VERBOSE} "OFF" "${SPECIFIED_TARGET}" ${NINJA_DRY_RUN} ${NINJA_MAX_JOBS} | |||||
| bash -c "${NINJA_CMD}" | |||||
| } | |||||
| build_flatc $SRC_DIR $REMOVE_OLD_BUILD | |||||
| toolchain=null | |||||
| if [ "$ARCH" = "rv64gcv0p7" ]; then | |||||
| toolchain="riscv64-rvv-linux-gnu.toolchain.cmake" | |||||
| elif [ "$ARCH" = "rv64norvv" ]; then | |||||
| toolchain="riscv64-linux-gnu.toolchain.cmake" | |||||
| else | |||||
| echo "ERR CONFIG ABORT NOW!!" | |||||
| exit -1 | |||||
| fi | |||||
| cmake_build $ARCH $toolchain | |||||
| @@ -0,0 +1,23 @@ | |||||
| set(CMAKE_SYSTEM_NAME Linux) | |||||
| set(CMAKE_SYSTEM_PROCESSOR riscv64) | |||||
| set(RISCV_CROSS_BUILD_ARCH riscv64) | |||||
| if(DEFINED ENV{RISCV_TOOLCHAIN_ROOT}) | |||||
| file(TO_CMAKE_PATH $ENV{RISCV_TOOLCHAIN_ROOT} RISCV_TOOLCHAIN_ROOT) | |||||
| else() | |||||
| message(FATAL_ERROR "RISCV_TOOLCHAIN_ROOT env must be defined") | |||||
| endif() | |||||
| set(RISCV_TOOLCHAIN_ROOT | |||||
| ${RISCV_TOOLCHAIN_ROOT} | |||||
| CACHE STRING "root path to riscv toolchain") | |||||
| set(CMAKE_C_COMPILER "${RISCV_TOOLCHAIN_ROOT}/bin/riscv64-unknown-linux-gnu-gcc") | |||||
| set(CMAKE_CXX_COMPILER "${RISCV_TOOLCHAIN_ROOT}/bin/riscv64-unknown-linux-gnu-g++") | |||||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=rv64gcv0p7 -mabi=lp64d") | |||||
| set(CMAKE_CXX_FLAGS | |||||
| "${CMAKE_CXX_FLAGS} -march=rv64gcv0p7 -mabi=lp64d -Wno-error=attributes") | |||||
| set(CMAKE_FIND_ROOT_PATH "${RISCV_TOOLCHAIN_ROOT}/riscv64-unknown-linux-gnu") | |||||
| set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) | |||||
| set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) | |||||
| set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | |||||