CMakeLists.txt 10.4 KB
Newer Older
J
jinhai 已提交
1
#-------------------------------------------------------------------------------
J
jinhai 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# Licensed to the Apache Software Foundation (ASF) 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.
J
jinhai 已提交
18 19
#-------------------------------------------------------------------------------

J
jinhai 已提交
20

Q
quicksilver 已提交
21
cmake_minimum_required(VERSION 3.12)
Z
zhiru 已提交
22
message(STATUS "Building using CMake version: ${CMAKE_VERSION}")
J
jinhai 已提交
23

24 25
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

Y
youny626 已提交
26
MACRO(GET_CURRENT_TIME CURRENT_TIME)
27
    execute_process(COMMAND "date" +"%Y-%m-%d %H:%M.%S" OUTPUT_VARIABLE ${CURRENT_TIME})
Y
youny626 已提交
28
ENDMACRO(GET_CURRENT_TIME)
29 30 31 32 33

GET_CURRENT_TIME(BUILD_TIME)
string(REGEX REPLACE "\n" "" BUILD_TIME ${BUILD_TIME})
message(STATUS "Build time = ${BUILD_TIME}")

34 35 36 37
if (NOT DEFINED CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build.")
endif ()

Q
quicksilver 已提交
38 39
set (GIT_BRANCH_NAME_REGEX "[0-9]+\\.[0-9]+\\.[0-9]")

Z
Zhiru Zhu 已提交
40
MACRO(GET_GIT_BRANCH_NAME GIT_BRANCH_NAME)
Q
quicksilver 已提交
41
    execute_process(COMMAND sh "-c" "git log --decorate | head -n 1 | sed 's/.*(\\(.*\\))/\\1/' | sed 's/.*, //' | sed 's=[a-zA-Z]*\/==g'"
42
            OUTPUT_VARIABLE ${GIT_BRANCH_NAME})
Q
quicksilver 已提交
43 44 45 46 47 48
    if(NOT GIT_BRANCH_NAME MATCHES "${GIT_BRANCH_NAME_REGEX}")
        execute_process(COMMAND "git" rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE ${GIT_BRANCH_NAME})
    endif ()
    if(NOT GIT_BRANCH_NAME MATCHES "${GIT_BRANCH_NAME_REGEX}")
        execute_process(COMMAND "git" symbolic-ref --short -q HEAD HEAD OUTPUT_VARIABLE ${GIT_BRANCH_NAME})
    endif ()
Z
Zhiru Zhu 已提交
49
ENDMACRO(GET_GIT_BRANCH_NAME)
50 51

GET_GIT_BRANCH_NAME(GIT_BRANCH_NAME)
S
starlord 已提交
52
message(STATUS "GIT_BRANCH_NAME = ${GIT_BRANCH_NAME}")
Z
Zhiru Zhu 已提交
53
if (NOT GIT_BRANCH_NAME STREQUAL "")
G
groot 已提交
54
    string(REGEX REPLACE "\n" "" GIT_BRANCH_NAME ${GIT_BRANCH_NAME})
Y
youny626 已提交
55
endif ()
56

Y
youny626 已提交
57
set(MILVUS_VERSION "${GIT_BRANCH_NAME}")
Q
quicksilver 已提交
58
string(REGEX MATCH "${GIT_BRANCH_NAME_REGEX}" MILVUS_VERSION "${MILVUS_VERSION}")
59

Y
youny626 已提交
60
if (CMAKE_BUILD_TYPE STREQUAL "Release")
Z
zhiru 已提交
61
    set(BUILD_TYPE "Release")
Y
youny626 已提交
62
else ()
Z
zhiru 已提交
63
    set(BUILD_TYPE "Debug")
Y
youny626 已提交
64
endif ()
65 66
message(STATUS "Build type = ${BUILD_TYPE}")

G
groot 已提交
67
project(milvus VERSION "${MILVUS_VERSION}")
Y
youny626 已提交
68
project(milvus_engine LANGUAGES CXX)
X
xj.lin 已提交
69

S
starlord 已提交
70 71 72
unset(CMAKE_EXPORT_COMPILE_COMMANDS CACHE)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

G
groot 已提交
73 74 75
set(MILVUS_VERSION_MAJOR "${milvus_VERSION_MAJOR}")
set(MILVUS_VERSION_MINOR "${milvus_VERSION_MINOR}")
set(MILVUS_VERSION_PATCH "${milvus_VERSION_PATCH}")
Z
zhiru 已提交
76

Y
youny626 已提交
77
if (MILVUS_VERSION_MAJOR STREQUAL ""
G
groot 已提交
78 79
        OR MILVUS_VERSION_MINOR STREQUAL ""
        OR MILVUS_VERSION_PATCH STREQUAL "")
G
groot 已提交
80
    message(WARNING "Failed to determine Milvus version from git branch name")
G
groot 已提交
81
    set(MILVUS_VERSION "0.6.0")
Z
zhiru 已提交
82 83
endif()

G
groot 已提交
84
message(STATUS "Build version = ${MILVUS_VERSION}")
G
groot 已提交
85
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/version.h @ONLY)
G
groot 已提交
86

