| # Distributed under the OSI-approved BSD 3-Clause License. Contains modified code from |
| # CMake distribution, see https://cmake.org/licensing for details. |
| |
| # 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 |
| if(NOT MINGW) |
| set(ODBC_LIBRARY odbc32.lib) |
| else() |
| set(ODBC_LIBRARY libodbc32.a) |
| endif() |
| |
| 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 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 UNIX_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 UNIX_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}) |
| if (${_lib_name} STREQUAL odbc) |
| list(APPEND _odbc_required_libs_names odbcinst) |
| endif() |
| 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 and unixODBC |
| set(_odbc_lib_names odbc;odbcinst;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 paths 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) |