Warning, /sdk/codevis/thirdparty/soci/cmake/SociBackend.cmake is written in an unsupported language. File is not indexed.
0001 ################################################################################ 0002 # SociBackend.cmake - part of CMake configuration of SOCI library 0003 ################################################################################ 0004 # Copyright (C) 2010-2013 Mateusz Loskot <mateusz@loskot.net> 0005 # 0006 # Distributed under the Boost Software License, Version 1.0. 0007 # (See accompanying file LICENSE_1_0.txt or copy at 0008 # http://www.boost.org/LICENSE_1_0.txt) 0009 ################################################################################ 0010 # Macros in this module: 0011 # 0012 # soci_backend 0013 # - defines project of a database backend for SOCI library 0014 # 0015 # soci_backend_test 0016 # - defines test project of a database backend for SOCI library 0017 ################################################################################ 0018 0019 macro(soci_backend_deps_found NAME DEPS SUCCESS) 0020 #message(STATUS "DEPS=${DEPS}") 0021 0022 # Determine required dependencies 0023 set(DEPS_INCLUDE_DIRS) 0024 set(DEPS_LIBRARIES) 0025 set(DEPS_NOT_FOUND) 0026 0027 # CMake 2.8+ syntax only: 0028 #foreach(dep IN LISTS DEPS) 0029 foreach(dep ${DEPS}) 0030 soci_check_package_found(${dep} DEPEND_FOUND) 0031 if(NOT DEPEND_FOUND) 0032 list(APPEND DEPS_NOT_FOUND ${dep}) 0033 else() 0034 string(TOUPPER "${dep}" DEPU) 0035 if( ${DEPU}_INCLUDE_DIR ) 0036 list(APPEND DEPS_INCLUDE_DIRS ${${DEPU}_INCLUDE_DIR}) 0037 endif() 0038 if( ${DEPU}_INCLUDE_DIRS ) 0039 list(APPEND DEPS_INCLUDE_DIRS ${${DEPU}_INCLUDE_DIRS}) 0040 endif() 0041 list(APPEND DEPS_LIBRARIES ${${DEPU}_LIBRARIES}) 0042 endif() 0043 endforeach() 0044 0045 list(LENGTH DEPS_NOT_FOUND NOT_FOUND_COUNT) 0046 0047 if (NOT_FOUND_COUNT GREATER 0) 0048 set(${SUCCESS} False) 0049 else() 0050 set(${NAME}_DEPS_INCLUDE_DIRS ${DEPS_INCLUDE_DIRS}) 0051 set(${NAME}_DEPS_LIBRARIES ${DEPS_LIBRARIES}) 0052 set(${SUCCESS} True) 0053 endif() 0054 0055 #message(STATUS "soci_backend_deps_found: ${SUCCESS}=${${SUCCESS}}") 0056 endmacro() 0057 0058 # Defines project of a database backend for SOCI library 0059 # 0060 # soci_backend(backendname 0061 # DEPENDS dependency1 dependency2 0062 # DESCRIPTION description 0063 # AUTHORS author1 author2 0064 # MAINTAINERS maintainer1 maintainer2) 0065 # 0066 macro(soci_backend NAME) 0067 parse_arguments(THIS_BACKEND 0068 "DEPENDS;DESCRIPTION;AUTHORS;MAINTAINERS;" 0069 "" 0070 ${ARGN}) 0071 0072 colormsg(HIGREEN "${NAME} - ${THIS_BACKEND_DESCRIPTION}") 0073 0074 # Backend name variants utils 0075 string(TOLOWER "${PROJECT_NAME}" PROJECTNAMEL) 0076 string(TOLOWER "${NAME}" NAMEL) 0077 string(TOUPPER "${NAME}" NAMEU) 0078 0079 # Backend option available to user 0080 set(THIS_BACKEND_OPTION SOCI_${NAMEU}) 0081 0082 soci_backend_deps_found(${NAMEU} "${THIS_BACKEND_DEPENDS}" ${NAMEU}_DEPS_FOUND) 0083 if(NOT ${NAMEU}_DEPS_FOUND) 0084 0085 colormsg(_RED_ "WARNING: Some required dependencies of ${NAME} backend not found:") 0086 0087 if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 2.8) 0088 foreach(dep ${DEPENDS_NOT_FOUND}) 0089 colormsg(RED " ${dep}") 0090 endforeach() 0091 else() 0092 foreach(dep IN LISTS DEPENDS_NOT_FOUND) 0093 colormsg(RED " ${dep}") 0094 endforeach() 0095 endif() 0096 0097 # TODO: Abort or warn compilation may fail? --mloskot 0098 colormsg(RED "Skipping") 0099 0100 set(${THIS_BACKEND_OPTION} OFF) 0101 0102 else() 0103 0104 if(${THIS_BACKEND_OPTION}) 0105 0106 get_directory_property(THIS_INCLUDE_DIRS INCLUDE_DIRECTORIES) 0107 get_directory_property(THIS_COMPILE_DEFS COMPILE_DEFINITIONS) 0108 0109 # Backend-specific depedencies 0110 set(THIS_BACKEND_DEPENDS_INCLUDE_DIRS ${${NAMEU}_DEPS_INCLUDE_DIRS}) 0111 set(THIS_BACKEND_DEPENDS_LIBRARIES ${${NAMEU}_DEPS_LIBRARIES}) 0112 set(THIS_BACKEND_DEPENDS_DEFS ${${NAMEU}_DEPS_DEFS}) 0113 0114 # Collect include directories 0115 list(APPEND THIS_INCLUDE_DIRS ${SOCI_SOURCE_DIR}/include/private) 0116 list(APPEND THIS_INCLUDE_DIRS ${THIS_BACKEND_DEPENDS_INCLUDE_DIRS}) 0117 # Collect compile definitions 0118 list(APPEND THIS_COMPILE_DEFS ${THIS_BACKEND_DEPENDS_DEFS}) 0119 0120 set_directory_properties(PROPERTIES 0121 INCLUDE_DIRECTORIES "${THIS_INCLUDE_DIRS}" 0122 COMPILE_DEFINITIONS "${THIS_COMPILE_DEFS}") 0123 0124 # Backend target 0125 set(THIS_BACKEND_VAR SOCI_${NAMEU}) 0126 set(THIS_BACKEND_TARGET ${PROJECTNAMEL}_${NAMEL}) 0127 set(THIS_BACKEND_TARGET_VAR ${THIS_BACKEND_VAR}_TARGET) 0128 set(${THIS_BACKEND_TARGET_VAR} ${THIS_BACKEND_TARGET}) 0129 0130 soci_target_output_name(${THIS_BACKEND_TARGET} ${THIS_BACKEND_VAR}_OUTPUT_NAME) 0131 0132 set(THIS_BACKEND_OUTPUT_NAME ${${THIS_BACKEND_VAR}_OUTPUT_NAME}) 0133 set(THIS_BACKEND_OUTPUT_NAME_VAR ${THIS_BACKEND_VAR}_OUTPUT_NAME) 0134 0135 set(${THIS_BACKEND_VAR}_COMPILE_DEFINITIONS ${THIS_COMPILE_DEFS}) 0136 set(THIS_BACKEND_COMPILE_DEFINITIONS_VAR ${THIS_BACKEND_VAR}_COMPILE_DEFINITIONS) 0137 0138 set(${THIS_BACKEND_VAR}_INCLUDE_DIRECTORIES ${THIS_INCLUDE_DIRS}) 0139 set(THIS_BACKEND_INCLUDE_DIRECTORIES_VAR ${THIS_BACKEND_VAR}_INCLUDE_DIRECTORIES) 0140 0141 # Backend installable headers and sources 0142 file(GLOB THIS_BACKEND_HEADERS ${SOCI_SOURCE_DIR}/include/soci/${NAMEL}/*.h) 0143 file(GLOB THIS_BACKEND_SOURCES *.cpp) 0144 set(THIS_BACKEND_HEADERS_VAR SOCI_${NAMEU}_HEADERS) 0145 set(${THIS_BACKEND_HEADERS_VAR} ${THIS_BACKEND_HEADERS}) 0146 # Group source files for IDE source explorers (e.g. Visual Studio) 0147 source_group("Header Files" FILES ${THIS_BACKEND_HEADERS}) 0148 source_group("Source Files" FILES ${THIS_BACKEND_SOURCES}) 0149 source_group("CMake Files" FILES CMakeLists.txt) 0150 0151 # TODO: Extract as macros: soci_shared_lib_target and soci_static_lib_target --mloskot 0152 # Shared library target 0153 if (SOCI_SHARED) 0154 add_library(${THIS_BACKEND_TARGET} 0155 SHARED 0156 ${THIS_BACKEND_SOURCES} 0157 ${THIS_BACKEND_HEADERS}) 0158 add_library(Soci::${NAMEL} ALIAS ${THIS_BACKEND_TARGET}) 0159 0160 target_link_libraries(${THIS_BACKEND_TARGET} 0161 ${SOCI_CORE_TARGET} 0162 ${THIS_BACKEND_DEPENDS_LIBRARIES}) 0163 0164 if(WIN32) 0165 set_target_properties(${THIS_BACKEND_TARGET} 0166 PROPERTIES 0167 OUTPUT_NAME ${THIS_BACKEND_OUTPUT_NAME} 0168 DEFINE_SYMBOL SOCI_DLL) 0169 else() 0170 set_target_properties(${THIS_BACKEND_TARGET} 0171 PROPERTIES 0172 SOVERSION ${${PROJECT_NAME}_SOVERSION} 0173 INSTALL_NAME_DIR ${CMAKE_INSTALL_PREFIX}/lib) 0174 0175 if(APPLE) 0176 set_target_properties(${THIS_BACKEND_TARGET} 0177 PROPERTIES 0178 LINK_FLAGS "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress") 0179 endif() 0180 endif() 0181 0182 set_target_properties(${THIS_BACKEND_TARGET} 0183 PROPERTIES 0184 VERSION ${${PROJECT_NAME}_VERSION} 0185 CLEAN_DIRECT_OUTPUT 1) 0186 endif() 0187 0188 # Static library target 0189 if(SOCI_STATIC) 0190 set(THIS_BACKEND_TARGET_STATIC ${THIS_BACKEND_TARGET}_static) 0191 0192 add_library(${THIS_BACKEND_TARGET_STATIC} 0193 STATIC 0194 ${THIS_BACKEND_SOURCES} 0195 ${THIS_BACKEND_HEADERS}) 0196 add_library(Soci::${NAMEL}_static ALIAS ${THIS_BACKEND_TARGET_STATIC}) 0197 0198 # Still need to link the libraries for tests to work 0199 target_link_libraries (${THIS_BACKEND_TARGET_STATIC} 0200 ${THIS_BACKEND_DEPENDS_LIBRARIES} 0201 ) 0202 0203 set_target_properties(${THIS_BACKEND_TARGET_STATIC} 0204 PROPERTIES 0205 OUTPUT_NAME ${THIS_BACKEND_OUTPUT_NAME} 0206 PREFIX "lib" 0207 CLEAN_DIRECT_OUTPUT 1) 0208 endif() 0209 0210 # Backend installation 0211 install(FILES ${THIS_BACKEND_HEADERS} 0212 DESTINATION 0213 ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECTNAMEL}/${NAMEL}) 0214 0215 if (SOCI_SHARED) 0216 install(TARGETS ${THIS_BACKEND_TARGET} 0217 EXPORT SOCI 0218 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 0219 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 0220 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) 0221 endif() 0222 0223 if (SOCI_STATIC) 0224 install(TARGETS ${THIS_BACKEND_TARGET_STATIC} 0225 EXPORT SOCI 0226 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 0227 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 0228 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 0229 ) 0230 endif() 0231 0232 else() 0233 colormsg(YELLOW "${NAME} backend explicitly disabled") 0234 endif() 0235 0236 endif() 0237 0238 boost_report_value(${THIS_BACKEND_OPTION}) 0239 0240 if(${THIS_BACKEND_OPTION}) 0241 boost_report_value(${THIS_BACKEND_TARGET_VAR}) 0242 boost_report_value(${THIS_BACKEND_OUTPUT_NAME_VAR}) 0243 boost_report_value(${THIS_BACKEND_COMPILE_DEFINITIONS_VAR}) 0244 boost_report_value(${THIS_BACKEND_INCLUDE_DIRECTORIES_VAR}) 0245 endif() 0246 0247 # LOG 0248 #message("soci_backend:") 0249 #message("NAME: ${NAME}") 0250 #message("${THIS_BACKEND_OPTION} = ${SOCI_BACKEND_SQLITE3}") 0251 #message("DEPENDS: ${THIS_BACKEND_DEPENDS}") 0252 #message("DESCRIPTION: ${THIS_BACKEND_DESCRIPTION}") 0253 #message("AUTHORS: ${THIS_BACKEND_AUTHORS}") 0254 #message("MAINTAINERS: ${THIS_BACKEND_MAINTAINERS}") 0255 #message("SOURCES: ${THIS_BACKEND_SOURCES}") 0256 #message("DEPENDS_LIBRARIES: ${THIS_BACKEND_DEPENDS_LIBRARIES}") 0257 #message("DEPENDS_INCLUDE_DIRS: ${THIS_BACKEND_DEPENDS_INCLUDE_DIRS}") 0258 endmacro() 0259 0260 # Generates .vcxproj.user for target of each test. 0261 # 0262 # soci_backend_test_create_vcxproj_user( 0263 # PostgreSQLTest 0264 # "host=localhost dbname=soci_test user=mloskot") 0265 # 0266 function(soci_backend_test_create_vcxproj_user TARGET_NAME TEST_CMD_ARGS) 0267 if(MSVC) 0268 set(SYSTEM_NAME $ENV{USERDOMAIN}) 0269 set(USER_NAME $ENV{USERNAME}) 0270 set(SOCI_TEST_CMD_ARGS ${TEST_CMD_ARGS}) 0271 0272 if(MSVC_VERSION EQUAL 1600) 0273 configure_file( 0274 ${SOCI_SOURCE_DIR}/cmake/resources/vs2010-test-cmd-args.vcxproj.user.in 0275 ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.vcxproj.user 0276 @ONLY) 0277 endif() 0278 endif() 0279 endfunction(soci_backend_test_create_vcxproj_user) 0280 0281 # Defines test project of a database backend for SOCI library 0282 # 0283 # soci_backend_test(BACKEND mybackend SOURCE mytest1.cpp 0284 # NAME mytest1 0285 # CONNSTR "my test connection" 0286 # DEPENDS library1 library2) 0287 # 0288 macro(soci_backend_test) 0289 parse_arguments(THIS_TEST 0290 "BACKEND;SOURCE;CONNSTR;NAME;DEPENDS;" 0291 "" 0292 ${ARGN}) 0293 0294 # Test backend name 0295 string(TOUPPER "${THIS_TEST_BACKEND}" BACKENDU) 0296 string(TOLOWER "${THIS_TEST_BACKEND}" BACKENDL) 0297 0298 if(SOCI_TESTS AND SOCI_${BACKENDU} AND NOT SOCI_${BACKENDU}_DO_NOT_TEST) 0299 0300 # Test name 0301 if(THIS_TEST_NAME) 0302 string(TOUPPER "${THIS_TEST_NAME}" NAMEU) 0303 set(TEST_FULL_NAME SOCI_${BACKENDU}_TEST_${NAMEU}) 0304 else() 0305 set(TEST_FULL_NAME SOCI_${BACKENDU}_TEST) 0306 endif() 0307 string(TOLOWER "${TEST_FULL_NAME}" TEST_TARGET) 0308 string(TOUPPER "${TEST_FULL_NAME}" NAMEU) 0309 0310 soci_backend_deps_found(${NAMEU} "${THIS_TEST_DEPENDS}" ${NAMEU}_DEPS_FOUND) 0311 if(${NAMEU}_DEPS_FOUND) 0312 get_directory_property(THIS_INCLUDE_DIRS INCLUDE_DIRECTORIES) 0313 get_directory_property(THIS_COMPILE_DEFS COMPILE_DEFINITIONS) 0314 0315 set(THIS_TEST_DEPENDS_INCLUDE_DIRS ${${NAMEU}_DEPS_INCLUDE_DIRS}) 0316 set(THIS_TEST_DEPENDS_LIBRARIES ${${NAMEU}_DEPS_LIBRARIES}) 0317 set(THIS_TEST_DEPENDS_DEFS ${${NAMEU}_DEPS_DEFS}) 0318 0319 list(APPEND THIS_INCLUDE_DIRS ${THIS_TEST_DEPENDS_INCLUDE_DIRS}) 0320 list(APPEND THIS_COMPILE_DEFS ${THIS_TEST_DEPENDS_DEFS}) 0321 0322 set_directory_properties(PROPERTIES 0323 INCLUDE_DIRECTORIES "${THIS_INCLUDE_DIRS}" 0324 COMPILE_DEFINITIONS "${THIS_COMPILE_DEFS}") 0325 else() 0326 colormsg(_RED_ "WARNING: Some dependencies of ${THIS_TEST_BACKEND} test not found") 0327 endif() 0328 0329 set(TEST_CONNSTR_VAR ${TEST_FULL_NAME}_CONNSTR) 0330 set(${TEST_CONNSTR_VAR} "" 0331 CACHE STRING "Connection string for ${BACKENDU} test") 0332 0333 if(NOT ${TEST_CONNSTR_VAR} AND THIS_TEST_CONNSTR) 0334 set(${TEST_CONNSTR_VAR} ${THIS_TEST_CONNSTR}) 0335 endif() 0336 0337 boost_message_value(${TEST_CONNSTR_VAR}) 0338 0339 if( SOCI_SHARED ) 0340 # Shared libraries test 0341 add_executable(${TEST_TARGET} ${THIS_TEST_SOURCE}) 0342 0343 target_link_libraries(${TEST_TARGET} 0344 ${SOCI_CORE_DEPS_LIBS} 0345 ${THIS_TEST_DEPENDS_LIBRARIES} 0346 soci_core 0347 soci_${BACKENDL}) 0348 0349 add_test(${TEST_TARGET} 0350 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_TARGET} 0351 ${${TEST_CONNSTR_VAR}} --invisibles) 0352 0353 soci_backend_test_create_vcxproj_user(${TEST_TARGET} "\"${${TEST_CONNSTR_VAR}}\"") 0354 0355 # Ask make check to try to build tests first before executing them 0356 add_dependencies(check ${TEST_TARGET}) 0357 endif(SOCI_SHARED) 0358 0359 # Static libraries test 0360 if(SOCI_STATIC) 0361 set(TEST_TARGET_STATIC ${TEST_TARGET}_static) 0362 0363 add_executable(${TEST_TARGET_STATIC} ${THIS_TEST_SOURCE}) 0364 0365 target_link_libraries(${TEST_TARGET_STATIC} 0366 ${SOCI_CORE_DEPS_LIBS} 0367 ${THIS_TEST_DEPENDS_LIBRARIES} 0368 soci_${BACKENDL}_static 0369 soci_core_static) 0370 0371 add_test(${TEST_TARGET_STATIC} 0372 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_TARGET_STATIC} 0373 ${${TEST_CONNSTR_VAR}} --invisibles) 0374 0375 soci_backend_test_create_vcxproj_user(${TEST_TARGET_STATIC} "\"${${TEST_CONNSTR_VAR}}\"") 0376 0377 # Ask make check to try to build tests first before executing them 0378 add_dependencies(check ${TEST_TARGET_STATIC}) 0379 endif(SOCI_STATIC) 0380 0381 0382 0383 # Group source files for IDE source explorers (e.g. Visual Studio) 0384 source_group("Source Files" FILES ${THIS_TEST_SOURCE}) 0385 source_group("CMake Files" FILES CMakeLists.txt) 0386 0387 endif() 0388 endmacro()