cross_build_linux_arm_inference.sh 5.2 KB
Newer Older
1 2 3 4 5
#!/usr/bin/env bash
set -e

ARCHS=("arm64-v8a" "armeabi-v7a-softfp" "armeabi-v7a-hardfp")
BUILD_TYPE=Release
6
MGE_WITH_CUDA=OFF
7 8 9 10
MGE_ARMV8_2_FEATURE_FP16=OFF
MGE_ARMV8_2_FEATURE_DOTPROD=OFF
MGE_DISABLE_FLOAT16=OFF
ARCH=arm64-v8a
11
REMOVE_OLD_BUILD=false
12 13
CMAKE_C_FLAGS="-Wno-psabi"
CMAKE_CXX_FLAGS="-Wno-psabi"
14
echo "EXTRA_CMAKE_ARGS: ${EXTRA_CMAKE_ARGS}"
15 16 17 18

function usage() {
    echo "$0 args1 args2 .."
    echo "available args detail:"
19
    echo "-d : Build with Debug mode, default Release mode"
20
    echo "-c : Build with CUDA, default without CUDA(for arm with cuda, example tx1)"
21 22 23 24
    echo "-f : enable MGE_ARMV8_2_FEATURE_FP16 for ARM64, need toolchain and hardware support"
    echo "-p : enable MGE_ARMV8_2_FEATURE_DOTPROD for ARM64, need toolchain and hardware support"
    echo "-k : open MGE_DISABLE_FLOAT16 for NEON "
    echo "-a : config build arch available: ${ARCHS[@]}"
25
    echo "-r : remove old build dir before make, default off"
26
    echo "-h : show usage"
27
    echo "append other cmake config by export EXTRA_CMAKE_ARGS=..."
28 29 30 31
    echo "example: $0 -d"
    exit -1
}

32
while getopts "rkhdcfpa:" arg
33 34 35 36 37 38
do
    case $arg in
        d)
            echo "Build with Debug mode"
            BUILD_TYPE=Debug
            ;;
39 40 41 42
        c)
            echo "Build with CUDA"
            MGE_WITH_CUDA=ON
            ;;
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
        f)
            echo "enable MGE_ARMV8_2_FEATURE_FP16 for ARM64"
            MGE_ARMV8_2_FEATURE_FP16=ON
            ;;
        p)
            echo "enable MGE_ARMV8_2_FEATURE_DOTPROD for ARM64"
            MGE_ARMV8_2_FEATURE_DOTPROD=ON
            ;;
        k)
            echo "open MGE_DISABLE_FLOAT16 for NEON"
            MGE_DISABLE_FLOAT16=ON
            ;;
        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
            ;;
75 76 77 78
        r)
            echo "config REMOVE_OLD_BUILD=true"
            REMOVE_OLD_BUILD=true
            ;;
79 80 81 82 83 84 85 86 87
        ?)
            echo "unkonw argument"
            usage
            ;;
    esac
done
echo "----------------------------------------------------"
echo "build config summary:"
echo "BUILD_TYPE: $BUILD_TYPE"
88
echo "MGE_WITH_CUDA: $MGE_WITH_CUDA"
89 90 91 92 93 94 95
echo "MGE_ARMV8_2_FEATURE_FP16: $MGE_ARMV8_2_FEATURE_FP16"
echo "MGE_ARMV8_2_FEATURE_DOTPROD: $MGE_ARMV8_2_FEATURE_DOTPROD"
echo "MGE_DISABLE_FLOAT16: $MGE_DISABLE_FLOAT16"
echo "ARCH: $ARCH"
echo "----------------------------------------------------"

READLINK=readlink
96
MAKEFILE_TYPE="Unix"
97 98 99 100
OS=$(uname -s)

if [ $OS = "Darwin" ];then
    READLINK=greadlink
101 102 103
elif [[ $OS =~ "NT" ]]; then
    echo "BUILD in NT ..."
    MAKEFILE_TYPE="Unix"
104 105
fi

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
if [ ! $OS = "Linux" ] && [ $MGE_WITH_CUDA = "ON" ];then
    echo "cross build for arm with cuda only support from Linux"
    exit -1
fi

if [ $MGE_WITH_CUDA = "ON" ] && [ ! $ARCH = "arm64-v8a" ];then
    echo "arm with cuda only support ARCH: arm64-v8a"
    exit -1
fi

if [ $MGE_WITH_CUDA = "OFF" ];then
    echo "config -Werror=unused-parameter when cuda off for CI check"
    CMAKE_C_FLAGS="-Werror=unused-parameter -Wno-psabi"
    CMAKE_CXX_FLAGS="-Werror=unused-parameter -Wno-psabi"
fi

122
SRC_DIR=$($READLINK -f "`dirname $0`/../../")
123
source $SRC_DIR/scripts/cmake-build/utils/utils.sh
124

125
function cmake_build() {
126
    BUILD_DIR=$SRC_DIR/build_dir/gnu-linux/MGE_WITH_CUDA_$3/$1/$BUILD_TYPE/build
127 128
    INSTALL_DIR=$BUILD_DIR/../install
    TOOLCHAIN=$SRC_DIR/toolchains/$2
129
    MGE_WITH_CUDA=$3
130 131 132 133
    echo "build dir: $BUILD_DIR"
    echo "install dir: $INSTALL_DIR"
    echo "build type: $BUILD_TYPE"
    echo "build toolchain: $TOOLCHAIN"
134
    echo "MGE_WITH_CUDA: $MGE_WITH_CUDA"
135
    echo "BUILD MAKEFILE_TYPE: $MAKEFILE_TYPE"
136
    try_remove_old_build $REMOVE_OLD_BUILD $BUILD_DIR $INSTALL_DIR
137 138 139 140 141

    echo "create build dir"
    mkdir -p $BUILD_DIR
    mkdir -p $INSTALL_DIR
    cd $BUILD_DIR
142
    cmake -G "$MAKEFILE_TYPE Makefiles" \
143 144
        -DCMAKE_C_FLAGS=$CMAKE_C_FLAGS \
        -DCMAKE_CXX_FLAGS=$CMAKE_CXX_FLAGS \
145
        -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN \
146 147
        -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
        -DMGE_INFERENCE_ONLY=ON \
148
        -DMGE_WITH_CUDA=$MGE_WITH_CUDA \
149 150 151 152
        -DMGE_ARMV8_2_FEATURE_FP16= $MGE_ARMV8_2_FEATURE_FP16 \
        -DMGE_ARMV8_2_FEATURE_DOTPROD=$MGE_ARMV8_2_FEATURE_DOTPROD \
        -DMGE_DISABLE_FLOAT16=$MGE_DISABLE_FLOAT16 \
        -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR \
153
        ${EXTRA_CMAKE_ARGS} \
154 155 156 157 158 159
        $SRC_DIR

    make -j$(nproc)
    make install/strip
}

160
build_flatc $SRC_DIR $REMOVE_OLD_BUILD
161 162 163 164 165 166 167 168 169 170 171 172

toolchain=null
if [ "$ARCH" = "arm64-v8a" ]; then
    toolchain="aarch64-linux-gnu.toolchain.cmake"
elif [ "$ARCH" = "armeabi-v7a-hardfp" ]; then
    toolchain="arm-linux-gnueabihf.toolchain.cmake"
elif [ "$ARCH" = "armeabi-v7a-softfp" ]; then
    toolchain="arm-linux-gnueabi.toolchain.cmake"
else
    echo "ERR CONFIG ABORT NOW!!"
    exit -1
fi
173
cmake_build $ARCH $toolchain $MGE_WITH_CUDA