| # Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| # file Copyright.txt or https://cmake.org/licensing for details. |
| |
| #[=======================================================================[.rst: |
| FindPostgreSQL |
| -------------- |
| |
| Find the PostgreSQL installation. |
| |
| IMPORTED Targets |
| ^^^^^^^^^^^^^^^^ |
| |
| .. versionadded:: 3.14 |
| |
| This module defines :prop_tgt:`IMPORTED` target ``PostgreSQL::PostgreSQL`` |
| if PostgreSQL has been found. |
| |
| Result Variables |
| ^^^^^^^^^^^^^^^^ |
| |
| This module will set the following variables in your project: |
| |
| ``PostgreSQL_FOUND`` |
| True if PostgreSQL is found. |
| ``PostgreSQL_LIBRARIES`` |
| the PostgreSQL libraries needed for linking |
| ``PostgreSQL_INCLUDE_DIRS`` |
| the directories of the PostgreSQL headers |
| ``PostgreSQL_LIBRARY_DIRS`` |
| the link directories for PostgreSQL libraries |
| ``PostgreSQL_VERSION_STRING`` |
| the version of PostgreSQL found |
| ``PostgreSQL_TYPE_INCLUDE_DIR`` |
| the directories of the PostgreSQL server headers |
| |
| Components |
| ^^^^^^^^^^ |
| |
| This module contains additional ``Server`` component, that forcibly checks |
| for the presence of server headers. Note that ``PostgreSQL_TYPE_INCLUDE_DIR`` |
| is set regardless of the presence of the ``Server`` component in find_package call. |
| |
| #]=======================================================================] |
| |
| # ---------------------------------------------------------------------------- |
| # History: |
| # This module is derived from the module originally found in the VTK source tree. |
| # |
| # ---------------------------------------------------------------------------- |
| # Note: |
| # PostgreSQL_ADDITIONAL_VERSIONS is a variable that can be used to set the |
| # version number of the implementation of PostgreSQL. |
| # In Windows the default installation of PostgreSQL uses that as part of the path. |
| # E.g C:\Program Files\PostgreSQL\8.4. |
| # Currently, the following version numbers are known to this module: |
| # "16" "15" "14" "13" "12" "11" "10" "9.6" "9.5" "9.4" "9.3" "9.2" "9.1" "9.0" "8.4" "8.3" "8.2" "8.1" "8.0" |
| # |
| # To use this variable just do something like this: |
| # set(PostgreSQL_ADDITIONAL_VERSIONS "9.2" "8.4.4") |
| # before calling find_package(PostgreSQL) in your CMakeLists.txt file. |
| # This will mean that the versions you set here will be found first in the order |
| # specified before the default ones are searched. |
| # |
| # ---------------------------------------------------------------------------- |
| # You may need to manually set: |
| # PostgreSQL_INCLUDE_DIR - the path to where the PostgreSQL include files are. |
| # PostgreSQL_LIBRARY_DIR - The path to where the PostgreSQL library files are. |
| # If FindPostgreSQL.cmake cannot find the include files or the library files. |
| # |
| # ---------------------------------------------------------------------------- |
| # The following variables are set if PostgreSQL is found: |
| # PostgreSQL_FOUND - Set to true when PostgreSQL is found. |
| # PostgreSQL_INCLUDE_DIRS - Include directories for PostgreSQL |
| # PostgreSQL_LIBRARY_DIRS - Link directories for PostgreSQL libraries |
| # PostgreSQL_LIBRARIES - The PostgreSQL libraries. |
| # |
| # The ``PostgreSQL::PostgreSQL`` imported target is also created. |
| # |
| # ---------------------------------------------------------------------------- |
| # If you have installed PostgreSQL in a non-standard location. |
| # (Please note that in the following comments, it is assumed that <Your Path> |
| # points to the root directory of the include directory of PostgreSQL.) |
| # Then you have three options. |
| # 1) After CMake runs, set PostgreSQL_INCLUDE_DIR to <Your Path>/include and |
| # PostgreSQL_LIBRARY_DIR to wherever the library pq (or libpq in windows) is |
| # 2) Use CMAKE_INCLUDE_PATH to set a path to <Your Path>/PostgreSQL<-version>. This will allow find_path() |
| # to locate PostgreSQL_INCLUDE_DIR by utilizing the PATH_SUFFIXES option. e.g. In your CMakeLists.txt file |
| # set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "<Your Path>/include") |
| # 3) Set an environment variable called ${PostgreSQL_ROOT} that points to the root of where you have |
| # installed PostgreSQL, e.g. <Your Path>. |
| # |
| # ---------------------------------------------------------------------------- |
| |
| cmake_policy(PUSH) |
| cmake_policy(SET CMP0057 NEW) # if IN_LIST |
| cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n> |
| |
| set(PostgreSQL_INCLUDE_PATH_DESCRIPTION "top-level directory containing the PostgreSQL include directories. E.g /usr/local/include/PostgreSQL/8.4 or C:/Program Files/PostgreSQL/8.4/include") |
| set(PostgreSQL_INCLUDE_DIR_MESSAGE "Set the PostgreSQL_INCLUDE_DIR cmake cache entry to the ${PostgreSQL_INCLUDE_PATH_DESCRIPTION}") |
| set(PostgreSQL_LIBRARY_PATH_DESCRIPTION "top-level directory containing the PostgreSQL libraries.") |
| set(PostgreSQL_LIBRARY_DIR_MESSAGE "Set the PostgreSQL_LIBRARY_DIR cmake cache entry to the ${PostgreSQL_LIBRARY_PATH_DESCRIPTION}") |
| set(PostgreSQL_ROOT_DIR_MESSAGE "Set the PostgreSQL_ROOT system variable to where PostgreSQL is found on the machine E.g C:/Program Files/PostgreSQL/8.4") |
| |
| |
| set(PostgreSQL_KNOWN_VERSIONS ${PostgreSQL_ADDITIONAL_VERSIONS} |
| "16" "15" "14" "13" "12" "11" "10" "9.6" "9.5" "9.4" "9.3" "9.2" "9.1" "9.0" "8.4" "8.3" "8.2" "8.1" "8.0") |
| |
| # Define additional search paths for root directories. |
| set( PostgreSQL_ROOT_DIRECTORIES |
| ENV PostgreSQL_ROOT |
| ${PostgreSQL_ROOT} |
| ) |
| foreach(suffix ${PostgreSQL_KNOWN_VERSIONS}) |
| if(WIN32) |
| list(APPEND PostgreSQL_LIBRARY_ADDITIONAL_SEARCH_SUFFIXES |
| "PostgreSQL/${suffix}/lib") |
| list(APPEND PostgreSQL_INCLUDE_ADDITIONAL_SEARCH_SUFFIXES |
| "PostgreSQL/${suffix}/include") |
| list(APPEND PostgreSQL_TYPE_ADDITIONAL_SEARCH_SUFFIXES |
| "PostgreSQL/${suffix}/include/server") |
| endif() |
| if(UNIX) |
| list(APPEND PostgreSQL_LIBRARY_ADDITIONAL_SEARCH_SUFFIXES |
| "postgresql${suffix}" |
| "postgresql@${suffix}" |
| "pgsql-${suffix}/lib") |
| list(APPEND PostgreSQL_INCLUDE_ADDITIONAL_SEARCH_SUFFIXES |
| "postgresql${suffix}" |
| "postgresql@${suffix}" |
| "postgresql/${suffix}" |
| "pgsql-${suffix}/include") |
| list(APPEND PostgreSQL_TYPE_ADDITIONAL_SEARCH_SUFFIXES |
| "postgresql${suffix}/server" |
| "postgresql@${suffix}/server" |
| "postgresql/${suffix}/server" |
| "pgsql-${suffix}/include/server") |
| endif() |
| endforeach() |
| |
| # |
| # Look for an installation. |
| # |
| find_path(PostgreSQL_INCLUDE_DIR |
| NAMES libpq-fe.h |
| PATHS |
| # Look in other places. |
| ${PostgreSQL_ROOT_DIRECTORIES} |
| PATH_SUFFIXES |
| pgsql |
| postgresql |
| include |
| ${PostgreSQL_INCLUDE_ADDITIONAL_SEARCH_SUFFIXES} |
| # Help the user find it if we cannot. |
| DOC "The ${PostgreSQL_INCLUDE_DIR_MESSAGE}" |
| ) |
| |
| find_path(PostgreSQL_TYPE_INCLUDE_DIR |
| NAMES catalog/pg_type.h |
| PATHS |
| # Look in other places. |
| ${PostgreSQL_ROOT_DIRECTORIES} |
| PATH_SUFFIXES |
| postgresql |
| pgsql/server |
| postgresql/server |
| include/server |
| ${PostgreSQL_TYPE_ADDITIONAL_SEARCH_SUFFIXES} |
| # Help the user find it if we cannot. |
| DOC "The ${PostgreSQL_INCLUDE_DIR_MESSAGE}" |
| ) |
| |
| # The PostgreSQL library. |
| set (PostgreSQL_LIBRARY_TO_FIND pq) |
| # Setting some more prefixes for the library |
| set (PostgreSQL_LIB_PREFIX "") |
| if ( WIN32 ) |
| set (PostgreSQL_LIB_PREFIX ${PostgreSQL_LIB_PREFIX} "lib") |
| set (PostgreSQL_LIBRARY_TO_FIND ${PostgreSQL_LIB_PREFIX}${PostgreSQL_LIBRARY_TO_FIND}) |
| endif() |
| |
| function(__postgresql_find_library _name) |
| find_library(${_name} |
| NAMES ${ARGN} |
| PATHS |
| ${PostgreSQL_ROOT_DIRECTORIES} |
| PATH_SUFFIXES |
| lib |
| ${PostgreSQL_LIBRARY_ADDITIONAL_SEARCH_SUFFIXES} |
| # Help the user find it if we cannot. |
| DOC "The ${PostgreSQL_LIBRARY_DIR_MESSAGE}" |
| ) |
| endfunction() |
| |
| # For compatibility with versions prior to this multi-config search, honor |
| # any PostgreSQL_LIBRARY that is already specified and skip the search. |
| if(PostgreSQL_LIBRARY) |
| set(PostgreSQL_LIBRARIES "${PostgreSQL_LIBRARY}") |
| get_filename_component(PostgreSQL_LIBRARY_DIR "${PostgreSQL_LIBRARY}" PATH) |
| else() |
| __postgresql_find_library(PostgreSQL_LIBRARY_RELEASE ${PostgreSQL_LIBRARY_TO_FIND}) |
| __postgresql_find_library(PostgreSQL_LIBRARY_DEBUG ${PostgreSQL_LIBRARY_TO_FIND}d) |
| include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake) |
| select_library_configurations(PostgreSQL) |
| mark_as_advanced(PostgreSQL_LIBRARY_RELEASE PostgreSQL_LIBRARY_DEBUG) |
| if(PostgreSQL_LIBRARY_RELEASE) |
| get_filename_component(PostgreSQL_LIBRARY_DIR "${PostgreSQL_LIBRARY_RELEASE}" PATH) |
| elseif(PostgreSQL_LIBRARY_DEBUG) |
| get_filename_component(PostgreSQL_LIBRARY_DIR "${PostgreSQL_LIBRARY_DEBUG}" PATH) |
| else() |
| set(PostgreSQL_LIBRARY_DIR "") |
| endif() |
| endif() |
| |
| if (PostgreSQL_INCLUDE_DIR) |
| # Some platforms include multiple pg_config.hs for multi-lib configurations |
| # This is a temporary workaround. A better solution would be to compile |
| # a dummy c file and extract the value of the symbol. |
| file(GLOB _PG_CONFIG_HEADERS "${PostgreSQL_INCLUDE_DIR}/pg_config*.h") |
| foreach(_PG_CONFIG_HEADER ${_PG_CONFIG_HEADERS}) |
| if(EXISTS "${_PG_CONFIG_HEADER}") |
| file(STRINGS "${_PG_CONFIG_HEADER}" pgsql_version_str |
| REGEX "^#define[\t ]+PG_VERSION_NUM[\t ]+.*") |
| if(pgsql_version_str) |
| string(REGEX REPLACE "^#define[\t ]+PG_VERSION_NUM[\t ]+([0-9]*).*" |
| "\\1" _PostgreSQL_VERSION_NUM "${pgsql_version_str}") |
| break() |
| endif() |
| endif() |
| endforeach() |
| if (_PostgreSQL_VERSION_NUM) |
| # 9.x and older encoding |
| if (_PostgreSQL_VERSION_NUM LESS 100000) |
| math(EXPR _PostgreSQL_major_version "${_PostgreSQL_VERSION_NUM} / 10000") |
| math(EXPR _PostgreSQL_minor_version "${_PostgreSQL_VERSION_NUM} % 10000 / 100") |
| math(EXPR _PostgreSQL_patch_version "${_PostgreSQL_VERSION_NUM} % 100") |
| set(PostgreSQL_VERSION_STRING "${_PostgreSQL_major_version}.${_PostgreSQL_minor_version}.${_PostgreSQL_patch_version}") |
| unset(_PostgreSQL_major_version) |
| unset(_PostgreSQL_minor_version) |
| unset(_PostgreSQL_patch_version) |
| else () |
| math(EXPR _PostgreSQL_major_version "${_PostgreSQL_VERSION_NUM} / 10000") |
| math(EXPR _PostgreSQL_minor_version "${_PostgreSQL_VERSION_NUM} % 10000") |
| set(PostgreSQL_VERSION_STRING "${_PostgreSQL_major_version}.${_PostgreSQL_minor_version}") |
| unset(_PostgreSQL_major_version) |
| unset(_PostgreSQL_minor_version) |
| endif () |
| else () |
| foreach(_PG_CONFIG_HEADER ${_PG_CONFIG_HEADERS}) |
| if(EXISTS "${_PG_CONFIG_HEADER}") |
| file(STRINGS "${_PG_CONFIG_HEADER}" pgsql_version_str |
| REGEX "^#define[\t ]+PG_VERSION[\t ]+\".*\"") |
| if(pgsql_version_str) |
| string(REGEX REPLACE "^#define[\t ]+PG_VERSION[\t ]+\"([^\"]*)\".*" |
| "\\1" PostgreSQL_VERSION_STRING "${pgsql_version_str}") |
| break() |
| endif() |
| endif() |
| endforeach() |
| endif () |
| unset(_PostgreSQL_VERSION_NUM) |
| unset(pgsql_version_str) |
| endif() |
| |
| if("Server" IN_LIST PostgreSQL_FIND_COMPONENTS) |
| set(PostgreSQL_Server_FOUND TRUE) |
| if(NOT PostgreSQL_TYPE_INCLUDE_DIR) |
| set(PostgreSQL_Server_FOUND FALSE) |
| endif() |
| endif() |
| |
| # Did we find anything? |
| include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) |
| find_package_handle_standard_args(PostgreSQL |
| REQUIRED_VARS PostgreSQL_LIBRARY PostgreSQL_INCLUDE_DIR |
| HANDLE_COMPONENTS |
| VERSION_VAR PostgreSQL_VERSION_STRING) |
| set(PostgreSQL_FOUND ${POSTGRESQL_FOUND}) |
| |
| function(__postgresql_import_library _target _var _config) |
| if(_config) |
| set(_config_suffix "_${_config}") |
| else() |
| set(_config_suffix "") |
| endif() |
| |
| set(_lib "${${_var}${_config_suffix}}") |
| if(EXISTS "${_lib}") |
| if(_config) |
| set_property(TARGET ${_target} APPEND PROPERTY |
| IMPORTED_CONFIGURATIONS ${_config}) |
| endif() |
| set_target_properties(${_target} PROPERTIES |
| IMPORTED_LOCATION${_config_suffix} "${_lib}") |
| endif() |
| endfunction() |
| |
| # Now try to get the include and library path. |
| if(PostgreSQL_FOUND) |
| set(PostgreSQL_INCLUDE_DIRS ${PostgreSQL_INCLUDE_DIR}) |
| if(PostgreSQL_TYPE_INCLUDE_DIR) |
| list(APPEND PostgreSQL_INCLUDE_DIRS ${PostgreSQL_TYPE_INCLUDE_DIR}) |
| endif() |
| set(PostgreSQL_LIBRARY_DIRS ${PostgreSQL_LIBRARY_DIR}) |
| if (NOT TARGET PostgreSQL::PostgreSQL) |
| add_library(PostgreSQL::PostgreSQL UNKNOWN IMPORTED) |
| set_target_properties(PostgreSQL::PostgreSQL PROPERTIES |
| INTERFACE_INCLUDE_DIRECTORIES "${PostgreSQL_INCLUDE_DIRS}") |
| __postgresql_import_library(PostgreSQL::PostgreSQL PostgreSQL_LIBRARY "") |
| __postgresql_import_library(PostgreSQL::PostgreSQL PostgreSQL_LIBRARY "RELEASE") |
| __postgresql_import_library(PostgreSQL::PostgreSQL PostgreSQL_LIBRARY "DEBUG") |
| endif () |
| endif() |
| |
| mark_as_advanced(PostgreSQL_INCLUDE_DIR PostgreSQL_TYPE_INCLUDE_DIR) |
| |
| cmake_policy(POP) |