Warning, /sdk/codevis/thirdparty/soci/cmake/modules/FindODBC.cmake is written in an unsupported language. File is not indexed.

0001 # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
0002 # file Copyright.txt or https://cmake.org/licensing for details.
0003 
0004 #[=======================================================================[.rst:
0005 FindODBC
0006 --------
0007 
0008 Find the ODBC include directory and library.
0009 
0010 Use this module by invoking find_package with the form::
0011 
0012 .. code-block:: cmake
0013 
0014   find_package(ODBC
0015     [REQUIRED]             # Fail with error if ODBC is not found
0016   )
0017 
0018 On Windows, when building with Visual Studio, this module assumes the ODBC
0019 library is provided by the available Windows SDK.
0020 
0021 On Unix, this module allows to search for ODBC library provided by
0022 unixODBC or iODBC implementations of ODBC API.
0023 This module reads hint about location of the config program:
0024 
0025 .. variable:: ODBC_CONFIG
0026 
0027   Location of odbc_config or iodbc-config program
0028 
0029 Otherwise, this module tries to find the config program,
0030 first from unixODBC, then from iODBC.
0031 If no config program found, this module searches for ODBC header
0032 and library in list of known locations.
0033 
0034 Imported targets
0035 ^^^^^^^^^^^^^^^^
0036 
0037 This module defines the following :prop_tgt:`IMPORTED` targets:
0038 
0039 .. variable:: ODBC::ODBC
0040 
0041   Imported target for using the ODBC library, if found.
0042 
0043 Result variables
0044 ^^^^^^^^^^^^^^^^
0045 
0046 .. variable:: ODBC_FOUND
0047 
0048   Set to true if ODBC library found, otherwise false or undefined.
0049 
0050 .. variable:: ODBC_INCLUDE_DIRS
0051 
0052   Paths to include directories listed in one variable for use by ODBC client.
0053   May be empty on Windows, where the include directory corresponding to the
0054   expected Windows SDK is already available in the compilation environment.
0055 
0056 .. variable:: ODBC_LIBRARIES
0057 
0058   Paths to libraries to linked against to use ODBC.
0059   May just a library name on Windows, where the library directory corresponding
0060   to the expected Windows SDK is already available in the compilation environment.
0061 
0062 .. variable:: ODBC_CONFIG
0063 
0064   Path to unixODBC or iODBC config program, if found or specified.
0065 
0066 Cache variables
0067 ^^^^^^^^^^^^^^^
0068 
0069 For users who wish to edit and control the module behavior, this module
0070 reads hints about search locations from the following variables::
0071 
0072 .. variable:: ODBC_INCLUDE_DIR
0073 
0074   Path to ODBC include directory with ``sql.h`` header.
0075 
0076 .. variable:: ODBC_LIBRARY
0077 
0078   Path to ODBC library to be linked.
0079 
0080 NOTE: The variables above should not usually be used in CMakeLists.txt files!
0081 
0082 Limitations
0083 ^^^^^^^^^^^
0084 
0085 On Windows, this module does not search for iODBC.
0086 On Unix, there is no way to prefer unixODBC over iODBC, or vice versa,
0087 other than providing the config program location using the ``ODBC_CONFIG``.
0088 This module does not allow to search for a specific ODBC driver.
0089 
0090 #]=======================================================================]
0091 
0092 ### Try Windows Kits ##########################################################
0093 if(WIN32)
0094   # List names of ODBC libraries on Windows
0095   set(ODBC_LIBRARY odbc32.lib)
0096   set(_odbc_lib_names odbc32;)
0097 
0098   # List additional libraries required to use ODBC library
0099   if(MSVC OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
0100     set(_odbc_required_libs_names odbccp32;ws2_32)
0101   elseif(MINGW)
0102     set(_odbc_required_libs_names odbccp32)
0103   endif()
0104 endif()
0105 
0106 ### Try unixODBC or iODBC config program ######################################
0107 if (UNIX AND NOT ODBC_CONFIG)
0108   find_program(ODBC_CONFIG
0109     NAMES odbc_config iodbc-config
0110     DOC "Path to unixODBC or iODBC config program")
0111 endif()
0112 
0113 if (UNIX AND ODBC_CONFIG)
0114   # unixODBC and iODBC accept unified command line options
0115   execute_process(COMMAND ${ODBC_CONFIG} --cflags
0116     OUTPUT_VARIABLE _cflags OUTPUT_STRIP_TRAILING_WHITESPACE)
0117   execute_process(COMMAND ${ODBC_CONFIG} --libs
0118     OUTPUT_VARIABLE _libs OUTPUT_STRIP_TRAILING_WHITESPACE)
0119 
0120   # Collect paths of include directories from CFLAGS
0121   separate_arguments(_cflags NATIVE_COMMAND "${_cflags}")
0122   foreach(arg IN LISTS _cflags)
0123     if("${arg}" MATCHES "^-I(.*)$")
0124       list(APPEND _odbc_include_paths "${CMAKE_MATCH_1}")
0125     endif()
0126   endforeach()
0127   unset(_cflags)
0128 
0129   # Collect paths of library names and directories from LIBS
0130   separate_arguments(_libs NATIVE_COMMAND "${_libs}")
0131   foreach(arg IN LISTS _libs)
0132     if("${arg}" MATCHES "^-L(.*)$")
0133       list(APPEND _odbc_lib_paths "${CMAKE_MATCH_1}")
0134     elseif("${arg}" MATCHES "^-l(.*)$")
0135       set(_lib_name ${CMAKE_MATCH_1})
0136       string(REGEX MATCH "odbc" _is_odbc ${_lib_name})
0137       if(_is_odbc)
0138         list(APPEND _odbc_lib_names ${_lib_name})
0139       else()
0140         list(APPEND _odbc_required_libs_names ${_lib_name})
0141       endif()
0142       unset(_lib_name)
0143     endif()
0144   endforeach()
0145   unset(_libs)
0146 endif()
0147 
0148 ### Try unixODBC or iODBC in include/lib filesystems ##########################
0149 if (UNIX AND NOT ODBC_CONFIG)
0150   # List names of both ODBC libraries, unixODBC and iODBC
0151   set(_odbc_lib_names odbc;iodbc;unixodbc;)
0152 
0153   set(_odbc_include_paths
0154     /usr/local/odbc/include)
0155 
0156   set(_odbc_lib_paths
0157     /usr/local/odbc/lib)
0158 endif()
0159 
0160 # DEBUG
0161 #message("ODBC_CONFIG=${ODBC_CONFIG}")
0162 #message("_odbc_include_hints=${_odbc_include_hints}")
0163 #message("_odbc_include_paths=${_odbc_include_paths}")
0164 #message("_odbc_lib_paths=${_odbc_lib_paths}")
0165 #message("_odbc_lib_names=${_odbc_lib_names}")
0166 
0167 ### Find include directories ##################################################
0168 find_path(ODBC_INCLUDE_DIR
0169   NAMES sql.h
0170   HINTS ${_odbc_include_hints}
0171   PATHS ${_odbc_include_paths})
0172 
0173 if(NOT ODBC_INCLUDE_DIR AND WIN32)
0174   set(ODBC_INCLUDE_DIR "")
0175 endif()
0176 
0177 ### Find libraries ############################################################
0178 if(NOT ODBC_LIBRARY)
0179   find_library(ODBC_LIBRARY
0180     NAMES ${_odbc_lib_names}
0181     PATHS ${_odbc_lib_paths}
0182     PATH_SUFFIXES odbc)
0183 
0184   foreach(_lib IN LISTS _odbc_required_libs_names)
0185     find_library(_lib_path
0186       NAMES ${_lib}
0187       PATHS ${_odbc_lib_paths} # system parths or collected from ODBC_CONFIG
0188       PATH_SUFFIXES odbc)
0189     if (_lib_path)
0190       list(APPEND _odbc_required_libs_paths ${_lib_path})
0191     endif()
0192     unset(_lib_path CACHE)
0193   endforeach()
0194 
0195   unset(_odbc_lib_names)
0196   unset(_odbc_lib_paths)
0197   unset(_odbc_required_libs_names)
0198 endif()
0199 
0200 ### Set result variables ######################################################
0201 set(REQUIRED_VARS ODBC_LIBRARY)
0202 if(NOT WIN32)
0203   list(APPEND REQUIRED_VARS ODBC_INCLUDE_DIR)
0204 endif()
0205 
0206 include(FindPackageHandleStandardArgs)
0207 find_package_handle_standard_args(ODBC DEFAULT_MSG ${REQUIRED_VARS})
0208 
0209 mark_as_advanced(FORCE ODBC_LIBRARY ODBC_INCLUDE_DIR)
0210 
0211 if(ODBC_CONFIG)
0212   mark_as_advanced(FORCE ODBC_CONFIG)
0213 endif()
0214 
0215 set(ODBC_INCLUDE_DIRS ${ODBC_INCLUDE_DIR})
0216 list(APPEND ODBC_LIBRARIES ${ODBC_LIBRARY})
0217 list(APPEND ODBC_LIBRARIES ${_odbc_required_libs_paths})
0218 
0219 ### Import targets ############################################################
0220 if(ODBC_FOUND)
0221   if(NOT TARGET ODBC::ODBC)
0222     if(IS_ABSOLUTE "${ODBC_LIBRARY}")
0223       add_library(ODBC::ODBC UNKNOWN IMPORTED)
0224       set_target_properties(ODBC::ODBC PROPERTIES
0225         IMPORTED_LINK_INTERFACE_LANGUAGES "C"
0226         IMPORTED_LOCATION "${ODBC_LIBRARY}")
0227     else()
0228       add_library(ODBC::ODBC INTERFACE IMPORTED)
0229       set_target_properties(ODBC::ODBC PROPERTIES
0230         IMPORTED_LIBNAME "${ODBC_LIBRARY}")
0231     endif()
0232     set_target_properties(ODBC::ODBC PROPERTIES
0233       INTERFACE_INCLUDE_DIRECTORIES "${ODBC_INCLUDE_DIR}")
0234 
0235     if(_odbc_required_libs_paths)
0236       set_property(TARGET ODBC::ODBC APPEND PROPERTY
0237         INTERFACE_LINK_LIBRARIES "${_odbc_required_libs_paths}")
0238     endif()
0239   endif()
0240 endif()
0241 
0242 unset(_odbc_required_libs_paths)