2020-09-21 10:32:20 +08:00
#!/bin/bash
# Compile jobs variable; Usage: $ jobs=12 ./build.sh ...
if [ [ ! ${ jobs +1 } ] ] ; then
2021-10-08 20:48:56 +08:00
if command -v nproc & > /dev/null
# For linux
then
jobs = $( nproc)
elif command -v sysctl & > /dev/null
# For macOS
then
jobs = $( sysctl -n hw.logicalcpu)
else
jobs = 4
fi
2020-09-21 10:32:20 +08:00
fi
2020-10-27 15:51:16 +08:00
SOURCE = " ${ BASH_SOURCE [0] } "
while [ -h " $SOURCE " ] ; do # resolve $SOURCE until the file is no longer a symlink
DIR = " $( cd -P " $( dirname " $SOURCE " ) " && pwd ) "
SOURCE = " $( readlink " $SOURCE " ) "
[ [ $SOURCE != /* ] ] && SOURCE = " $DIR / $SOURCE " # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
SCRIPTS_DIR = " $( cd -P " $( dirname " $SOURCE " ) " && pwd ) "
2020-11-04 16:28:14 +08:00
BUILD_OUTPUT_DIR = " ${ SCRIPTS_DIR } /../../cmake_build "
2020-09-21 10:32:20 +08:00
BUILD_TYPE = "Release"
BUILD_UNITTEST = "OFF"
2020-11-04 16:28:14 +08:00
INSTALL_PREFIX = " ${ SCRIPTS_DIR } /output "
2020-09-21 10:32:20 +08:00
MAKE_CLEAN = "OFF"
BUILD_COVERAGE = "OFF"
DB_PATH = "/tmp/milvus"
PROFILING = "OFF"
RUN_CPPLINT = "OFF"
CUDA_COMPILER = /usr/local/cuda/bin/nvcc
GPU_VERSION = "OFF" #defaults to CPU version
WITH_PROMETHEUS = "ON"
CUDA_ARCH = "DEFAULT"
CUSTOM_THIRDPARTY_PATH = ""
2020-10-23 18:01:24 +08:00
while getopts "p:d:t:s:f:o:ulrcghzme" arg; do
2020-09-21 10:32:20 +08:00
case $arg in
f)
CUSTOM_THIRDPARTY_PATH = $OPTARG
; ;
p)
INSTALL_PREFIX = $OPTARG
; ;
2020-10-23 18:01:24 +08:00
o)
BUILD_OUTPUT_DIR = $OPTARG
; ;
2020-09-21 10:32:20 +08:00
d)
DB_PATH = $OPTARG
; ;
t)
BUILD_TYPE = $OPTARG # BUILD_TYPE
; ;
u)
echo "Build and run unittest cases"
BUILD_UNITTEST = "ON"
; ;
l)
RUN_CPPLINT = "ON"
; ;
r)
if [ [ -d ${ BUILD_OUTPUT_DIR } ] ] ; then
MAKE_CLEAN = "ON"
fi
; ;
c)
BUILD_COVERAGE = "ON"
; ;
z)
PROFILING = "ON"
; ;
g)
GPU_VERSION = "ON"
; ;
e)
WITH_PROMETHEUS = "OFF"
; ;
s)
CUDA_ARCH = $OPTARG
; ;
h) # help
echo "
parameter:
-f: custom paths of thirdparty downloaded files( default: NULL)
-p: install prefix( default: $( pwd ) /milvus)
-d: db data path( default: /tmp/milvus)
-t: build type( default: Debug)
-u: building unit test options( default: OFF)
-l: run cpplint, clang-format and clang-tidy( default: OFF)
-r: remove previous build directory( default: OFF)
-c: code coverage( default: OFF)
-z: profiling( default: OFF)
-g: build GPU version( default: OFF)
-e: build without prometheus( default: OFF)
-s: build with CUDA arch( default:DEFAULT) , for example '-gencode=compute_61,code=sm_61;-gencode=compute_75,code=sm_75'
-h: help
usage:
./build.sh -p \$ { INSTALL_PREFIX} -t \$ { BUILD_TYPE} -s \$ { CUDA_ARCH} -f\$ { CUSTOM_THIRDPARTY_PATH} [ -u] [ -l] [ -r] [ -c] [ -z] [ -g] [ -m] [ -e] [ -h]
"
exit 0
; ;
?)
echo "ERROR! unknown argument"
exit 1
; ;
esac
done
if [ [ ! -d ${ BUILD_OUTPUT_DIR } ] ] ; then
mkdir ${ BUILD_OUTPUT_DIR }
fi
cd ${ BUILD_OUTPUT_DIR }
# remove make cache since build.sh -l use default variables
# force update the variables each time
make rebuild_cache >/dev/null 2>& 1
if [ [ ${ MAKE_CLEAN } = = "ON" ] ] ; then
echo " Runing make clean in ${ BUILD_OUTPUT_DIR } ... "
make clean
exit 0
fi
CMAKE_CMD = " cmake \
-DBUILD_UNIT_TEST= ${ BUILD_UNITTEST } \
-DCMAKE_INSTALL_PREFIX= ${ INSTALL_PREFIX }
-DCMAKE_BUILD_TYPE= ${ BUILD_TYPE } \
-DOpenBLAS_SOURCE= AUTO \
-DCMAKE_CUDA_COMPILER= ${ CUDA_COMPILER } \
-DBUILD_COVERAGE= ${ BUILD_COVERAGE } \
-DMILVUS_DB_PATH= ${ DB_PATH } \
-DENABLE_CPU_PROFILING= ${ PROFILING } \
-DMILVUS_GPU_VERSION= ${ GPU_VERSION } \
-DMILVUS_WITH_PROMETHEUS= ${ WITH_PROMETHEUS } \
-DMILVUS_CUDA_ARCH= ${ CUDA_ARCH } \
-DCUSTOM_THIRDPARTY_DOWNLOAD_PATH= ${ CUSTOM_THIRDPARTY_PATH } \
2020-11-04 16:28:14 +08:00
${ SCRIPTS_DIR } "
2020-09-21 10:32:20 +08:00
echo ${ CMAKE_CMD }
${ CMAKE_CMD }
if [ [ ${ RUN_CPPLINT } = = "ON" ] ] ; then
# cpplint check
make lint
if [ $? -ne 0 ] ; then
echo "ERROR! cpplint check failed"
exit 1
fi
echo "cpplint check passed!"
# clang-format check
make check-clang-format
if [ $? -ne 0 ] ; then
echo "ERROR! clang-format check failed"
exit 1
fi
echo "clang-format check passed!"
# clang-tidy check
make check-clang-tidy
if [ $? -ne 0 ] ; then
echo "ERROR! clang-tidy check failed"
exit 1
fi
echo "clang-tidy check passed!"
else
# compile and build
make -j ${ jobs } install || exit 1
fi