#!/bin/bash
set -e
BASEPATH=$(cd "$(dirname $0)"; pwd)
OUTPUT_PATH="${BASEPATH}/build_out"
BUILD_RELATIVE_PATH="build"
BUILD_PATH="${BASEPATH}/${BUILD_RELATIVE_PATH}/"
usage() {
echo "Usage:"
echo " sh build.sh [-h | --help] [-v | --verbose] [-j<N>]"
echo " [--pkg] [--pkg-type=<TYPE>] [--examples]"
echo " [--build_type=<Release|Debug> | --build-type=<Release|Debug]"
echo " [--cann_3rd_lib_path=<PATH> | --cann-3rd-lib-path=<PATH>]"
echo " [--output_path=<PATH> | --output-path=<PATH>]"
echo " [--asan] [--cov]"
echo ""
echo "Options:"
echo " -h, --help Print usage"
echo " -v, --verbose Display build command"
echo " -j<N> Set the number of threads used for building HIXL, default is 8"
echo " --pkg-type=<TYPE> Specify package type (TYPE option: run/rpm/deb/all), Default: run"
echo " --build_type=<Release|Debug> |--build-type=<Release|Debug>"
echo " Set build type, default Release"
echo " --cann_3rd_lib_path=<PATH> | --cann-3rd-lib-path=<PATH>"
echo " Set ascend third_party package install path, default ./third_party"
echo " --output_path=<PATH> | --output-path=<PATH>"
echo " Set output path, default ./build_out"
echo " --pkg Build run package, reserved parameter"
echo " --examples Build with examples and benchmarks, default is OFF"
echo " --asan Enable AddressSanitizer, default is OFF"
echo " --cov Enable Coverage, default is OFF"
echo " --sign-script=<PATH> | --sign_script=<PATH>"
echo " Set sign-script's path to <PATH>"
echo " --enable-sign Enable to sign"
echo ""
}
check_build_type() {
arg_value="$1"
if [ "X$arg_value" != "XRelease" ] && [ "X$arg_value" != "XDebug" ]; then
echo "Invalid value $arg_value for option --$2"
usage
exit 1
fi
}
check_pkg_type() {
arg_value="$1"
if [ "X$arg_value" != "Xrun" ] && [ "X$arg_value" != "Xrpm" ] && [ "X$arg_value" != "Xdeb" ] && [ "X$arg_value" != "Xall" ]; then
echo "Invalid value $arg_value for option --$2"
usage
exit 1
fi
}
checkopts() {
VERBOSE=""
THREAD_NUM=8
OUTPUT_PATH="${BASEPATH}/build_out"
CANN_3RD_LIB_PATH="$BASEPATH/third_party"
CMAKE_BUILD_TYPE="Release"
PACKAGE_TYPE="run"
ENABLE_EXAMPLES=OFF
ENABLE_BENCHMARKS=OFF
ENABLE_ASAN=OFF
ENABLE_GCOV=OFF
ENABLE_SIGN=OFF
CUSTOM_SIGN_SCRIPT="${BASEPATH}/scripts/sign/community_sign_build.py"
parsed_args=$(getopt -a -o j:hv -l help,verbose,pkg,pkg-type:,examples,cann_3rd_lib_path:,cann-3rd-lib-path:,output_path:,output-path:,build_type:,build-type:,sign-script:,sign_script:,asan,cov,enable_sign,enable-sign -- "$@") || {
usage
exit 1
}
eval set -- "$parsed_args"
while true; do
case "$1" in
-h | --help)
usage
exit 0
;;
-j)
THREAD_NUM="$2"
shift 2
;;
-v | --verbose)
VERBOSE="VERBOSE=1"
shift
;;
--cann_3rd_lib_path | --cann-3rd-lib-path)
CANN_3RD_LIB_PATH="$(realpath $2)"
shift 2
;;
--output_path | --output-path)
OUTPUT_PATH="$(realpath $2)"
shift 2
;;
--build_type | --build-type)
check_build_type "$2" build_type
CMAKE_BUILD_TYPE="$2"
shift 2
;;
--pkg)
shift
;;
--pkg-type)
check_pkg_type "$2" pkg-type
PACKAGE_TYPE="$2"
shift 2
;;
--examples)
shift
ENABLE_EXAMPLES=ON
ENABLE_BENCHMARKS=ON
ENABLE_LCRGEN_TOOL=ON
;;
--enable-sign | --enable_sign)
ENABLE_SIGN=ON
shift
;;
--sign-script | --sign_script)
CUSTOM_SIGN_SCRIPT="$(realpath $2)"
shift 2
;;
--)
shift
break
;;
--cov)
ENABLE_GCOV=ON
CMAKE_BUILD_TYPE="Debug"
shift
;;
--asan)
ENABLE_ASAN=ON
CMAKE_BUILD_TYPE="Debug"
shift
;;
*)
echo "Undefined option: $1"
usage
exit 1
;;
esac
done
}
mk_dir() {
local create_dir="$1"
mkdir -pv "${create_dir}"
echo "created ${create_dir}"
}
move_pkg() {
local type="$1"
case "${type}" in
deb)
if ls *.deb 1>/dev/null 2>&1; then
mv *.deb ${OUTPUT_PATH}
else
echo "package hixl deb failed"
return 1
fi
;;
rpm)
if ls *.rpm 1>/dev/null 2>&1; then
mv *.rpm ${OUTPUT_PATH}
else
echo "package hixl rpm failed"
return 1
fi
;;
run)
if [ -f _CPack_Packages/makeself_staging/cann*.run ]; then
mv _CPack_Packages/makeself_staging/cann*.run ${OUTPUT_PATH}
else
echo "package hixl run failed"
return 1
fi
;;
esac
}
build() {
echo "create build directory and build hixl";
mk_dir "${BUILD_PATH}"
cd "${BUILD_PATH}"
cmake -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \
-D CMAKE_INSTALL_PREFIX=${OUTPUT_PATH} \
-D PACKAGE_TYPE=${PACKAGE_TYPE} \
-D ENABLE_EXAMPLES=${ENABLE_EXAMPLES} \
-D ENABLE_BENCHMARKS=${ENABLE_BENCHMARKS} \
-D ENABLE_LCRGEN_TOOL=${ENABLE_LCRGEN_TOOL} \
-D ENABLE_ASAN=${ENABLE_ASAN} \
-D ENABLE_GCOV=${ENABLE_GCOV} \
-D ENABLE_SIGN=${ENABLE_SIGN} \
-D CUSTOM_SIGN_SCRIPT=${CUSTOM_SIGN_SCRIPT} \
${CANN_3RD_LIB_PATH:+-D CANN_3RD_LIB_PATH=${CANN_3RD_LIB_PATH}} \
..
make ${VERBOSE} -j${THREAD_NUM} && make package
if [ $? -ne 0 ]
then
echo "execute command: make ${VERBOSE} -j${THREAD_NUM} && make package failed."
return 1
fi
echo "Build success!"
case "${PACKAGE_TYPE}" in
all)
local has_err=0
move_pkg deb || has_err=1
move_pkg rpm || has_err=1
move_pkg run || has_err=1
[ $has_err -eq 0 ] || return 1
;;
*)
move_pkg "${PACKAGE_TYPE}" || return 1
;;
esac
echo "hixl package success!"
}
main() {
cd "${BASEPATH}"
checkopts "$@"
g++ -v
mk_dir ${OUTPUT_PATH}
build || { echo "Build failed."; exit 1; }
echo "---------------- Build finished ----------------"
}
main "$@"