mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			228 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
 | 
						|
# file Copyright.txt or https://cmake.org/licensing for details.
 | 
						|
 | 
						|
#[=======================================================================[.rst:
 | 
						|
FindODBC
 | 
						|
--------
 | 
						|
 | 
						|
Find an Open Database Connectivity (ODBC) include directory and library.
 | 
						|
 | 
						|
On Windows, when building with Visual Studio, this module assumes the ODBC
 | 
						|
library is provided by the available Windows SDK.
 | 
						|
 | 
						|
On Unix, this module allows searching for ODBC library provided by
 | 
						|
unixODBC or iODBC implementations of ODBC API.
 | 
						|
This module reads hint about location of the config program:
 | 
						|
 | 
						|
.. variable:: ODBC_CONFIG
 | 
						|
 | 
						|
  Location of odbc_config or iodbc-config program
 | 
						|
 | 
						|
Otherwise, this module tries to find the config program,
 | 
						|
first from unixODBC, then from iODBC.
 | 
						|
If no config program found, this module searches for ODBC header
 | 
						|
and library in list of known locations.
 | 
						|
 | 
						|
Imported targets
 | 
						|
^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
This module defines the following :prop_tgt:`IMPORTED` targets:
 | 
						|
 | 
						|
.. variable:: ODBC::ODBC
 | 
						|
 | 
						|
  Imported target for using the ODBC library, if found.
 | 
						|
 | 
						|
Result variables
 | 
						|
^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
.. variable:: ODBC_FOUND
 | 
						|
 | 
						|
  Set to true if ODBC library found, otherwise false or undefined.
 | 
						|
 | 
						|
.. variable:: ODBC_INCLUDE_DIRS
 | 
						|
 | 
						|
  Paths to include directories listed in one variable for use by ODBC client.
 | 
						|
  May be empty on Windows, where the include directory corresponding to the
 | 
						|
  expected Windows SDK is already available in the compilation environment.
 | 
						|
 | 
						|
.. variable:: ODBC_LIBRARIES
 | 
						|
 | 
						|
  Paths to libraries to linked against to use ODBC.
 | 
						|
  May just a library name on Windows, where the library directory corresponding
 | 
						|
  to the expected Windows SDK is already available in the compilation environment.
 | 
						|
 | 
						|
.. variable:: ODBC_CONFIG
 | 
						|
 | 
						|
  Path to unixODBC or iODBC config program, if found or specified.
 | 
						|
 | 
						|
Cache variables
 | 
						|
^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
For users who wish to edit and control the module behavior, this module
 | 
						|
reads hints about search locations from the following variables:
 | 
						|
 | 
						|
.. variable:: ODBC_INCLUDE_DIR
 | 
						|
 | 
						|
  Path to ODBC include directory with ``sql.h`` header.
 | 
						|
 | 
						|
.. variable:: ODBC_LIBRARY
 | 
						|
 | 
						|
  Path to ODBC library to be linked.
 | 
						|
 | 
						|
These variables should not be used directly by project code.
 | 
						|
 | 
						|
Limitations
 | 
						|
^^^^^^^^^^^
 | 
						|
 | 
						|
On Windows, this module does not search for iODBC.
 | 
						|
On Unix, there is no way to prefer unixODBC over iODBC, or vice versa,
 | 
						|
other than providing the config program location using the ``ODBC_CONFIG``.
 | 
						|
This module does not allows searching for a specific ODBC driver.
 | 
						|
 | 
						|
#]=======================================================================]
 | 
						|
 | 
						|
# Define lists used internally
 | 
						|
set(_odbc_include_paths)
 | 
						|
set(_odbc_lib_paths)
 | 
						|
set(_odbc_lib_names)
 | 
						|
set(_odbc_required_libs_names)
 | 
						|
 | 
						|
### Try Windows Kits ##########################################################
 | 
						|