G
groot 已提交
87 88 89
message(STATUS "Milvus version: "
        "${MILVUS_VERSION_MAJOR}.${MILVUS_VERSION_MINOR}.${MILVUS_VERSION_PATCH} "
        "(full: '${MILVUS_VERSION}')")
Z
zhiru 已提交
90

J
jinhai 已提交
91
set(CMAKE_CXX_STANDARD 14)
Z
zhiru 已提交
92
set(CMAKE_CXX_STANDARD_REQUIRED on)
J
jinhai 已提交
93

Y
youny626 已提交
94
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
Z
zhiru 已提交
95
    message(STATUS "Building milvus_engine on x86 architecture")
G
groot 已提交
96
    set(MILVUS_BUILD_ARCH x86_64)
Y
youny626 已提交
97
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "(ppc)")
Z
zhiru 已提交
98
    message(STATUS "Building milvus_engine on ppc architecture")
G
groot 已提交
99
    set(MILVUS_BUILD_ARCH ppc64le)
Y
youny626 已提交
100
else ()
Z
zhiru 已提交
101
    message(WARNING "Unknown processor type")
Z
zhiru 已提交
102
    message(WARNING "CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}")
G
groot 已提交
103
    set(MILVUS_BUILD_ARCH unknown)
Y
youny626 已提交
104
endif ()
J
jinhai 已提交
105

Z
zhiru 已提交
106
# Ensure that a default make is set
Y
youny626 已提交
107 108
if ("${MAKE}" STREQUAL "")
    if (NOT MSVC)
Z
zhiru 已提交
109
        find_program(MAKE make)
Y
youny626 已提交
110 111
    endif ()
endif ()
Z
zhiru 已提交
112 113

find_path(MYSQL_INCLUDE_DIR
Y
youny626 已提交
114 115
        NAMES "mysql.h"
        PATH_SUFFIXES "mysql")
Z
zhiru 已提交
116 117
if (${MYSQL_INCLUDE_DIR} STREQUAL "MYSQL_INCLUDE_DIR-NOTFOUND")
    message(FATAL_ERROR "Could not found MySQL include directory")
Y
youny626 已提交
118
else ()
Z
zhiru 已提交
119
    include_directories(${MYSQL_INCLUDE_DIR})
Y
youny626 已提交
120
endif ()
Z
zhiru 已提交
121 122 123 124

set(MILVUS_SOURCE_DIR ${PROJECT_SOURCE_DIR})
set(MILVUS_BINARY_DIR ${PROJECT_BINARY_DIR})
set(MILVUS_ENGINE_SRC ${PROJECT_SOURCE_DIR}/src)
W
wxyu 已提交
125
set(MILVUS_THIRDPARTY_SRC ${PROJECT_SOURCE_DIR}/thirdparty)
Z
zhiru 已提交
126

Z
zhiru 已提交
127 128 129 130 131
include(ExternalProject)
include(DefineOptions)
include(BuildUtils)
include(ThirdPartyPackages)

