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
2023-05-12 14:11:20 +08:00
function get_cpu_arch {
local CPU_ARCH = $1
local OS
OS = $( uname)
local MACHINE
MACHINE = $( uname -m)
ADDITIONAL_FLAGS = ""
if [ -z " $CPU_ARCH " ] ; then
if [ " $OS " = "Darwin" ] ; then
if [ " $MACHINE " = "x86_64" ] ; then
local CPU_CAPABILITIES
CPU_CAPABILITIES = $( sysctl -a | grep machdep.cpu.features | awk '{print tolower($0)}' )
if [ [ $CPU_CAPABILITIES = ~ "avx" ] ] ; then
CPU_ARCH = "avx"
else
CPU_ARCH = "sse"
fi
elif [ [ $( sysctl -a | grep machdep.cpu.brand_string) = ~ "Apple" ] ] ; then
# Apple silicon.
CPU_ARCH = "arm64"
fi
else [ " $OS " = "Linux" ] ;
local CPU_CAPABILITIES
CPU_CAPABILITIES = $( cat /proc/cpuinfo | grep flags | head -n 1| awk '{print tolower($0)}' )
if [ [ " $CPU_CAPABILITIES " = ~ "avx" ] ] ; then
CPU_ARCH = "avx"
elif [ [ " $CPU_CAPABILITIES " = ~ "sse" ] ] ; then
CPU_ARCH = "sse"
elif [ " $MACHINE " = "aarch64" ] ; then
CPU_ARCH = "aarch64"
fi
fi
fi
echo -n $CPU_ARCH
}
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
BUILD_COVERAGE = "OFF"
RUN_CPPLINT = "OFF"
CUDA_COMPILER = /usr/local/cuda/bin/nvcc
GPU_VERSION = "OFF" #defaults to CPU version
CUDA_ARCH = "DEFAULT"
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"
2023-12-18 12:04:42 +08:00
USE_DYNAMIC_SIMD = "ON"
2023-09-22 09:59:26 +08:00
INDEX_ENGINE = "KNOWHERE"
2020-09-21 10:32:20 +08:00
2023-09-22 09:59:26 +08:00
while getopts "p:d:t:s:f:n:i:y:a:x:ulrcghzmebZ" arg; do
2020-09-21 10:32:20 +08:00
case $arg in
p)
INSTALL_PREFIX = $OPTARG
; ;
t)
BUILD_TYPE = $OPTARG # BUILD_TYPE
; ;
u)
echo "Build and run unittest cases"
BUILD_UNITTEST = "ON"
; ;
l)
RUN_CPPLINT = "ON"
; ;
c)
BUILD_COVERAGE = "ON"
; ;
g)
GPU_VERSION = "ON"
; ;
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
2023-10-11 20:45:35 +08:00
if [ [ ${ ENV_VAL } = = 'ON' ] ] ; then
2023-01-19 13:43:44 +08:00
echo "Set USE_ASAN to ON"
USE_ASAN = "ON"
BUILD_TYPE = Debug
fi
2022-12-29 15:29:31 +08:00
; ;
2023-07-13 16:22:30 +08:00
y)
USE_DYNAMIC_SIMD = $OPTARG
; ;
2023-09-19 10:01:23 +08:00
Z)
BUILD_WITHOUT_AZURE = "on"
; ;
2023-09-22 09:59:26 +08:00
x)
INDEX_ENGINE = $OPTARG
; ;
2020-09-21 10:32:20 +08:00
h) # help
echo "
parameter:
-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)
-c: code coverage( 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 )
2023-09-19 10:01:23 +08:00
-Z: build milvus without azure-sdk-for-cpp, so cannot use azure blob
2020-09-21 10:32:20 +08:00
-h: help
usage:
2023-10-11 20:45:35 +08:00
./core_build.sh -p \$ { INSTALL_PREFIX} -t \$ { BUILD_TYPE} -s \$ { CUDA_ARCH} [ -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
2023-09-19 10:01:23 +08:00
if [ -z " $BUILD_WITHOUT_AZURE " ] ; then
AZURE_BUILD_DIR = " ${ ROOT_DIR } /cmake_build/azure "
if [ ! -d ${ AZURE_BUILD_DIR } ] ; then
mkdir -p ${ AZURE_BUILD_DIR }
fi
pushd ${ AZURE_BUILD_DIR }
2023-11-08 17:50:18 +08:00
env bash ${ ROOT_DIR } /scripts/azure_build.sh -p ${ INSTALL_PREFIX } -s ${ ROOT_DIR } /internal/core/src/storage/azure-blob-storage -t ${ BUILD_UNITTEST }
2023-10-11 11:51:32 +08:00
if [ ! -e libblob-chunk-manager* ] ; then
2023-12-31 20:02:48 +08:00
echo "build blob-chunk-manager fail..."
2023-10-11 11:51:32 +08:00
cat vcpkg-bootstrap.log
exit 1
fi
2023-12-31 20:02:48 +08:00
if [ ! -e ${ INSTALL_PREFIX } /lib/libblob-chunk-manager* ] ; then
echo "install blob-chunk-manager fail..."
exit 1
fi
2023-09-19 10:01:23 +08:00
popd
SYSTEM_NAME = $( uname -s)
if [ [ ${ SYSTEM_NAME } = = "Darwin" ] ] ; then
SYSTEM_NAME = "osx"
elif [ [ ${ SYSTEM_NAME } = = "Linux" ] ] ; then
SYSTEM_NAME = "linux"
fi
ARCHITECTURE = $( uname -m)
if [ [ ${ ARCHITECTURE } = = "x86_64" ] ] ; then
ARCHITECTURE = "x64"
2023-10-11 17:27:33 +08:00
elif [ [ ${ ARCHITECTURE } = = "aarch64" ] ] ; then
ARCHITECTURE = "arm64"
2023-09-19 10:01:23 +08:00
fi
VCPKG_TARGET_TRIPLET = ${ ARCHITECTURE } -${ SYSTEM_NAME }
fi
2020-09-21 10:32:20 +08:00
if [ [ ! -d ${ BUILD_OUTPUT_DIR } ] ] ; then
mkdir ${ BUILD_OUTPUT_DIR }
fi
2023-04-21 14:16:33 +08:00
source ${ ROOT_DIR } /scripts/setenv.sh
2020-09-21 10:32:20 +08:00
2022-03-17 17:17:22 +08:00
CMAKE_GENERATOR = "Unix Makefiles"
2023-10-12 19:25:35 +08:00
# UBUNTU system build diskann index
if [ " $OS_NAME " = = "ubuntu20.04" ] ; then
2022-09-21 20:16:51 +08:00
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
2023-05-12 14:11:20 +08:00
CPU_ARCH = $( get_cpu_arch $CPU_TARGET )
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 } \
-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_GPU_VERSION= ${ GPU_VERSION } \
-DMILVUS_CUDA_ARCH= ${ CUDA_ARCH } \
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 } \
2023-09-22 09:59:26 +08:00
-DUSE_DYNAMIC_SIMD= ${ USE_DYNAMIC_SIMD } \
-DCPU_ARCH= ${ CPU_ARCH } \
-DINDEX_ENGINE= ${ INDEX_ENGINE } "
2023-09-19 10:01:23 +08:00
if [ -z " $BUILD_WITHOUT_AZURE " ] ; then
CMAKE_CMD = ${ CMAKE_CMD } " -DAZURE_BUILD_DIR= ${ AZURE_BUILD_DIR } \
-DVCPKG_TARGET_TRIPLET= ${ VCPKG_TARGET_TRIPLET } "
fi
CMAKE_CMD = ${ CMAKE_CMD } " ${ CPP_SRC_DIR } "
2022-03-17 17:17:22 +08:00
2023-04-21 14:16:33 +08:00
echo " CC $CC "
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
2023-04-19 16:52:30 +08:00
if command -v ccache & > /dev/null
2022-05-30 14:54:02 +08:00
then
2023-04-19 16:52:30 +08:00
ccache -s
2022-05-30 14:54:02 +08:00
fi
2020-10-15 21:31:50 +08:00
popd