2020-10-15 21:31:50 +08:00
#!/usr/bin/env bash
2020-09-21 10:32:20 +08:00
2021-10-09 18:01:27 +08:00
# Licensed to the LF AI & Data foundation under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
2020-10-15 21:31:50 +08:00
# Compile jobs variable; Usage: $ jobs=12 ./core_build.sh ...
2020-09-21 10:32:20 +08:00
if [ [ ! ${ jobs +1 } ] ] ; then
2021-09-22 17:09:53 +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-15 21:31:50 +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-10-24 11:36:42 +08:00
CPP_SRC_DIR = " ${ SCRIPTS_DIR } /../internal/core "
2020-10-15 21:31:50 +08:00
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-10-27 15:51:16 +08:00
INSTALL_PREFIX = " ${ CPP_SRC_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 = ""
while getopts "p:d:t:s:f:ulrcghzme" arg; do
case $arg in
f)
CUSTOM_THIRDPARTY_PATH = $OPTARG
; ;
p)
INSTALL_PREFIX = $OPTARG
; ;
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:
2020-10-15 21:31:50 +08:00
./core_build.sh -p \$ { INSTALL_PREFIX} -t \$ { BUILD_TYPE} -s \$ { CUDA_ARCH} -f\$ { CUSTOM_THIRDPARTY_PATH} [ -u] [ -l] [ -r] [ -c] [ -z] [ -g] [ -m] [ -e] [ -h]
2020-09-21 10:32:20 +08:00
"
exit 0
; ;
?)
echo "ERROR! unknown argument"
exit 1
; ;
esac
done
if [ [ ! -d ${ BUILD_OUTPUT_DIR } ] ] ; then
mkdir ${ BUILD_OUTPUT_DIR }
fi
2020-10-15 21:31:50 +08:00
pushd ${ BUILD_OUTPUT_DIR }
2020-09-21 10:32:20 +08:00
2022-01-04 19:13:45 +08:00
# Remove make cache since build.sh -l use default variables
# Force update the variables each time
2020-09-21 10:32:20 +08:00
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-10-15 21:31:50 +08:00
${ CPP_SRC_DIR } "
2020-09-21 10:32:20 +08:00
echo ${ CMAKE_CMD }
${ CMAKE_CMD }
if [ [ ${ RUN_CPPLINT } = = "ON" ] ] ; then
# cpplint check
2020-11-25 16:24:57 +08:00
make lint
2020-09-21 10:32:20 +08:00
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
2020-11-24 16:12:39 +08:00
# make check-clang-tidy || true
# if [ $? -ne 0 ]; then
# echo "ERROR! clang-tidy check failed"
# exit 1
# fi
# echo "clang-tidy check passed!"
2020-09-21 10:32:20 +08:00
else
# compile and build
make -j ${ jobs } install || exit 1
fi
2020-10-15 21:31:50 +08:00
popd