132 133 134 135 136 137 138 139 140 141 142
if (MILVUS_USE_CCACHE)
    find_program(CCACHE_FOUND ccache)
    if (CCACHE_FOUND)
        message(STATUS "Using ccache: ${CCACHE_FOUND}")
        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_FOUND})
        set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE_FOUND})
        # let ccache preserve C++ comments, because some of them may be
        # meaningful to the compiler
        set(ENV{CCACHE_COMMENTS} "1")
    endif (CCACHE_FOUND)
endif ()
143

Z
Zhiru Zhu 已提交
144 145
set(MILVUS_CPU_VERSION false)
if (MILVUS_GPU_VERSION)
Y
youny626 已提交
146 147 148 149 150
    message(STATUS "Building Milvus GPU version")
    add_compile_definitions("MILVUS_GPU_VERSION")
    enable_language(CUDA)
    find_package(CUDA 10 REQUIRED)
    set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -Xcompiler -fPIC -std=c++11 -D_FORCE_INLINES --expt-extended-lambda")
Z
Zhiru Zhu 已提交
151 152 153 154
else ()
    message(STATUS "Building Milvus CPU version")
    set(MILVUS_CPU_VERSION true)
    add_compile_definitions("MILVUS_CPU_VERSION")
Y
youny626 已提交
155 156
endif ()

157 158 159 160
if (MILVUS_WITH_PROMETHEUS)
    add_compile_definitions("MILVUS_WITH_PROMETHEUS")
endif ()

Y
youny626 已提交
161 162 163 164 165 166 167 168 169 170 171
if (CMAKE_BUILD_TYPE STREQUAL "Release")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -fPIC -DELPP_THREAD_SAFE -fopenmp")
    if (MILVUS_GPU_VERSION)
        set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -O3")
    endif ()
else ()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g -fPIC -DELPP_THREAD_SAFE -fopenmp")
    if (MILVUS_GPU_VERSION)
        set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -O0 -g")
    endif ()
endif ()
J
jinhai 已提交
172

X
update  
xiaojun.lin 已提交
173 174 175 176
if (CUSTOMIZATION)
    add_definitions(-DCUSTOMIZATION)
endif (CUSTOMIZATION)

Y
youny626 已提交
177
config_summary()
Z
zhiru 已提交
178
add_subdirectory(src)
J
jinhai 已提交
179

G
groot 已提交
180
if (BUILD_UNIT_TEST STREQUAL "ON")
Z
zhiru 已提交
181 182
    if (BUILD_COVERAGE STREQUAL "ON")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
Y
youny626 已提交
183
    endif ()
J
jinhai 已提交
184
    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/unittest)
Y
youny626 已提交
185
endif ()
Y
yu yunfeng 已提交
186

G
groot 已提交
187
add_custom_target(Clean-All COMMAND ${CMAKE_BUILD_TOOL} clean)
188

Y
youny626 已提交
189
if ("${MILVUS_DB_PATH}" STREQUAL "")
190
    set(MILVUS_DB_PATH "${CMAKE_INSTALL_PREFIX}")
Y
youny626 已提交
191
endif ()
Z
ZhifengZhang-CN 已提交
192 193 194

if (MILVUS_GPU_VERSION)
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/conf/server_gpu_config.template ${CMAKE_CURRENT_SOURCE_DIR}/conf/server_config.yaml)
195
else ()
Z
ZhifengZhang-CN 已提交
196
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/conf/server_cpu_config.template ${CMAKE_CURRENT_SOURCE_DIR}/conf/server_config.yaml)
197
endif ()
Z
ZhifengZhang-CN 已提交
198

G
groot 已提交
199 200
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/conf/log_config.template ${CMAKE_CURRENT_SOURCE_DIR}/conf/log_config.conf)

201
install(DIRECTORY scripts/
202
        DESTINATION scripts
203
        FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
204 205 206
        GROUP_EXECUTE GROUP_READ
        WORLD_EXECUTE WORLD_READ
        FILES_MATCHING PATTERN "*.sh")
207 208
install(FILES
        conf/server_config.yaml
G
groot 已提交
209
        conf/log_config.conf
210 211
        DESTINATION
        conf)
212

