1- cmake_minimum_required (VERSION 3.13 )
1+ cmake_minimum_required (VERSION 3.15 )
22
33project (DolphinDBAPI)
44
55set (CMAKE_EXPORT_COMPILE_COMMANDS ON )
6- set (CMAKE_CXX_STANDARD 11)
76set (CMAKE_CXX_EXTENSIONS OFF )
87
98option (USE_OPENSSL "Use OpenSSL for encrypted communication." ON )
109option (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 )
1413
14+ add_library (${CMAKE_PROJECT_NAME} )
15+ target_compile_features (${CMAKE_PROJECT_NAME} PRIVATE cxx_std_11)
1516add_subdirectory (src)
1617
1718if (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 ()
2033endif ()
2134
35+ include (CheckIncludeFileCXX)
36+ include (CheckCXXSourceCompiles)
37+
2238if (USE_AERON)
2339 if (NOT DEFINED AERON_INSTALL_DIR)
2440 set (AERON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} )
@@ -28,69 +44,155 @@ if (USE_AERON)
2844 "${AERON_INSTALL_DIR} /include/aeron"
2945 "${AERON_INSTALL_DIR} /include"
3046 )
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
3354 aeron
34- aeron_client_shared
3555 aeron_driver
56+ aeron_client_shared
3657 )
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 ()
3883endif ()
3984
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-
5085if (WIN32 )
5186 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 )
5388 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)
5590 endif ()
5691else ()
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 ()
5796 target_link_libraries (${CMAKE_PROJECT_NAME} PRIVATE pthread rt uuid)
5897endif ()
5998
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.
63101 # 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 ()
66108else ()
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" )
70116endif ()
71117
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+ )
75150 endif ()
76- add_executable (${CMAKE_PROJECT_NAME} _test)
77- add_subdirectory (test )
78151
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)
82171 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 )
84173 endif ()
85174
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 ()
88178
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 )
90191
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
95197 )
96198endif ()
0 commit comments