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()