From 29fab296b1bdd63d7ddaee2070f7adbd8e47efa2 Mon Sep 17 00:00:00 2001 From: XuanYang-cn <51370125+XuanYang-cn@users.noreply.github.com> Date: Mon, 20 Jul 2020 15:24:00 +0800 Subject: [PATCH] Rearrange core cmakelists (#2900) * sort out cmake commands in before project Signed-off-by: yangxuan * update Signed-off-by: Xiangyu Wang * rearrange core CmakeLists.txt Signed-off-by: yangxuan * fix conflict Signed-off-by: yangxuan * fix bugs on ENABLE_FIU Signed-off-by: yangxuan Co-authored-by: yangxuan Co-authored-by: Xiangyu Wang --- core/CMakeLists.txt | 182 ++++++++---------------------------- core/cmake/BuildUtils.cmake | 27 ++++++ core/cmake/Utils.cmake | 80 ++++++++++++++++ core/src/version.h.in | 2 +- 4 files changed, 147 insertions(+), 144 deletions(-) create mode 100644 core/cmake/Utils.cmake diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index b98170fc05..906fda6da0 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -11,147 +11,51 @@ # or implied. See the License for the specific language governing permissions and limitations under the License. #------------------------------------------------------------------------------- - cmake_minimum_required(VERSION 3.12) message(STATUS "Building using CMake version: ${CMAKE_VERSION}") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +include(Utils) -# get build time -MACRO(GET_CURRENT_TIME CURRENT_TIME) - execute_process(COMMAND "date" +"%Y-%m-%d %H:%M.%S" OUTPUT_VARIABLE ${CURRENT_TIME}) -ENDMACRO(GET_CURRENT_TIME) - -GET_CURRENT_TIME(BUILD_TIME) -string(REGEX REPLACE "\n" "" BUILD_TIME ${BUILD_TIME}) +# **************************** Build time, type and code version **************************** +get_current_time(BUILD_TIME) message(STATUS "Build time = ${BUILD_TIME}") - -if (NOT DEFINED CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build.") -endif () - -# get Milvus version via branch name -set(GIT_BRANCH_NAME_REGEX "[0-9]+\\.[0-9]+\\.[0-9]") - -MACRO(GET_GIT_BRANCH_NAME GIT_BRANCH_NAME) - execute_process(COMMAND sh "-c" "git log --decorate | head -n 1 | sed 's/.*(\\(.*\\))/\\1/' | sed 's/.*, //' | sed 's=[a-zA-Z]*\/==g'" - OUTPUT_VARIABLE ${GIT_BRANCH_NAME}) - 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 () -ENDMACRO(GET_GIT_BRANCH_NAME) - -GET_GIT_BRANCH_NAME(GIT_BRANCH_NAME) -message(STATUS "GIT_BRANCH_NAME = ${GIT_BRANCH_NAME}") -if (NOT GIT_BRANCH_NAME STREQUAL "") - string(REGEX REPLACE "\n" "" GIT_BRANCH_NAME ${GIT_BRANCH_NAME}) -endif () - -set(MILVUS_VERSION "${GIT_BRANCH_NAME}") -string(REGEX MATCH "${GIT_BRANCH_NAME_REGEX}" MILVUS_VERSION "${MILVUS_VERSION}") - -# get last commit id -MACRO(GET_LAST_COMMIT_ID LAST_COMMIT_ID) - execute_process(COMMAND sh "-c" "git log --decorate | head -n 1 | awk '{print $2}'" - OUTPUT_VARIABLE ${LAST_COMMIT_ID}) -ENDMACRO(GET_LAST_COMMIT_ID) - -GET_LAST_COMMIT_ID(LAST_COMMIT_ID) -message(STATUS "LAST_COMMIT_ID = ${LAST_COMMIT_ID}") -if (NOT LAST_COMMIT_ID STREQUAL "") - string(REGEX REPLACE "\n" "" LAST_COMMIT_ID ${LAST_COMMIT_ID}) - set(LAST_COMMIT_ID "${LAST_COMMIT_ID}") -else () - set(LAST_COMMIT_ID "Unknown") -endif () - -# set build type -if (CMAKE_BUILD_TYPE STREQUAL "Release") - set(BUILD_TYPE "Release") -else () - set(BUILD_TYPE "Debug") -endif () +get_build_type(TARGET BUILD_TYPE + DEFAULT "Release") message(STATUS "Build type = ${BUILD_TYPE}") - -project(milvus VERSION "${MILVUS_VERSION}") -project(milvus_engine LANGUAGES CXX) - -unset(CMAKE_EXPORT_COMPILE_COMMANDS CACHE) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -set(MILVUS_VERSION_MAJOR "${milvus_VERSION_MAJOR}") -set(MILVUS_VERSION_MINOR "${milvus_VERSION_MINOR}") -set(MILVUS_VERSION_PATCH "${milvus_VERSION_PATCH}") - -if (MILVUS_VERSION_MAJOR STREQUAL "" - OR MILVUS_VERSION_MINOR STREQUAL "" - OR MILVUS_VERSION_PATCH STREQUAL "") - message(WARNING "Failed to determine Milvus version from git branch name") - set(MILVUS_VERSION "0.10.0") -endif () - +get_milvus_version(TARGET MILVUS_VERSION + DEFAULT "0.10.0") message(STATUS "Build version = ${MILVUS_VERSION}") +get_last_commit_id(LAST_COMMIT_ID) +message(STATUS "LAST_COMMIT_ID = ${LAST_COMMIT_ID}") + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/version.h @ONLY) -message(STATUS "Milvus version: " - "${MILVUS_VERSION_MAJOR}.${MILVUS_VERSION_MINOR}.${MILVUS_VERSION_PATCH} " - "(full: '${MILVUS_VERSION}')") +# unset(CMAKE_EXPORT_COMPILE_COMMANDS CACHE) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +# **************************** Project **************************** +project(milvus VERSION "${MILVUS_VERSION}") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED on) -if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") - message(STATUS "Building milvus_engine on x86 architecture") - set(MILVUS_BUILD_ARCH x86_64) -elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "(ppc)") - message(STATUS "Building milvus_engine on ppc architecture") - set(MILVUS_BUILD_ARCH ppc64le) -else () - message(WARNING "Unknown processor type") - message(WARNING "CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}") - set(MILVUS_BUILD_ARCH unknown) -endif () - -# Ensure that a default make is set -if ("${MAKE}" STREQUAL "") - if (NOT MSVC) - find_program(MAKE make) - endif () -endif () - -find_path(MYSQL_INCLUDE_DIR - NAMES "mysql.h" - PATH_SUFFIXES "mysql") -if (${MYSQL_INCLUDE_DIR} STREQUAL "MYSQL_INCLUDE_DIR-NOTFOUND") - message(FATAL_ERROR "Could not found MySQL include directory") -else () - include_directories(${MYSQL_INCLUDE_DIR}) -endif () - set(MILVUS_SOURCE_DIR ${PROJECT_SOURCE_DIR}) set(MILVUS_BINARY_DIR ${PROJECT_BINARY_DIR}) set(MILVUS_ENGINE_SRC ${PROJECT_SOURCE_DIR}/src) set(MILVUS_THIRDPARTY_SRC ${PROJECT_SOURCE_DIR}/thirdparty) +# **************************** Dependencies **************************** +include(BuildUtils) +import_mysql_inc() + include(ExternalProject) include(DefineOptions) -include(BuildUtils) include(ThirdPartyPackages) -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 () +using_ccache_if_defined(MILVUS_USE_CCACHE) + +# **************************** Compiler arguments **************************** if (MILVUS_GPU_VERSION) message(STATUS "Building Milvus GPU version") @@ -163,32 +67,23 @@ else () message(STATUS "Building Milvus CPU version") endif () -if (MILVUS_WITH_PROMETHEUS) - add_compile_definitions("MILVUS_WITH_PROMETHEUS") -endif () +set_milvus_definition(MILVUS_WITH_PROMETHEUS "MILVUS_WITH_PROMETHEUS") +set_milvus_definition(ENABLE_CPU_PROFILING "ENABLE_CPU_PROFILING") +set_milvus_definition(MILVUS_WITH_FIU "FIU_ENABLE") -message("ENABLE_CPU_PROFILING = ${ENABLE_CPU_PROFILING}") -if (ENABLE_CPU_PROFILING STREQUAL "ON") - ADD_DEFINITIONS(-DENABLE_CPU_PROFILING) -endif() - -if (MILVUS_WITH_FIU) - add_compile_definitions("FIU_ENABLE") -endif () +config_summary() 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(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -O3") +elseif (CMAKE_BUILD_TYPE STREQUAL "Debug") 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 () + set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -O0 -g") +else () + message(FATAL_ERROR "Unknown CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") endif () -config_summary() +# **************************** Source files **************************** add_subdirectory(src) if (BUILD_UNIT_TEST STREQUAL "ON") @@ -201,21 +96,20 @@ endif () add_custom_target(Clean-All COMMAND ${CMAKE_BUILD_TOOL} clean) +# **************************** Install **************************** + if ("${MILVUS_DB_PATH}" STREQUAL "") set(MILVUS_DB_PATH "${CMAKE_INSTALL_PREFIX}") endif () if (MILVUS_GPU_VERSION) set(GPU_ENABLE "true") - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/conf/server_config.template - ${CMAKE_CURRENT_SOURCE_DIR}/conf/server_config.yaml - @ONLY) else () set(GPU_ENABLE "false") - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/conf/server_config.template - ${CMAKE_CURRENT_SOURCE_DIR}/conf/server_config.yaml - @ONLY) endif () +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/conf/server_config.template + ${CMAKE_CURRENT_SOURCE_DIR}/conf/server_config.yaml + @ONLY) install(DIRECTORY scripts/ DESTINATION scripts @@ -233,6 +127,8 @@ install(FILES DESTINATION conf) + +# **************************** Coding style check tools **************************** find_package(Python COMPONENTS Interpreter Development) find_package(ClangTools) set(BUILD_SUPPORT_DIR "${CMAKE_SOURCE_DIR}/build-support") diff --git a/core/cmake/BuildUtils.cmake b/core/cmake/BuildUtils.cmake index 6332d29d74..a739ce243d 100644 --- a/core/cmake/BuildUtils.cmake +++ b/core/cmake/BuildUtils.cmake @@ -202,3 +202,30 @@ function(ADD_THIRDPARTY_LIB LIB_NAME) message(FATAL_ERROR "No static or shared library provided for ${LIB_NAME}") endif() endfunction() + +MACRO (import_mysql_inc) + find_path (MYSQL_INCLUDE_DIR + NAMES "mysql.h" + PATH_SUFFIXES "mysql") + + if (${MYSQL_INCLUDE_DIR} STREQUAL "MYSQL_INCLUDE_DIR-NOTFOUND") + message(FATAL_ERROR "Could not found MySQL include directory") + else () + include_directories(${MYSQL_INCLUDE_DIR}) + endif () +ENDMACRO (import_mysql_inc) + +MACRO(using_ccache_if_defined MILVUS_USE_CCACHE) + 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 () +ENDMACRO(using_ccache_if_defined) + diff --git a/core/cmake/Utils.cmake b/core/cmake/Utils.cmake new file mode 100644 index 0000000000..98deaa2076 --- /dev/null +++ b/core/cmake/Utils.cmake @@ -0,0 +1,80 @@ +# get build time +MACRO(get_current_time CURRENT_TIME) + execute_process(COMMAND "date" "+%Y-%m-%d %H:%M.%S" OUTPUT_VARIABLE ${CURRENT_TIME}) + string(REGEX REPLACE "\n" "" ${CURRENT_TIME} ${${CURRENT_TIME}}) +ENDMACRO(get_current_time) + +# get build type +MACRO(get_build_type) + cmake_parse_arguments(BUILD_TYPE "" "TARGET;DEFAULT" "" ${ARGN}) + if (NOT DEFINED CMAKE_BUILD_TYPE) + set(${BUILD_TYPE_TARGET} ${BUILD_TYPE_DEFAULT}) + elseif (CMAKE_BUILD_TYPE STREQUAL "Release") + set(${BUILD_TYPE_TARGET} "Release") + elseif (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(${BUILD_TYPE_TARGET} "Debug") + else () + set(${BUILD_TYPE_TARGET} ${BUILD_TYPE_DEFAULT}) + endif () +ENDMACRO(get_build_type) + +# get git branch name +MACRO(get_git_branch_name GIT_BRANCH_NAME) + set(GIT_BRANCH_NAME_REGEX "[0-9]+\\.[0-9]+\\.[0-9]") + + execute_process(COMMAND sh "-c" "git log --decorate | head -n 1 | sed 's/.*(\\(.*\\))/\\1/' | sed 's/.*, //' | sed 's=[a-zA-Z]*\/==g'" + OUTPUT_VARIABLE ${GIT_BRANCH_NAME}) + + 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 -q --short HEAD OUTPUT_VARIABLE ${GIT_BRANCH_NAME}) + endif () + + message(DEBUG "GIT_BRANCH_NAME = ${GIT_BRANCH_NAME}") + + # Some unexpected case + if (NOT GIT_BRANCH_NAME STREQUAL "") + string(REGEX REPLACE "\n" "" GIT_BRANCH_NAME ${GIT_BRANCH_NAME}) + else () + set(GIT_BRANCH_NAME "#") + endif () +ENDMACRO(get_git_branch_name) + +# get last commit id +MACRO(get_last_commit_id LAST_COMMIT_ID) + execute_process(COMMAND sh "-c" "git log --decorate | head -n 1 | awk '{print $2}'" + OUTPUT_VARIABLE ${LAST_COMMIT_ID}) + + message(DEBUG "LAST_COMMIT_ID = ${${LAST_COMMIT_ID}}") + + if (NOT LAST_COMMIT_ID STREQUAL "") + string(REGEX REPLACE "\n" "" ${LAST_COMMIT_ID} ${${LAST_COMMIT_ID}}) + else () + set(LAST_COMMIT_ID "Unknown") + endif () +ENDMACRO(get_last_commit_id) + +# get milvus version +MACRO(get_milvus_version) + cmake_parse_arguments(VER "" "TARGET;DEFAULT" "" ${ARGN}) + + # Step 1: get branch name + get_git_branch_name(GIT_BRANCH_NAME) + message(DEBUG ${GIT_BRANCH_NAME}) + + # Step 2: match MAJOR.MINOR.PATCH format or set DEFAULT value + string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" ${VER_TARGET} ${GIT_BRANCH_NAME}) + if (NOT ${VER_TARGET}) + set(${VER_TARGET} ${VER_DEFAULT}) + endif() +ENDMACRO(get_milvus_version) + +# set definition +MACRO(set_milvus_definition DEF_PASS_CMAKE MILVUS_DEF) + if (${${DEF_PASS_CMAKE}}) + add_compile_definitions(${MILVUS_DEF}) + endif() +ENDMACRO(set_milvus_definition) diff --git a/core/src/version.h.in b/core/src/version.h.in index 32c30fbe45..0f0b3c1edf 100644 --- a/core/src/version.h.in +++ b/core/src/version.h.in @@ -11,5 +11,5 @@ #cmakedefine MILVUS_VERSION "@MILVUS_VERSION@" #cmakedefine BUILD_TYPE "@BUILD_TYPE@" -#cmakedefine BUILD_TIME @BUILD_TIME@ +#cmakedefine BUILD_TIME "@BUILD_TIME@" #cmakedefine LAST_COMMIT_ID "@LAST_COMMIT_ID@"