C++DB is the database layer that was designed to work with C++CMS. This customized version is used within Ye Ol' Pi Shack.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

308 lines
8.9 KiB

  1. cmake_minimum_required(VERSION 2.6)
  2. project(cppdb)
  3. set(CPPDB_MAJOR 0)
  4. set(CPPDB_MINOR 3)
  5. set(CPPDB_PATCH 1)
  6. set(CPPDB_VERSION ${CPPDB_MAJOR}.${CPPDB_MINOR}.${CPPDB_PATCH})
  7. set(CPPDB_SOVERSION ${CPPDB_MAJOR})
  8. add_definitions(
  9. -DCPPDB_MAJOR=${CPPDB_MAJOR}
  10. -DCPPDB_MINOR=${CPPDB_MINOR}
  11. -DCPPDB_PATCH=${CPPDB_PATCH}
  12. -DCPPDB_VERSION="${CPPDB_MAJOR}.${CPPDB_MINOR}.${CPPDB_PATCH}"
  13. )
  14. option(DISABLE_SQLITE "Link sqlite3 backend into the libcppdb" OFF)
  15. option(DISABLE_PQ "Link postgresql backend into the libcppdb" OFF)
  16. option(DISABLE_MYSQL "Link mysql backend into the libcppdb" OFF)
  17. option(DISABLE_ODBC "Link odbc backend into the libcppdb" OFF)
  18. option(SQLITE_BACKEND_INTERNAL "Link sqlite3 backend into the libcppdb" OFF)
  19. option(PQ_BACKEND_INTERNAL "Link postgresql backend into the libcppdb" OFF)
  20. option(MYSQL_BACKEND_INTERNAL "Link mysql backend into the libcppdb" OFF)
  21. option(ODBC_BACKEND_INTERNAL "Link odbc backend into the libcppdb" ON)
  22. if(NOT LIBDIR)
  23. set(LIBDIR lib CACHE STRING "Library installation directory" FORCE)
  24. endif()
  25. # General settings
  26. include_directories(.)
  27. add_definitions(-DCPPDB_LIBRARY_PREFIX="${CMAKE_SHARED_LIBRARY_PREFIX}")
  28. add_definitions(-DCPPDB_LIBRARY_SUFFIX="${CMAKE_SHARED_LIBRARY_SUFFIX}")
  29. add_definitions(-DCPPDB_SOVERSION="${CPPDB_SOVERSION}")
  30. # Basic common configuration
  31. if(NOT CMAKE_BUILD_TYPE)
  32. set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
  33. "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
  34. FORCE)
  35. endif(NOT CMAKE_BUILD_TYPE)
  36. include(CheckLibraryExists)
  37. include(CheckCXXSourceCompiles)
  38. if(NOT WIN32)
  39. find_library(DL_LIB dl)
  40. find_library(PTHREAD_LIB pthread NAMES thr kse)
  41. endif()
  42. if(CMAKE_COMPILER_IS_GNUCXX)
  43. set(CXX_FLAGS "-Wall -Wextra")
  44. if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  45. set(CXX_FLAGS "${CXX_FLAGS} -pthreads")
  46. endif()
  47. elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
  48. set(CXX_FLAGS "-Wall")
  49. elseif(MSVC)
  50. set(CXX_FLAGS "/EHsc /W3")
  51. elseif(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
  52. if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  53. set(CXX_FLAGS "${CXX_FLAGS} -mt")
  54. endif()
  55. endif()
  56. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS}")
  57. check_cxx_source_compiles(
  58. "int main() { volatile int v=0; return __sync_bool_compare_and_swap(&v,0,1); }"
  59. CPPDB_HAS_GCC_SYNC)
  60. if(CPPDB_HAS_GCC_SYNC)
  61. add_definitions(-DCPPDB_HAS_GCC_SYNC)
  62. endif()
  63. check_cxx_source_compiles(
  64. "#include <bits/atomicity.h>
  65. using __gnu_cxx::__exchange_and_add;
  66. int main(){ volatile int x=0; return __exchange_and_add(&x,1);}"
  67. CPPDB_HAVE_GCC_BITS_EXCHANGE_AND_ADD)
  68. if(CPPDB_HAVE_GCC_BITS_EXCHANGE_AND_ADD)
  69. add_definitions(-DCPPDB_HAVE_GCC_BITS_EXCHANGE_AND_ADD)
  70. endif()
  71. check_cxx_source_compiles(
  72. "#include <ext/atomicity.h>
  73. using __gnu_cxx::__exchange_and_add;
  74. int main(){ volatile int x=0; return __exchange_and_add(&x,1);}"
  75. CPPDB_HAVE_GCC_EXT_EXCHANGE_AND_ADD)
  76. if(CPPDB_HAVE_GCC_EXT_EXCHANGE_AND_ADD)
  77. add_definitions(-DCPPDB_HAVE_GCC_EXT_EXCHANGE_AND_ADD)
  78. endif()
  79. check_cxx_source_compiles(
  80. "#include <sys/types.h>
  81. #include <machine/atomic.h>
  82. int main() { volatile unsigned v=0; return atomic_cmpset_int(&v,1,0); }"
  83. CPPDB_HAVE_FREEBSD_ATOMIC)
  84. if(CPPDB_HAVE_FREEBSD_ATOMIC)
  85. add_definitions(-DCPPDB_HAVE_FREEBSD_ATOMIC)
  86. endif()
  87. check_cxx_source_compiles(
  88. "#include <atomic.h>
  89. int main() { volatile unsigned v=0; return atomic_add_int_nv(&v,1); }"
  90. CPPDB_HAVE_SOLARIS_ATOMIC)
  91. if(CPPDB_HAVE_SOLARIS_ATOMIC)
  92. add_definitions(-DCPPDB_HAVE_SOLARIS_ATOMIC)
  93. endif()
  94. check_cxx_source_compiles(
  95. "#include <libkern/OSAtomic.h>
  96. int main() { volatile int v=0; return OSAtomicAdd32(1,&v); }"
  97. CPPDB_HAVE_MAC_OS_X_ATOMIC)
  98. if(CPPDB_HAVE_MAC_OS_X_ATOMIC)
  99. add_definitions(-DCPPDB_HAVE_MAC_OS_X_ATOMIC)
  100. endif()
  101. # Backend configuration
  102. set(INTERNAL_SOURCES)
  103. set(INTERNAL_LIBRARIES)
  104. set(BACKEND_LIBRARIES)
  105. if(NOT DISABLE_ODBC)
  106. find_library(ODBC_LIB odbc NAMES odbc32)
  107. find_path(ODBC_PATH sqlext.h)
  108. if(ODBC_LIB AND ODBC_PATH)
  109. include_directories(${ODBC_PATH})
  110. if(ODBC_BACKEND_INTERNAL)
  111. set(INTERNAL_SOURCES ${INTERNAL_SOURCES} drivers/odbc_backend.cpp)
  112. set(INTERNAL_LIBRARIES ${INTERNAL_LIBRARIES} ${ODBC_LIB})
  113. add_definitions(-DCPPDB_WITH_ODBC)
  114. else()
  115. add_library(cppdb_odbc SHARED drivers/odbc_backend.cpp)
  116. target_link_libraries(cppdb_odbc ${ODBC_LIB})
  117. add_library(cppdb_odbc-static STATIC drivers/odbc_backend.cpp)
  118. set(BACKEND_LIBRARIES ${BACKEND_LIBRARIES} cppdb_odbc)
  119. endif()
  120. else()
  121. message("-- odbc library was not found, disabling odbc backend")
  122. endif()
  123. endif()
  124. if(NOT DISABLE_SQLITE)
  125. find_library(SQLITE3_LIB sqlite3)
  126. find_path(SQLITE3_PATH sqlite3.h)
  127. if(SQLITE3_LIB AND SQLITE3_PATH)
  128. include_directories(${SQLITE3_PATH})
  129. if(SQLITE_BACKEND_INTERNAL)
  130. add_definitions(-DCPPDB_WITH_SQLITE3)
  131. set(INTERNAL_SOURCES ${INTERNAL_SOURCES} drivers/sqlite3_backend.cpp)
  132. set(INTERNAL_LIBRARIES ${INTERNAL_LIBRARIES} ${SQLITE3_LIB})
  133. else()
  134. add_library(cppdb_sqlite3 SHARED drivers/sqlite3_backend.cpp)
  135. target_link_libraries(cppdb_sqlite3 ${SQLITE3_LIB})
  136. add_library(cppdb_sqlite3-static STATIC drivers/sqlite3_backend.cpp)
  137. set(BACKEND_LIBRARIES ${BACKEND_LIBRARIES} cppdb_sqlite3)
  138. endif()
  139. else()
  140. message("-- sqlite3 library was not found, disabling sqlite3 backend")
  141. endif()
  142. endif()
  143. if(NOT DISABLE_PQ)
  144. find_library(PQ_LIB pq)
  145. find_path(PQ_PATH libpq-fe.h PATH_SUFFIXES postgresql pgsql)
  146. if(PQ_LIB AND PQ_PATH)
  147. include_directories(${PQ_PATH})
  148. if(PQ_BACKEND_INTERNAL)
  149. set(INTERNAL_SOURCES ${INTERNAL_SOURCES} drivers/postgres_backend.cpp)
  150. set(INTERNAL_LIBRARIES ${INTERNAL_LIBRARIES} ${PQ_LIB})
  151. add_definitions(-DCPPDB_WITH_PQ)
  152. else()
  153. add_library(cppdb_postgresql SHARED drivers/postgres_backend.cpp)
  154. add_library(cppdb_postgresql-static STATIC drivers/postgres_backend.cpp)
  155. target_link_libraries(cppdb_postgresql ${PQ_LIB})
  156. set(BACKEND_LIBRARIES ${BACKEND_LIBRARIES} cppdb_postgresql)
  157. endif()
  158. else()
  159. message("-- libpq not found, disableing postgresql backend")
  160. endif()
  161. endif()
  162. if(NOT DISABLE_MYSQL)
  163. find_library(MYSQL_LIB mysqlclient)
  164. find_path(MYSQL_PATH mysql.h PATH_SUFFIXES mysql)
  165. if(MYSQL_LIB AND MYSQL_PATH)
  166. include_directories(${MYSQL_PATH})
  167. if(MYSQL_BACKEND_INTERNAL)
  168. set(INTERNAL_SOURCES ${INTERNAL_SOURCES} drivers/mysql_backend.cpp)
  169. set(INTERNAL_LIBRARIES ${INTERNAL_LIBRARIES} ${MYSQL_LIB})
  170. add_definitions(-DCPPDB_WITH_MYSQL)
  171. else()
  172. add_library(cppdb_mysql SHARED drivers/mysql_backend.cpp)
  173. add_library(cppdb_mysql-static STATIC drivers/mysql_backend.cpp)
  174. target_link_libraries(cppdb_mysql ${MYSQL_LIB})
  175. set(BACKEND_LIBRARIES ${BACKEND_LIBRARIES} cppdb_mysql)
  176. endif()
  177. else()
  178. message("-- mysqlclient not found, disableing mysql backend")
  179. endif()
  180. endif()
  181. # Main library configuration
  182. set(CPPDB_SRC
  183. src/utils.cpp
  184. src/mutex.cpp
  185. src/driver_manager.cpp
  186. src/conn_manager.cpp
  187. src/shared_object.cpp
  188. src/pool.cpp
  189. src/backend.cpp
  190. src/frontend.cpp
  191. src/atomic_counter.cpp
  192. ${INTERNAL_SOURCES}
  193. )
  194. add_library(cppdb SHARED ${CPPDB_SRC})
  195. add_library(cppdb-static STATIC ${CPPDB_SRC})
  196. set_target_properties(cppdb PROPERTIES COMPILE_DEFINITIONS CPPDB_EXPORTS)
  197. if(NOT WIN32)
  198. if(DL_LIB)
  199. target_link_libraries(cppdb ${DL_LIB})
  200. endif()
  201. target_link_libraries(cppdb ${PTHREAD_LIB})
  202. endif()
  203. # Link and backends configuration
  204. set(INST_LIBS)
  205. foreach(LIB ${BACKEND_LIBRARIES} cppdb)
  206. set(INST_LIBS ${INST_LIBS} ${LIB} ${LIB}-static)
  207. if(WIN32)
  208. set_target_properties(${LIB} PROPERTIES VERSION ${CPPDB_SOVERSION} SOVERSION ${CPPDB_SOVERSION})
  209. else()
  210. set_target_properties(${LIB} PROPERTIES VERSION ${CPPDB_VERSION} SOVERSION ${CPPDB_SOVERSION})
  211. endif()
  212. set_target_properties(${LIB} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
  213. set_target_properties(${LIB} PROPERTIES OUTPUT_NAME "${LIB}")
  214. set_target_properties(${LIB}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
  215. set_target_properties(${LIB}-static PROPERTIES OUTPUT_NAME "${LIB}")
  216. set_target_properties(${LIB}-static PROPERTIES PREFIX "lib") # Make sure import and normal library do not collide
  217. endforeach()
  218. foreach(LIB ${BACKEND_LIBRARIES})
  219. set_target_properties(${LIB} PROPERTIES COMPILE_DEFINITIONS CPPDB_DRIVER_EXPORTS)
  220. target_link_libraries(${LIB} cppdb)
  221. endforeach()
  222. foreach(LIB ${INTERNAL_LIBRARIES})
  223. target_link_libraries(cppdb ${LIB})
  224. endforeach()
  225. # tests
  226. add_executable(test_perf test/test_perf.cpp)
  227. add_executable(test_basic test/test_basic.cpp)
  228. add_executable(test_backend test/test_backend.cpp)
  229. add_executable(test_caching test/test_caching.cpp)
  230. add_executable(example examples/example1.cpp)
  231. set_target_properties( test_perf test_backend test_basic test_caching example
  232. PROPERTIES
  233. COMPILE_DEFINITIONS CPPDB_EXPORTS)
  234. target_link_libraries(test_perf cppdb)
  235. target_link_libraries(test_basic cppdb)
  236. target_link_libraries(test_backend cppdb)
  237. target_link_libraries(test_caching cppdb)
  238. target_link_libraries(example cppdb)
  239. install(TARGETS ${INST_LIBS}
  240. RUNTIME DESTINATION bin
  241. LIBRARY DESTINATION ${LIBDIR}
  242. ARCHIVE DESTINATION ${LIBDIR}
  243. PUBLIC_HEADER DESTINATION include/cppdb)
  244. install(DIRECTORY cppdb DESTINATION include
  245. PATTERN ".svn" EXCLUDE)