1717cmake_minimum_required (VERSION 2.6.4)
1818set (CMAKE_EXPORT_COMPILE_COMMANDS TRUE )
1919
20- set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR} /cmake/modules/" )
21-
2220set (PROJECT_NAME_STRING dse)
2321set (PROJECT_LIB_NAME ${PROJECT_NAME_STRING} )
2422set (PROJECT_LIB_NAME_STATIC "${PROJECT_LIB_NAME} _static" )
2523
26- if (POLICY CMP0042)
27- cmake_policy (SET CMP0042 OLD)
24+ project (${PROJECT_NAME_STRING} C CXX)
25+
26+ set (CASS_SOURCE_DIR "${PROJECT_SOURCE_DIR} /cpp-driver" )
27+ set (CPP_DRIVER_INCLUDE_DIR "${CASS_SOURCE_DIR} /include" )
28+ set (CPP_DRIVER_SOURCE_DIR "${CASS_SOURCE_DIR} /src" )
29+ set (CPP_DRIVER_THIRD_PARTY_SOURCE_DIR "${CPP_DRIVER_SOURCE_DIR} /third_party" )
30+ set (RAPID_JSON_INCLUDE_DIR "${CPP_DRIVER_THIRD_PARTY_SOURCE_DIR} /rapidjson" )
31+
32+ set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CASS_SOURCE_DIR} /cmake/modules/" )
33+ set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR} /cmake/modules/" )
34+
35+ # Determine if the submodule should be initialized
36+ if (NOT EXISTS "${CASS_SOURCE_DIR} /CMakeLists.txt" )
37+ find_package (Git REQUIRED)
38+ execute_process (COMMAND git submodule update --init --recursive
39+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
40+ OUTPUT_QUIET )
2841endif ()
2942
30- project (${PROJECT_NAME_STRING} C CXX)
43+ include (CppDriver)
44+
45+ CassPolicies()
46+ CassCheckPlatform()
3147
3248# Title the project and define the versioning
3349set (PROJECT_DISPLAY_NAME "DataStax C/C++ DSE Driver" )
@@ -58,69 +74,107 @@ message(STATUS "Project version: ${PROJECT_VERSION_STRING}")
5874option (DSE_BUILD_SHARED "Build shared library" ON )
5975option (DSE_BUILD_STATIC "Build static library" OFF )
6076option (DSE_INSTALL_HEADER "Install header file" ON )
77+ option (DSE_INSTALL_PKG_CONFIG "Install pkg-config file(s)" ON )
6178option (DSE_USE_STATIC_LIBS "Link static libraries when building executables" OFF )
6279option (DSE_BUILD_EXAMPLES "Build examples" OFF )
6380option (DSE_BUILD_INTEGRATION_TESTS "Build the integration tests" OFF )
6481option (DSE_BUILD_UNIT_TESTS "Build the unit tests" OFF )
82+ option (DSE_USE_BOOST_ATOMIC "Use Boost atomics library" OFF )
83+ option (DSE_USE_STD_ATOMIC "Use C++11 atomics library" OFF )
84+ option (DSE_USE_OPENSSL "Use OpenSSL" ON )
85+ option (DSE_USE_TCMALLOC "Use tcmalloc" OFF )
86+ option (DSE_USE_SPARSEHASH "Use sparsehash" OFF )
87+ option (DSE_USE_ZLIB "Use zlib" OFF )
88+ option (DSE_USE_LIBSSH2 "Use libssh2" OFF )
6589
66- # Build the Cassandra C/C++ driver submodule
67- if (DSE_BUILD_STATIC)
68- set (CASS_BUILD_STATIC ON CACHE BOOL "Build Cassandra driver static library" FORCE)
69- endif ()
90+ # Determine which driver target should be used as a dependency
91+ set (PROJECT_LIB_NAME_TARGET ${PROJECT_LIB_NAME} )
7092if (DSE_USE_STATIC_LIBS)
71- set (CASS_USE_STATIC_LIBS ON CACHE BOOL "Link static libraries when building Cassandra driver static executables" FORCE)
93+ set (DSE_BUILD_STATIC ON )
94+ set (PROJECT_LIB_NAME_TARGET ${PROJECT_LIB_NAME_STATIC} )
7295endif ()
73- set (CASS_USE_OPENSSL ON CACHE BOOL "Build with OpenSSL support" FORCE)
74- set (CPP_DRIVER_DIR "${PROJECT_SOURCE_DIR} /cpp-driver" )
75- set (CPP_DRIVER_INCLUDE_DIR "${CPP_DRIVER_DIR} /include" )
76- set (CPP_DRIVER_SOURCE_DIR "${CPP_DRIVER_DIR} /src" )
77- set (CPP_DRIVER_THIRD_PARTY_SOURCE_DIR "${CPP_DRIVER_SOURCE_DIR} /third_party" )
78- set (RAPID_JSON_INCLUDE_DIR "${CPP_DRIVER_THIRD_PARTY_SOURCE_DIR} /rapidjson" )
79- if (NOT EXISTS "${CPP_DRIVER_DIR} /CMakeLists.txt" )
80- find_package (Git REQUIRED)
81- execute_process (COMMAND git submodule update --init --recursive
82- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
83- OUTPUT_QUIET )
96+
97+ set (CASS_USE_STATIC_LIBS ${DSE_USE_STATIC_LIBS} )
98+ set (CASS_USE_BOOST_ATOMIC ${DSE_USE_BOOST_ATOMIC} )
99+ set (CASS_USE_STD_ATOMIC ${DSE_USE_STD_ATOMIC} )
100+ set (CASS_USE_OPENSSL ${DSE_USE_OPENSSL} )
101+ set (CASS_USE_TCMALLOC ${DSE_USE_TCMALLOC} )
102+ set (CASS_USE_SPARSEHASH ${DSE_USE_SPARSEHASH} )
103+ set (CASS_USE_ZLIB ${DSE_USE_ZLIB} )
104+ set (CASS_USE_LIBSSH2 ${DSE_USE_LIBSSH2} )
105+
106+ #---------------
107+ # Dependencies
108+ #---------------
109+
110+ CassUseLibuv()
111+
112+ #------------------------
113+ # Optional Dependencies
114+ #------------------------
115+
116+ # Boost
117+ if (CASS_USE_BOOST_ATOMIC)
118+ CassUseBoost()
84119endif ()
85- set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CPP_DRIVER_DIR} /cmake/modules/" )
86- add_subdirectory (${CPP_DRIVER_DIR} )
87- set_property (TARGET cassandra PROPERTY FOLDER "Driver/Cassandra" )
88- if (NOT CMAKE_VERSION VERSION_LESS "2.8.8" )
89- set_property (TARGET cpp-driver PROPERTY FOLDER "Driver/Cassandra" )
120+
121+ # Sparsehash
122+ if (CASS_USE_SPARSEHASH)
123+ CassUseSparshHash()
90124endif ()
91- set (DSE_LIBS ${CASS_LIBS} )
125+
126+
127+ # OpenSSL
128+ if (CASS_USE_OPENSSL)
129+ CassUseOpenSSL()
130+ endif ()
131+
132+ # tcmalloc
133+ if (CASS_USE_TCMALLOC)
134+ CassUseTcmalloc()
135+ endif ()
136+
137+ # zlib
138+ if (CASS_USE_ZLIB)
139+ CassUseZlib()
140+ endif ()
141+
142+ CassSetCompilerFlags()
143+ CassAddIncludes()
144+ CassFindSourceFiles()
145+ source_group ("Source Files\\ Cassandra" FILES ${SRC_FILES} )
146+ source_group ("Header Files\\ Cassandra" FILES ${API_HEADER_FILES} ${INC_FILES} )
92147
93148# Build up the include paths
149+ set (DSE_INCLUDES ${CASS_INCLUDES} )
94150set (PROJECT_INCLUDE_DIR ${PROJECT_SOURCE_DIR} /include )
95151set (DSE_INCLUDES ${DSE_INCLUDES} ${PROJECT_INCLUDE_DIR} )
96152set (DSE_INCLUDES ${DSE_INCLUDES} ${PROJECT_SOURCE_DIR} /src)
97153set (DSE_INCLUDES ${DSE_INCLUDES} ${RAPID_JSON_INCLUDE_DIR} )
98154set (DSE_INCLUDES ${DSE_INCLUDES} ${LIBUV_INCLUDE_DIR} )
99155set (DSE_INCLUDES ${DSE_INCLUDES} ${OPENSSL_INCLUDE_DIR} )
100156
101- # Determine which driver target should be used as a dependency
102- if (DSE_USE_STATIC_LIBS)
103- set (DSE_BUILD_STATIC ON )
104- set (DSE_LIBS ${DSE_LIBS} cassandra_static)
105- set (PROJECT_LIB_NAME_TARGET ${PROJECT_LIB_NAME_STATIC} )
106- set_property (TARGET cassandra_static PROPERTY COMPILE_FLAGS "-fPIC" )
107- else ()
108- set (PROJECT_LIB_NAME_TARGET ${PROJECT_LIB_NAME} )
109- set (DSE_LIBS ${DSE_LIBS} cassandra)
110- endif ()
111- if (DSE_BUILD_STATIC)
112- set_property (TARGET cassandra_static PROPERTY FOLDER "Driver/Cassandra" )
113- endif ()
157+ # Build up libraries
158+ set (DSE_LIBS ${CASS_LIBS} )
114159
115160# Kerberos
116161find_package (Kerberos REQUIRED)
117162set (DSE_INCLUDES ${DSE_INCLUDES} ${KERBEROS_INCLUDE_DIR} )
118163set (DSE_LIBS ${DSE_LIBS} ${KERBEROS_LIBRARIES} )
119164
165+ # Build up compiler flags
166+ set (PROJECT_CXX_FLAGS ${CASS_DRIVER_CXX_FLAGS} )
167+ set (TEST_CXX_FLAGS ${CASS_TEST_CXX_FLAGS} )
168+
120169#------------------------------
121170# DSE static and shared
122171#------------------------------
123172
173+ # Copy "cassandra.h"
174+ configure_file (${PROJECT_SOURCE_DIR} /cpp-driver/include /cassandra.h
175+ ${PROJECT_SOURCE_DIR} /include /dse/cassandra.h
176+ COPYONLY )
177+
124178set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} )
125179set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} )
126180set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} )
@@ -131,7 +185,9 @@ file(GLOB DSE_SRC_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp)
131185
132186source_group ("Source Files" FILES ${DSE_SRC_FILES} )
133187source_group ("Header Files" FILES ${DSE_API_HEADER_FILES} ${DSE_INC_FILES} )
134- set (DSE_ALL_SOURCE_FILES ${DSE_SRC_FILES} ${DSE_API_HEADER_FILES} ${DSE_INC_FILES} )
188+ set (DSE_ALL_SOURCE_FILES
189+ ${DSE_SRC_FILES} ${DSE_API_HEADER_FILES}
190+ ${DSE_INC_FILES} ${CASS_ALL_SOURCE_FILES} )
135191
136192# Create an object library for the driver (single build)
137193if (NOT CMAKE_VERSION VERSION_LESS "2.8.8" )
@@ -181,6 +237,7 @@ if(DSE_BUILD_STATIC)
181237 target_link_libraries (${PROJECT_LIB_NAME_STATIC} ${DSE_LIBS} )
182238 set_target_properties (${PROJECT_LIB_NAME_STATIC} PROPERTIES OUTPUT_NAME ${PROJECT_LIB_NAME_STATIC} )
183239 set_target_properties (${PROJECT_LIB_NAME_STATIC} PROPERTIES VERSION ${PROJECT_VERSION_STRING} SOVERSION ${PROJECT_VERSION_MAJOR} )
240+ set_target_properties (${PROJECT_LIB_NAME_STATIC} PROPERTIES LINK_FLAGS "${PROJECT_CXX_LINKER_FLAGS} " )
184241 set_property (
185242 TARGET ${PROJECT_LIB_NAME_STATIC}
186243 APPEND PROPERTY COMPILE_FLAGS "${PROJECT_CXX_FLAGS} -DDSE_STATIC" )
@@ -243,8 +300,22 @@ set(INSTALL_DLL_EXE_DIR "bin")
243300# Install targets
244301#------------------------------
245302
303+ if (DSE_INSTALL_PKG_CONFIG)
304+ if (NOT WIN32 )
305+ find_package (PkgConfig)
306+ if (PKG_CONFIG_FOUND)
307+ set (prefix ${CMAKE_INSTALL_PREFIX} )
308+ set (exec_prefix ${CMAKE_INSTALL_PREFIX} )
309+ set (libdir ${CMAKE_INSTALL_PREFIX} /${CMAKE_INSTALL_LIBDIR} )
310+ set (includedir ${CMAKE_INSTALL_PREFIX} /include )
311+ set (version ${PROJECT_VERSION_STRING} )
312+ endif ()
313+ endif ()
314+ endif ()
315+
246316# Determine if the header should be installed
247317if (DSE_INSTALL_HEADER)
318+ install (DIRECTORY include /dse DESTINATION include FILES_MATCHING PATTERN "*.h" )
248319 install (FILES ${DSE_API_HEADER_FILES} DESTINATION "include" )
249320endif ()
250321
@@ -254,4 +325,29 @@ if(DSE_BUILD_SHARED)
254325 RUNTIME DESTINATION ${INSTALL_DLL_EXE_DIR} # for dll/executable files
255326 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # for shared library
256327 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) # for static library
328+ if (DSE_INSTALL_PKG_CONFIG)
329+ if (NOT WIN32 )
330+ if (PKG_CONFIG_FOUND)
331+ configure_file ("${PROJECT_SOURCE_DIR} /packaging/dse.pc.in" "dse.pc" @ONLY)
332+ install (FILES "${CMAKE_CURRENT_BINARY_DIR} /dse.pc"
333+ DESTINATION "${CMAKE_INSTALL_LIBDIR} /pkgconfig" )
334+ endif ()
335+ endif ()
336+ endif ()
337+ endif ()
338+
339+ if (DSE_BUILD_STATIC)
340+ install (TARGETS ${PROJECT_LIB_NAME_STATIC}
341+ RUNTIME DESTINATION ${INSTALL_DLL_EXE_DIR} # for dll/executable files
342+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # for shared library
343+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) # for static library
344+ if (DSE_INSTALL_PKG_CONFIG)
345+ if (NOT WIN32 )
346+ if (PKG_CONFIG_FOUND)
347+ configure_file ("${PROJECT_SOURCE_DIR} /packaging/dse_static.pc.in" "dse_static.pc" @ONLY)
348+ install (FILES "${CMAKE_CURRENT_BINARY_DIR} /dse_static.pc"
349+ DESTINATION "${CMAKE_INSTALL_LIBDIR} /pkgconfig" )
350+ endif ()
351+ endif ()
352+ endif ()
257353endif ()
0 commit comments