diff options
Diffstat (limited to 'cmake/Modules')
| -rw-r--r-- | cmake/Modules/FindPostgreSQL.cmake | 315 | 
1 files changed, 315 insertions, 0 deletions
| diff --git a/cmake/Modules/FindPostgreSQL.cmake b/cmake/Modules/FindPostgreSQL.cmake new file mode 100644 index 0000000..84bc1ed --- /dev/null +++ b/cmake/Modules/FindPostgreSQL.cmake @@ -0,0 +1,315 @@ +# 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 + +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) |