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
2022-11-23 10:39:11 +08:00
ROOT_DIR = " $( cd -P " $( dirname " $SOURCE " ) /.. " && pwd ) "
2020-10-15 21:31:50 +08:00
2022-11-23 10:39:11 +08:00
CPP_SRC_DIR = " ${ ROOT_DIR } /internal/core "
2020-10-15 21:31:50 +08:00
2022-11-23 10:39:11 +08:00
BUILD_OUTPUT_DIR = " ${ ROOT_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 = ""
2022-03-01 10:15:55 +08:00
EMBEDDED_MILVUS = "OFF"
2022-09-21 20:16:51 +08:00
BUILD_DISK_ANN = "OFF"
2022-12-29 15:29:31 +08:00
USE_ASAN = "OFF"
2020-09-21 10:32:20 +08:00
2023-01-19 13:43:44 +08:00
while getopts "p:d:t:s:f:n:a:ulrcghzmeb" arg; do
2020-09-21 10:32:20 +08:00
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
; ;
2022-03-01 10:15:55 +08:00
b)
2022-03-16 16:51:22 +08:00
EMBEDDED_MILVUS = "ON"
2022-03-01 10:15:55 +08:00
; ;
2022-09-21 20:16:51 +08:00
n)
2022-09-29 11:08:54 +08:00
BUILD_DISK_ANN = $OPTARG
2022-09-21 20:16:51 +08:00
; ;
2022-12-29 15:29:31 +08:00
a)
2023-01-19 13:43:44 +08:00
ENV_VAL = $OPTARG
if [ [ ${ ENV_VAL } = = 'true' ] ] ; then
echo "Set USE_ASAN to ON"
USE_ASAN = "ON"
BUILD_TYPE = Debug
fi
2022-12-29 15:29:31 +08:00
; ;
2020-09-21 10:32:20 +08:00
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'
2022-03-01 10:15:55 +08:00
-b: build embedded milvus( default: OFF)
2023-01-19 13:43:44 +08:00
-a: build milvus with AddressSanitizer( default: false )
2020-09-21 10:32:20 +08:00
-h: help
usage:
2022-03-01 10:15:55 +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] [ -b]
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
2022-03-17 17:17:22 +08:00
CMAKE_GENERATOR = "Unix Makefiles"
# MSYS system
if [ " $MSYSTEM " = = "MINGW64" ] ; then
BUILD_COVERAGE = OFF
PROFILING = OFF
GPU_VERSION = OFF
WITH_PROMETHEUS = OFF
CUDA_ARCH = OFF
# extra default cmake args for msys
CMAKE_GENERATOR = "MSYS Makefiles"
# clang tools path
export CLANG_TOOLS_PATH = /mingw64/bin
# using system blas
export OpenBLAS_HOME = " $( cygpath -w /mingw64) "
fi
2022-09-21 20:16:51 +08:00
# UBUNTU system build diskann index
if [ " $OS_NAME " = = "ubuntu20.04" ] ; then
BUILD_DISK_ANN = ON
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
2023-02-16 17:26:35 +08:00
export CONAN_REVISIONS_ENABLED = 1
conan remote add default-conan-local https://milvus01.jfrog.io/artifactory/api/conan/default-conan-local
2022-02-09 14:27:46 +08:00
unameOut = " $( uname -s) "
case " ${ unameOut } " in
2022-11-23 10:39:11 +08:00
Darwin*)
2023-03-29 10:10:01 +08:00
# detect llvm version by valid list
for llvm_version in 15 14 NOT_FOUND ; do
if brew ls --versions llvm@${ llvm_version } > /dev/null; then
break
fi
done
if [ " ${ llvm_version } " = "NOT_FOUND" ] ; then
echo "valid llvm(14 or 15) not installed"
exit 1
fi
llvm_prefix = " $( brew --prefix llvm@${ llvm_version } ) "
2022-11-23 10:39:11 +08:00
export CLANG_TOOLS_PATH = " ${ llvm_prefix } /bin "
2023-04-14 17:56:29 +08:00
export CC = " ccache ${ llvm_prefix } /bin/clang "
export CXX = " ccache ${ llvm_prefix } /bin/clang++ "
export ASM = " ${ llvm_prefix } /bin/clang "
2023-03-29 10:10:01 +08:00
export CFLAGS = " -Wno-deprecated-declarations -I $( brew --prefix libomp) /include "
export CXXFLAGS = ${ CFLAGS }
export LDFLAGS = " -L $( brew --prefix libomp) /lib "
conan install ${ CPP_SRC_DIR } --install-folder conan --build= missing -s compiler = clang -s compiler.version= ${ llvm_version } -s compiler.libcxx= libc++ -s compiler.cppstd= 17 || { echo 'conan install failed' ; exit 1; }
2022-11-23 10:39:11 +08:00
; ;
Linux*)
2023-02-16 17:26:35 +08:00
echo " Running on ${ OS_NAME } "
export CPU_TARGET = avx
GCC_VERSION = ` gcc -dumpversion`
2022-11-23 10:39:11 +08:00
if [ [ ` gcc -v 2>& 1 | sed -n 's/.*\(--with-default-libstdcxx-abi\)=\(\w*\).*/\2/p' ` = = "gcc4" ] ] ; then
2023-02-16 17:26:35 +08:00
conan install ${ CPP_SRC_DIR } --install-folder conan --build= missing -s compiler.version= ${ GCC_VERSION } || { echo 'conan install failed' ; exit 1; }
2023-04-14 17:56:29 +08:00
else
2023-02-16 17:26:35 +08:00
conan install ${ CPP_SRC_DIR } --install-folder conan --build= missing -s compiler.version= ${ GCC_VERSION } -s compiler.libcxx= libstdc++11 || { echo 'conan install failed' ; exit 1; }
2023-04-14 17:56:29 +08:00
fi
2022-11-23 10:39:11 +08:00
; ;
2023-04-14 17:56:29 +08:00
*)
2022-12-19 15:05:24 +08:00
echo "Cannot build on windows"
2022-11-23 10:39:11 +08:00
; ;
esac
2022-02-09 14:27:46 +08:00
2023-02-16 17:26:35 +08:00
arch = $( uname -m)
2020-09-21 10:32:20 +08:00
CMAKE_CMD = " cmake \
2022-03-17 17:17:22 +08:00
${ CMAKE_EXTRA_ARGS } \
2020-09-21 10:32:20 +08:00
-DBUILD_UNIT_TEST= ${ BUILD_UNITTEST } \
-DCMAKE_INSTALL_PREFIX= ${ INSTALL_PREFIX }
-DCMAKE_BUILD_TYPE= ${ BUILD_TYPE } \
-DOpenBLAS_SOURCE= AUTO \
-DCMAKE_CUDA_COMPILER= ${ CUDA_COMPILER } \
2023-02-16 17:26:35 +08:00
-DCMAKE_LIBRARY_ARCHITECTURE= ${ arch } \
2020-09-21 10:32:20 +08:00
-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 } \
2022-03-01 10:15:55 +08:00
-DEMBEDDED_MILVUS= ${ EMBEDDED_MILVUS } \
2022-09-21 20:16:51 +08:00
-DBUILD_DISK_ANN= ${ BUILD_DISK_ANN } \
2022-12-29 15:29:31 +08:00
-DUSE_ASAN= ${ USE_ASAN } \
2020-10-15 21:31:50 +08:00
${ CPP_SRC_DIR } "
2022-03-17 17:17:22 +08:00
2020-09-21 10:32:20 +08:00
echo ${ CMAKE_CMD }
2022-03-17 17:17:22 +08:00
${ CMAKE_CMD } -G " ${ CMAKE_GENERATOR } "
2020-09-21 10:32:20 +08:00
2022-05-30 14:54:02 +08:00
set
2020-09-21 10:32:20 +08:00
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!"
else
# compile and build
make -j ${ jobs } install || exit 1
fi
2020-10-15 21:31:50 +08:00
2022-05-30 14:54:02 +08:00
if command -v ccache & > /dev/null
then
ccache -s
fi
2020-10-15 21:31:50 +08:00
popd