Y
youny626 已提交
213 214 215
find_package(Python COMPONENTS Interpreter Development)
find_package(ClangTools)
set(BUILD_SUPPORT_DIR "${CMAKE_SOURCE_DIR}/build-support")
216 217 218 219

#
# "make lint" target
#
Y
youny626 已提交
220 221 222
if (NOT MILVUS_VERBOSE_LINT)
    set(MILVUS_LINT_QUIET "--quiet")
endif ()
223

Y
youny626 已提交
224 225 226 227 228
if (NOT LINT_EXCLUSIONS_FILE)
    # source files matching a glob from a line in this file
    # will be excluded from linting (cpplint, clang-tidy, clang-format)
    set(LINT_EXCLUSIONS_FILE ${BUILD_SUPPORT_DIR}/lint_exclusions.txt)
endif ()
229

230 231 232
find_program(CPPLINT_BIN NAMES cpplint cpplint.py HINTS ${BUILD_SUPPORT_DIR})
message(STATUS "Found cpplint executable at ${CPPLINT_BIN}")

233 234 235
#
# "make lint" targets
#
236
add_custom_target(lint
Y
youny626 已提交
237 238 239 240 241 242 243 244 245
        ${PYTHON_EXECUTABLE}
        ${BUILD_SUPPORT_DIR}/run_cpplint.py
        --cpplint_binary
        ${CPPLINT_BIN}
        --exclude_globs
        ${LINT_EXCLUSIONS_FILE}
        --source_dir
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${MILVUS_LINT_QUIET})
246

247
#
248
# "make clang-format" and "make check-clang-format" targets
249
#
Y
youny626 已提交
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
if (${CLANG_FORMAT_FOUND})
    # runs clang format and updates files in place.
    add_custom_target(clang-format
            ${PYTHON_EXECUTABLE}
            ${BUILD_SUPPORT_DIR}/run_clang_format.py
            --clang_format_binary
            ${CLANG_FORMAT_BIN}
            --exclude_globs
            ${LINT_EXCLUSIONS_FILE}
            --source_dir
            ${CMAKE_CURRENT_SOURCE_DIR}/src
            --fix
            ${MILVUS_LINT_QUIET})

    # runs clang format and exits with a non-zero exit code if any files need to be reformatted
    add_custom_target(check-clang-format
            ${PYTHON_EXECUTABLE}
            ${BUILD_SUPPORT_DIR}/run_clang_format.py
            --clang_format_binary
            ${CLANG_FORMAT_BIN}
            --exclude_globs
            ${LINT_EXCLUSIONS_FILE}
            --source_dir
            ${CMAKE_CURRENT_SOURCE_DIR}/src
            ${MILVUS_LINT_QUIET})
endif ()
276

277 278 279
#
# "make clang-tidy" and "make check-clang-tidy" targets
#
Y
youny626 已提交
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
if (${CLANG_TIDY_FOUND})
    # runs clang-tidy and attempts to fix any warning automatically
    add_custom_target(clang-tidy
            ${PYTHON_EXECUTABLE}
            ${BUILD_SUPPORT_DIR}/run_clang_tidy.py
            --clang_tidy_binary
            ${CLANG_TIDY_BIN}
            --exclude_globs
            ${LINT_EXCLUSIONS_FILE}
            --compile_commands
            ${CMAKE_BINARY_DIR}/compile_commands.json
            --source_dir
            ${CMAKE_CURRENT_SOURCE_DIR}/src
            --fix
            ${MILVUS_LINT_QUIET})

    # runs clang-tidy and exits with a non-zero exit code if any errors are found.
    add_custom_target(check-clang-tidy
            ${PYTHON_EXECUTABLE}
            ${BUILD_SUPPORT_DIR}/run_clang_tidy.py
            --clang_tidy_binary
            ${CLANG_TIDY_BIN}
            --exclude_globs
            ${LINT_EXCLUSIONS_FILE}
            --compile_commands
            ${CMAKE_BINARY_DIR}/compile_commands.json
            --source_dir
            ${CMAKE_CURRENT_SOURCE_DIR}/src
            ${MILVUS_LINT_QUIET})
Q
quicksilver 已提交
309
endif ()