if(WIN32)
 | 
						|
  # List names of ODBC libraries on Windows
 | 
						|
  set(ODBC_LIBRARY odbc32.lib)
 | 
						|
  set(_odbc_lib_names odbc32;)
 | 
						|
 | 
						|
  # List additional libraries required to use ODBC library
 | 
						|
  if(MSVC OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
 | 
						|
    set(_odbc_required_libs_names odbccp32;ws2_32)
 | 
						|
  elseif(MINGW)
 | 
						|
    set(_odbc_required_libs_names odbccp32)
 | 
						|
  endif()
 | 
						|
endif()
 | 
						|
 | 
						|
### Try unixODBC or iODBC config program ######################################
 | 
						|
if (UNIX)
 | 
						|
  find_program(ODBC_CONFIG
 | 
						|
    NAMES odbc_config iodbc-config
 | 
						|
    DOC "Path to unixODBC or iODBC config program")
 | 
						|
  mark_as_advanced(ODBC_CONFIG)
 | 
						|
endif()
 | 
						|
 | 
						|
if (UNIX AND ODBC_CONFIG)
 | 
						|
  # unixODBC and iODBC accept unified command line options
 | 
						|
  execute_process(COMMAND ${ODBC_CONFIG} --cflags
 | 
						|
    OUTPUT_VARIABLE _cflags OUTPUT_STRIP_TRAILING_WHITESPACE)
 | 
						|
  execute_process(COMMAND ${ODBC_CONFIG} --libs
 | 
						|
    OUTPUT_VARIABLE _libs OUTPUT_STRIP_TRAILING_WHITESPACE)
 | 
						|
 | 
						|
  # Collect paths of include directories from CFLAGS
 | 
						|
  separate_arguments(_cflags NATIVE_COMMAND "${_cflags}")
 | 
						|
  foreach(arg IN LISTS _cflags)
 | 
						|
    if("${arg}" MATCHES "^-I(.*)$")
 | 
						|
      list(APPEND _odbc_include_paths "${CMAKE_MATCH_1}")
 | 
						|
    endif()
 | 
						|
  endforeach()
 | 
						|
  unset(_cflags)
 | 
						|
 | 
						|
  # Collect paths of library names and directories from LIBS
 | 
						|
  separate_arguments(_libs NATIVE_COMMAND "${_libs}")
 | 
						|
  foreach(arg IN LISTS _libs)
 | 
						|
    if("${arg}" MATCHES "^-L(.*)$")
 | 
						|
      list(APPEND _odbc_lib_paths "${CMAKE_MATCH_1}")
 | 
						|
    elseif("${arg}" MATCHES "^-l(.*)$")
 | 
						|
      set(_lib_name ${CMAKE_MATCH_1})
 | 
						|
      string(REGEX MATCH "odbc" _is_odbc ${_lib_name})
 | 
						|
      if(_is_odbc)
 | 
						|
        list(APPEND _odbc_lib_names ${_lib_name})
 | 
						|
      else()
 | 
						|
        list(APPEND _odbc_required_libs_names ${_lib_name})
 | 
						|
      endif()
 | 
						|
      unset(_lib_name)
 | 
						|
    endif()
 | 
						|
  endforeach()
 | 
						|
  unset(_libs)
 | 
						|
endif()
 | 
						|
 | 
						|
### Try unixODBC or iODBC in include/lib filesystems ##########################
 | 
						|
if (UNIX AND NOT ODBC_CONFIG)
 | 
						|
  # List names of both ODBC libraries, unixODBC and iODBC
 | 
						|
  set(_odbc_lib_names odbc;iodbc;unixodbc;)
 | 
						|
endif()
 | 
						|
 | 
						|
### Find include directories ##################################################
 | 
						|
find_path(ODBC_INCLUDE_DIR
 | 
						|
  NAMES sql.h
 | 
						|
  PATHS ${_odbc_include_paths})
 | 
						|
 | 
						|
if(NOT ODBC_INCLUDE_DIR AND WIN32)
 | 
						|
  set(ODBC_INCLUDE_DIR "")
 | 
						|
endif()
 | 
						|
 | 
						|
### Find libraries ############################################################
 | 
						|
if(NOT ODBC_LIBRARY)
 | 
						|
  find_library(ODBC_LIBRARY
 | 
						|
    NAMES ${_odbc_lib_names}
 | 
						|
    PATHS ${_odbc_lib_paths}
 | 
						|
    PATH_SUFFIXES odbc)
 | 
						|
 | 
						|
  foreach(_lib IN LISTS _odbc_required_libs_names)
 | 
						|
    find_library(_lib_path
 | 
						|
      NAMES ${_lib}
 | 
						|
      PATHS ${_odbc_lib_paths} # system parths or collected from ODBC_CONFIG
 | 
						|
      PATH_SUFFIXES odbc)
 | 
						|
    if(_lib_path)
 | 
						|
      list(APPEND _odbc_required_libs_paths ${_lib_path})
 | 
						|
    endif()
 | 
						|
    unset(_lib_path CACHE)
 | 
						|
  endforeach()
 | 
						|
endif()
 | 
						|
 | 
						|
# Unset internal lists as no longer used
 | 
						|
unset(_odbc_include_paths)
 | 
						|
unset(_odbc_lib_paths)
 | 
						|
unset(_odbc_lib_names)
 | 
						|
unset(_odbc_required_libs_names)
 | 
						|
 | 
						|
### Set result variables ######################################################
 | 
						|
set(_odbc_required_vars ODBC_LIBRARY)
 | 
						|
if(NOT WIN32)
 | 
						|
  list(APPEND _odbc_required_vars ODBC_INCLUDE_DIR)
 | 
						|
endif()
 | 
						|
 | 
						|
include(FindPackageHandleStandardArgs)
 | 
						|
find_package_handle_standard_args(ODBC DEFAULT_MSG ${_odbc_required_vars})
 | 
						|
 | 
						|
unset(_odbc_required_vars)
 | 
						|
 | 
						|
mark_as_advanced(ODBC_LIBRARY ODBC_INCLUDE_DIR)
 | 
						|
 | 
						|
set(ODBC_INCLUDE_DIRS ${ODBC_INCLUDE_DIR})
 | 
						|
list(APPEND ODBC_LIBRARIES ${ODBC_LIBRARY})
 | 
						|
list(APPEND ODBC_LIBRARIES ${_odbc_required_libs_paths})
 | 
						|
 | 
						|
### Import targets ############################################################
 | 
						|
if(ODBC_FOUND)
 | 
						|
  if(NOT TARGET ODBC::ODBC)
 | 
						|
    if(IS_ABSOLUTE "${ODBC_LIBRARY}")
 | 
						|
      add_library(ODBC::ODBC UNKNOWN IMPORTED)
 | 
						|
      set_target_properties(ODBC::ODBC PROPERTIES
 | 
						|
        IMPORTED_LINK_INTERFACE_LANGUAGES "C"
 | 
						|
        IMPORTED_LOCATION "${ODBC_LIBRARY}")
 | 
						|
    else()
 | 
						|
      add_library(ODBC::ODBC INTERFACE IMPORTED)
 | 
						|
      set_target_properties(ODBC::ODBC PROPERTIES
 | 
						|
        IMPORTED_LIBNAME "${ODBC_LIBRARY}")
 | 
						|
    endif()
 | 
						|
    set_target_properties(ODBC::ODBC PROPERTIES
 | 
						|
      INTERFACE_INCLUDE_DIRECTORIES "${ODBC_INCLUDE_DIR}")
 | 
						|
 | 
						|
    if(_odbc_required_libs_paths)
 | 
						|
      set_property(TARGET ODBC::ODBC APPEND PROPERTY
 | 
						|
        INTERFACE_LINK_LIBRARIES "${_odbc_required_libs_paths}")
 | 
						|
    endif()
 | 
						|
  endif()
 | 
						|
endif()
 | 
						|
 | 
						|
unset(_odbc_required_libs_paths)
 |