1
- cmake_minimum_required (VERSION 3.13 )
1
+ cmake_minimum_required (VERSION 3.15 )
2
2
3
3
project (DolphinDBAPI)
4
4
5
5
set (CMAKE_EXPORT_COMPILE_COMMANDS ON )
6
- set (CMAKE_CXX_STANDARD 11)
7
6
set (CMAKE_CXX_EXTENSIONS OFF )
8
7
9
8
option (USE_OPENSSL "Use OpenSSL for encrypted communication." ON )
10
9
option (USE_AERON "Use Aeron for UDP connections. ${CMAKE_PROJECT_NAME} will search for Aeron in $\{ CMAKE_INSTALL_PREFIX\} by default, you can specify a different location with AERON_INSTALL_DIR" ON )
11
- option (WITH_GTEST "Compile testcases." OFF )
12
-
13
- add_library ( ${CMAKE_PROJECT_NAME} SHARED )
10
+ option (BUILD_SHARED_LIBS "Build shared library" ON )
11
+ option (LINK_SHARED_LIBS "Link shared libraries" ON )
12
+ option (WITH_UNITTEST "Compile testcases." OFF )
14
13
14
+ add_library (${CMAKE_PROJECT_NAME} )
15
+ target_compile_features (${CMAKE_PROJECT_NAME} PRIVATE cxx_std_11)
15
16
add_subdirectory (src)
16
17
17
18
if (USE_OPENSSL)
18
- find_package (OpenSSL REQUIRED)
19
- target_compile_definitions (${CMAKE_PROJECT_NAME} PRIVATE USE_OPENSSL)
19
+ if (NOT LINK_SHARED_LIBS)
20
+ set (OPENSSL_USE_STATIC_LIBS TRUE )
21
+ endif ()
22
+ # FindOpenSSL from cmake
23
+ find_package (OpenSSL)
24
+ if (OPENSSL_FOUND)
25
+ target_compile_definitions (${CMAKE_PROJECT_NAME} PRIVATE USE_OPENSSL)
26
+ target_include_directories (${CMAKE_PROJECT_NAME} PRIVATE ${OPENSSL_INCLUDE_DIR} )
27
+ target_link_libraries (${CMAKE_PROJECT_NAME} PRIVATE ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} )
28
+ else ()
29
+ message (WARNING
30
+ "Failed to compile ${CMAKE_PROJECT_NAME} with OpenSSL. Encrypted communication features are unavailable.\n "
31
+ "To suppress this warning, set -DUSE_OPENSSL=OFF in cmake command." )
32
+ endif ()
20
33
endif ()
21
34
35
+ include (CheckIncludeFileCXX)
36
+ include (CheckCXXSourceCompiles)
37
+
22
38
if (USE_AERON)
23
39
if (NOT DEFINED AERON_INSTALL_DIR)
24
40
set (AERON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} )
@@ -28,69 +44,155 @@ if (USE_AERON)
28
44
"${AERON_INSTALL_DIR} /include/aeron"
29
45
"${AERON_INSTALL_DIR} /include"
30
46
)
31
- target_link_directories (${CMAKE_PROJECT_NAME} PRIVATE ${AERON_INSTALL_DIR} /lib)
32
- set (AERON_LIBRARY
47
+ set (AERON_LIBRARY_DIR ${AERON_INSTALL_DIR} /lib)
48
+ set (AERON_LIBRARY_STATIC
49
+ aeron_static
50
+ aeron_driver_static
51
+ aeron_client
52
+ )
53
+ set (AERON_LIBRARY_SHARED
33
54
aeron
34
- aeron_client_shared
35
55
aeron_driver
56
+ aeron_client_shared
36
57
)
37
- target_compile_definitions (${CMAKE_PROJECT_NAME} PRIVATE USE_AERON)
58
+ if (LINK_SHARED_LIBS)
59
+ set (AERON_LIBRARY ${AERON_LIBRARY_SHARED} )
60
+ else ()
61
+ set (AERON_LIBRARY ${AERON_LIBRARY_STATIC} )
62
+ endif ()
63
+ set (CMAKE_REQUIRED_INCLUDES ${AERON_INCLUDE_DIR} )
64
+ check_include_file_cxx("FragmentAssembler.h" HAS_AERON_HEADER)
65
+ if (HAS_AERON_HEADER)
66
+ set (CMAKE_REQUIRED_LINK_DIRECTORIES ${AERON_LIBRARY_DIR} )
67
+ set (CMAKE_REQUIRED_LIBRARIES ${AERON_LIBRARY} )
68
+ check_cxx_source_compiles("int main() {return 0;}" HAS_AERON)
69
+ endif ()
70
+ unset (CMAKE_REQUIRED_INCLUDES)
71
+ unset (CMAKE_REQUIRED_LIBRARIES)
72
+ unset (CMAKE_REQUIRED_LINK_DIRECTORIES)
73
+ if (HAS_AERON)
74
+ target_compile_definitions (${CMAKE_PROJECT_NAME} PRIVATE USE_AERON)
75
+ target_include_directories (${CMAKE_PROJECT_NAME} PRIVATE ${AERON_INCLUDE_DIR} )
76
+ target_link_directories (${CMAKE_PROJECT_NAME} PRIVATE ${AERON_LIBRARY_DIR} )
77
+ target_link_libraries (${CMAKE_PROJECT_NAME} PRIVATE ${AERON_LIBRARY} )
78
+ else ()
79
+ message (WARNING
80
+ "Failed to compile ${CMAKE_PROJECT_NAME} with Aeron. UDP features are unavailable.\n "
81
+ "To suppress this warning, set -DUSE_AERON=OFF in cmake command." )
82
+ endif ()
38
83
endif ()
39
84
40
- target_include_directories (${CMAKE_PROJECT_NAME}
41
- PRIVATE ${OPENSSL_INCLUDE_DIR}
42
- PRIVATE ${AERON_INCLUDE_DIR}
43
- )
44
- target_link_libraries (${CMAKE_PROJECT_NAME}
45
- PRIVATE ${OPENSSL_SSL_LIBRARY}
46
- PRIVATE ${OPENSSL_CRYPTO_LIBRARY}
47
- PRIVATE ${AERON_LIBRARY}
48
- )
49
-
50
85
if (WIN32 )
51
86
target_compile_definitions (${CMAKE_PROJECT_NAME} PRIVATE NOMINMAX _DDBAPIDLL)
52
- target_link_libraries (${CMAKE_PROJECT_NAME} PRIVATE ws2_32)
87
+ target_link_libraries (${CMAKE_PROJECT_NAME} PRIVATE ws2_32 crypt32 )
53
88
if (MINGW)
54
- target_compile_definitions (${CMAKE_PROJECT_NAME} PRIVATE _WIN32_WINNT=0x0600)
89
+ target_compile_definitions (${CMAKE_PROJECT_NAME} PRIVATE WINDOWS _WIN32_WINNT=0x0600)
55
90
endif ()
56
91
else ()
92
+ check_include_file_cxx("uuid/uuid.h" HAS_UUID)
93
+ if (NOT HAS_UUID)
94
+ message (FATAL_ERROR "Failed to find uuid." )
95
+ endif ()
57
96
target_link_libraries (${CMAKE_PROJECT_NAME} PRIVATE pthread rt uuid)
58
97
endif ()
59
98
60
- if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
61
- # C4251: Class member of an exported class is not marked dllexport.
62
- # This is triggered by std::string but we cannot modify STL.
99
+ if (MSVC )
100
+ # C4251: Class member of an exported class is not marked dllexport. This is triggered by std::string but we cannot modify STL.
63
101
# C4100: Parameter is unused. We should fix this later.
64
- # C4996: The code uses a deprecated API. We should fix this later.
65
- target_compile_options (${CMAKE_PROJECT_NAME} PRIVATE /W3 /MP /wd4251 /wd4100 /wd4996)
102
+ target_compile_options (${CMAKE_PROJECT_NAME} PRIVATE /W4 /MP /wd4251 /wd4100)
103
+ # Unicode support of fmt (used in spdlog) requires /utf-8 of MSVC.
104
+ target_compile_definitions (${CMAKE_PROJECT_NAME} PRIVATE FMT_UNICODE=0)
105
+ if (${CMAKE_BUILD_TYPE} MATCHES "Dev" )
106
+ target_compile_options (${CMAKE_PROJECT_NAME} PRIVATE /WX)
107
+ endif ()
66
108
else ()
67
- # overloaded-virtual: Derived class hides base class virtual functions
68
- # This is triggered by derived classes of Constant and we will fix this later
69
- target_compile_options (${CMAKE_PROJECT_NAME} PRIVATE -Wall -Wno-overloaded-virtual)
109
+ target_compile_options (${CMAKE_PROJECT_NAME} PRIVATE -Wall)
110
+ target_compile_options (${CMAKE_PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:
111
+ -Wno-overloaded-virtual # ConstantImp.h
112
+ -Wno-inconsistent-missing-override # ConstantImp.h
113
+ >)
114
+ # Enable Wextra and Wconversion when possible
115
+ set (CMAKE_CXX_FLAGS_DEV "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address -Werror -Wpedantic" )
70
116
endif ()
71
117
72
- if (WITH_GTEST)
73
- if (NOT USE_CXX11_ABI)
74
- message (FATAL_ERROR "cannot compile testcases without C++11 ABI" )
118
+ if (WITH_UNITTEST)
119
+ find_package (GTest REQUIRED)
120
+ set (UNITTEST ${CMAKE_PROJECT_NAME} _unittest)
121
+ add_executable (${UNITTEST} )
122
+ add_subdirectory (unittest)
123
+
124
+ target_link_libraries (${UNITTEST}
125
+ ${CMAKE_PROJECT_NAME}
126
+ GTest::gtest_main
127
+ )
128
+ endif ()
129
+
130
+ if (API_TEST)
131
+ if (NOT DEFINED TEST_BINARY_NAME)
132
+ set (TEST_BINARY_NAME ${CMAKE_PROJECT_NAME} _test) # default test binary name is DolphinDBAPI_test
133
+ endif ()
134
+ option (COMPATI "this is a compatibility testing parameter" OFF )
135
+ if (COMPATI AND DEFINED ENV{COMPATI_PATH})
136
+ set (COMPATI_PATH $ENV{COMPATI_PATH} )
137
+ file (GLOB COMPATI_SRC "${COMPATI_PATH} /*_gtest.cpp" "${COMPATI_PATH} /gt_main.cpp" )
138
+ add_executable (${TEST_BINARY_NAME}
139
+ ${COMPATI_SRC}
140
+ "test/config.cpp"
141
+ )
142
+ else ()
143
+ file (GLOB TEST_SRC "test/*_gtest.cpp" "test/gt_main.cpp" )
144
+ add_executable (${TEST_BINARY_NAME}
145
+ ${TEST_SRC}
146
+ "test/config.cpp"
147
+ "test/concurrent_testing/ConcurrentTest_gtest.cpp"
148
+ "test/HA_testing/HighAvailableTest_gtest.cpp"
149
+ )
75
150
endif ()
76
- add_executable (${CMAKE_PROJECT_NAME} _test)
77
- add_subdirectory (test )
78
151
79
- if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
80
- target_compile_options (${CMAKE_PROJECT_NAME} _test PRIVATE /W0 /utf-8 /MP)
81
- target_compile_definitions (${CMAKE_PROJECT_NAME} _test PRIVATE WINDOWS NOMINMAX)
152
+
153
+ if (USE_OPENSSL AND OPENSSL_FOUND)
154
+ target_compile_definitions (${TEST_BINARY_NAME} PRIVATE TEST_OPENSSL)
155
+ target_include_directories (${TEST_BINARY_NAME} PRIVATE ${OPENSSL_INCLUDE_DIR} )
156
+ target_link_libraries (${TEST_BINARY_NAME} PRIVATE ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} )
157
+ endif ()
158
+ if (USE_AERON AND HAS_AERON)
159
+ target_compile_definitions (${TEST_BINARY_NAME} PRIVATE TEST_AERON)
160
+ target_include_directories (${TEST_BINARY_NAME} PRIVATE ${AERON_INCLUDE_DIR} )
161
+ target_link_directories (${TEST_BINARY_NAME} PRIVATE ${AERON_LIBRARY_DIR} )
162
+ target_link_libraries (${TEST_BINARY_NAME} PRIVATE ${AERON_LIBRARY} )
163
+ endif ()
164
+
165
+ if (MSVC )
166
+ target_compile_options (${TEST_BINARY_NAME} PRIVATE /W0 /utf-8 /MP /bigobj)
167
+ target_compile_definitions (${TEST_BINARY_NAME} PRIVATE WINDOWS NOMINMAX)
168
+ elseif (MINGW)
169
+ target_compile_options (${TEST_BINARY_NAME} PRIVATE -w -Wa,-mbig-obj -pthread -std=c++11 -g)
170
+ target_compile_definitions (${TEST_BINARY_NAME} PRIVATE WINDOWS _WIN32_WINNT=0x0600)
82
171
else ()
83
- target_compile_options (${CMAKE_PROJECT_NAME} _test PRIVATE -w)
172
+ target_compile_options (${TEST_BINARY_NAME} PRIVATE -w -pthread -std=c++11 -g )
84
173
endif ()
85
174
86
- set (gtest_force_shared_crt ON CACHE BOOL "" FORCE)
87
- add_subdirectory ("${PROJECT_SOURCE_DIR} /thirdparty/googletest" )
175
+ if (CMAKE_VERSION VERSION_GREATER "3.27.0" )
176
+ cmake_policy (SET CMP0144 NEW)
177
+ endif ()
88
178
89
- enable_testing ()
179
+ find_package (GTest 1.12.0 REQUIRED)
180
+ if (NOT DEFINED API_INSTALL_DIR)
181
+ set (API_INSTALL_LIB ${CMAKE_PROJECT_NAME} )
182
+ else ()
183
+ if (MSVC )
184
+ set (LIB_NAME "${CMAKE_SHARED_LIBRARY_PREFIX}${CMAKE_PROJECT_NAME} .lib" )
185
+ else ()
186
+ set (LIB_NAME "${CMAKE_SHARED_LIBRARY_PREFIX}${CMAKE_PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} " )
187
+ endif ()
188
+ set (API_INSTALL_LIB ${API_INSTALL_DIR} /${LIB_NAME} )
189
+ endif ()
190
+ target_include_directories (${TEST_BINARY_NAME} PRIVATE ${PROJECT_SOURCE_DIR} /include )
90
191
91
- target_link_libraries (${CMAKE_PROJECT_NAME} _test
92
- ${CMAKE_PROJECT_NAME}
93
- gtest_main
94
- gmock_main
192
+ target_link_libraries (${TEST_BINARY_NAME} PRIVATE
193
+ ${API_INSTALL_LIB}
194
+ GTest::gtest
195
+ GTest::gmock
196
+ GTest::gtest_main
95
197
)
96
198
endif ()
0 commit comments