-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathCMakeLists.txt
172 lines (135 loc) · 5.85 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
cmake_minimum_required(VERSION 3.12)
project(euclidesdb CXX)
# ----[ Project versioning
set(EUCLIDESDB_VERSION_MAJOR 0)
set(EUCLIDESDB_VERSION_MINOR 3)
set(EUCLIDESDB_VERSION_PATCH 0)
set(EUCLIDESDB_VERSION_STRING ${EUCLIDESDB_VERSION_MAJOR}.${EUCLIDESDB_VERSION_MINOR}.${EUCLIDESDB_VERSION_PATCH})
# ----[ C++11 requirements, no gnu++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_COLOR_MAKEFILE ON)
Include(FindProtobuf)
include(ExternalProject)
# ----[ libtorch should be a symbolic link inside the building
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
list(APPEND CMAKE_PREFIX_PATH ./libtorch)
include(TargetCopyFiles)
# ----[ Requirements
find_package(OpenMP)
find_package(Protobuf REQUIRED)
find_package(GRPC REQUIRED)
find_package(LevelDB REQUIRED)
find_package(Torch REQUIRED)
find_package(PythonInterp 3.6 REQUIRED)
find_package(BLAS REQUIRED)
# ---[ gRPC Protocols
set(PROTOS
${CMAKE_CURRENT_SOURCE_DIR}/source/protos/euclidesproto.proto
)
# ---[ This is needed due to protobuf compilation
include_directories(${CMAKE_CURRENT_BINARY_DIR})
# ---[ Faiss integration
ExternalProject_Add(faiss_external
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/modules/faiss
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/modules/faiss/configure --prefix=${CMAKE_BINARY_DIR}
BUILD_COMMAND ${MAKE}
BUILD_IN_SOURCE 1)
set(FAISS_LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib)
add_library(faiss STATIC IMPORTED)
set_target_properties(faiss PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/lib/libfaiss.a)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/modules)
# ---[ Protobuf and gRPC generation
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTOS})
grpc_generate_cpp(GRPC_SRCS GRPC_HDRS ${CMAKE_CURRENT_BINARY_DIR} ${PROTOS})
protobuf_generate_python(PROTO_PY ${PROTOS})
add_custom_target(generate_proto ALL DEPENDS ${PROTO_PY})
# ----[ Set properties for generated files
set_source_files_properties(
${PROTO_SRCS}
${PROTO_HDRS}
PROPERTIES GENERATED TRUE)
set_source_files_properties(
${PROTO_PY}
PROPERTIES GENERATED TRUE)
set_source_files_properties(
${GRPC_SRCS}
${GRPC_HDRS}
PROPERTIES GENERATED TRUE)
# ----[ Generate a header with versioning based on the template
configure_file (
"${CMAKE_CURRENT_SOURCE_DIR}/source/EuclidesConfig.h.in"
"${PROJECT_BINARY_DIR}/EuclidesConfig.h"
)
# ----[ Add all sources, both local and external
file(GLOB CPP_FILES source/*.cpp source/external/*.cpp)
# ----[ Copy example configuration file
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/source/external)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/source/euclidesdb.conf
${PROJECT_BINARY_DIR}/euclidesdb.conf COPYONLY)
# ----[ Copy all python files to the build
add_custom_target(pythongenproto ALL)
set(PYGRPC_DEST "${PROJECT_BINARY_DIR}/python")
add_custom_command(TARGET pythongenproto PRE_BUILD
COMMAND "./gen_protobuf.sh"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/source/python
COMMENT "Running Python Proto generation...")
add_custom_target(pythonfiles ALL
DEPENDS pythongenproto)
add_copy_directory(pythonfiles source/python
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/python
GLOB *.py *.jpg
EXCLUDE *.pth *.pyc __pycache__)
# ----[ Add the main server executable
add_executable(${PROJECT_NAME}
${CPP_FILES}
${PROTO_SRCS}
${GRPC_SRCS})
target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -pedantic -Wno-unused-parameter)
# ----[ Add the ./lib to the RPATH for Apple and Unix
set_target_properties(${PROJECT_NAME} PROPERTIES
BUILD_WITH_INSTALL_RPATH 1
INSTALL_RPATH "lib")
# ----[ Directives fro easyloggingcpp
target_compile_options(${PROJECT_NAME} PRIVATE -DELPP_FEATURE_PERFORMANCE_TRACKING -DELPP_THREAD_SAFE)
# ----[ Link it to the required dependencies
target_link_libraries(${PROJECT_NAME}
${LevelDB_LIBRARIES}
${TORCH_LIBRARIES}
faiss
gRPC::grpc++_reflection
protobuf::libprotobuf
OpenMP::OpenMP_CXX
${BLAS_LIBRARIES})
add_dependencies(${PROJECT_NAME} generate_proto)
add_dependencies(${PROJECT_NAME} faiss_external)
# ----[ Copy libraries to the build directory
add_custom_command(TARGET ${PROJECT_NAME} PRE_LINK
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_SOURCE_DIR}/libtorch/lib $<TARGET_FILE_DIR:${PROJECT_NAME}>/lib)
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION euclidesdb)
# ----[ Copy libtorch libraries
install(DIRECTORY ${CMAKE_SOURCE_DIR}/libtorch/lib DESTINATION euclidesdb
FILES_MATCHING PATTERN "*.so*")
# ----[ Copy the models and sample config
install(DIRECTORY ${CMAKE_SOURCE_DIR}/models DESTINATION euclidesdb
FILES_MATCHING PATTERN "*.*" PATTERN "*.pth" EXCLUDE)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/models DESTINATION euclidesdb
FILES_MATCHING PATTERN "*.*" PATTERN "*.pth" EXCLUDE)
install(FILES ${CMAKE_SOURCE_DIR}/source/sample_config.conf DESTINATION euclidesdb)
# ----[ Packaging with CPack
execute_process(COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE ARCHITECTURE)
message("Building for ${ARCHITECTURE}")
include(InstallRequiredSystemLibraries)
set(CPACK_PACKAGE_NAME "euclidesdb")
set(CPACK_PACKAGE_VENDOR "EuclidesDB")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "EuclidesDB")
set(CPACK_PACKAGE_VERSION ${EUCLIDESDB_VERSION_STRING})
set(CPACK_PACKAGE_VERSION_MAJOR "${EUCLIDESDB_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${EUCLIDESDB_VERSION_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${EUCLIDESDB_VERSION_PATCH}")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "euclidesdb")
set(CPACK_PACKAGE_CONTACT "[email protected]")
set(CPACK_GENERATOR "TGZ;ZIP;STGZ")
include(CPack)