Răsfoiți Sursa

Merge topic 'FindPostgreSQL-target'

575e2cc35d FindPostgreSQL: extract the actual version number
7413f29fe6 Tests/FindPostgreSQL: add a test for FindPostgreSQL
d2235fd253 FindPostgreSQL: add an imported target
7a801b7dfb FindPostgreSQL: Modernize documentation layout

Acked-by: Kitware Robot <[email protected]>
Merge-request: !2555
Brad King 7 ani în urmă
părinte
comite
bfdd1ba604

+ 4 - 0
Help/release/dev/FindPostgreSQL-target.rst

@@ -0,0 +1,4 @@
+FindPostgreSQL-target
+---------------------
+
+* The :module:`FindPostgreSQL` module now provides an imported target.

+ 52 - 11
Modules/FindPostgreSQL.cmake

@@ -7,14 +7,27 @@ FindPostgreSQL
 
 Find the PostgreSQL installation.
 
-This module defines
-
-::
-
-  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 (since CMake 2.8.8)
+IMPORTED Targets
+^^^^^^^^^^^^^^^^
+
+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
 #]=======================================================================]
 
 # ----------------------------------------------------------------------------
@@ -49,6 +62,8 @@ This module defines
 #  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>
@@ -160,14 +175,34 @@ if (PostgreSQL_INCLUDE_DIR)
   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 ]+\".*\"")
+           REGEX "^#define[\t ]+PG_VERSION_NUM[\t ]+.*")
       if(pgsql_version_str)
-        string(REGEX REPLACE "^#define[\t ]+PG_VERSION[\t ]+\"([^\"]*)\".*"
-               "\\1" PostgreSQL_VERSION_STRING "${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)
+    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)
+  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()
 
@@ -180,6 +215,12 @@ set(PostgreSQL_FOUND  ${POSTGRESQL_FOUND})
 
 # Now try to get the include and library path.
 if(PostgreSQL_FOUND)
+  if (NOT TARGET PostgreSQL::PostgreSQL)
+    add_library(PostgreSQL::PostgreSQL UNKNOWN IMPORTED)
+    set_target_properties(PostgreSQL::PostgreSQL PROPERTIES
+      IMPORTED_LOCATION "${PostgreSQL_LIBRARY}"
+      INTERFACE_INCLUDE_DIRECTORIES "${PostgreSQL_INCLUDE_DIR};${PostgreSQL_TYPE_INCLUDE_DIR}")
+  endif ()
   set(PostgreSQL_INCLUDE_DIRS ${PostgreSQL_INCLUDE_DIR} ${PostgreSQL_TYPE_INCLUDE_DIR} )
   set(PostgreSQL_LIBRARY_DIRS ${PostgreSQL_LIBRARY_DIR} )
   set(PostgreSQL_LIBRARIES ${PostgreSQL_LIBRARY})

+ 4 - 0
Tests/CMakeLists.txt

@@ -1465,6 +1465,10 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
     add_subdirectory(FindPatch)
   endif()
 
+  if(CMake_TEST_FindPostgreSQL)
+    add_subdirectory(FindPostgreSQL)
+  endif()
+
   if(CMake_TEST_FindProtobuf)
     add_subdirectory(FindProtobuf)
   endif()

+ 10 - 0
Tests/FindPostgreSQL/CMakeLists.txt

@@ -0,0 +1,10 @@
+add_test(NAME FindPostgreSQL.Test COMMAND
+  ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+  --build-and-test
+  "${CMake_SOURCE_DIR}/Tests/FindPostgreSQL/Test"
+  "${CMake_BINARY_DIR}/Tests/FindPostgreSQL/Test"
+  ${build_generator_args}
+  --build-project TestFindPostgreSQL
+  --build-options ${build_options}
+  --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+  )

+ 16 - 0
Tests/FindPostgreSQL/Test/CMakeLists.txt

@@ -0,0 +1,16 @@
+cmake_minimum_required(VERSION 3.10)
+project(TestFindPostgreSQL C)
+include(CTest)
+
+find_package(PostgreSQL REQUIRED)
+
+add_definitions(-DCMAKE_EXPECTED_POSTGRESQL_VERSION="${PostgreSQL_VERSION_STRING}")
+
+add_executable(test_tgt main.c)
+target_link_libraries(test_tgt PostgreSQL::PostgreSQL)
+add_test(NAME test_tgt COMMAND test_tgt)
+
+add_executable(test_var main.c)
+target_include_directories(test_var PRIVATE ${PostgreSQL_INCLUDE_DIRS})
+target_link_libraries(test_var PRIVATE ${PostgreSQL_LIBRARIES})
+add_test(NAME test_var COMMAND test_var)

+ 15 - 0
Tests/FindPostgreSQL/Test/main.c

@@ -0,0 +1,15 @@
+#include <libpq-fe.h>
+#include <stdio.h>
+#include <string.h>
+
+int main()
+{
+  int version = PQlibVersion();
+  int major = version / 10000;
+  int minor = version % 10000;
+  char version_string[100];
+  snprintf(version_string, sizeof(version_string), "%d.%d", major, minor);
+  printf("Found PostgreSQL version %s, expected version %s\n", version_string,
+         CMAKE_EXPECTED_POSTGRESQL_VERSION);
+  return strcmp(version_string, CMAKE_EXPECTED_POSTGRESQL_VERSION);
+}