void-packages/srcpkgs/OpenOrienteering-Mapper/patches/fix-proj-cmake.patch

322 lines
12 KiB
Diff

From 08cc5e4c73175ebf3e9bb2295f718e914366d51b Mon Sep 17 00:00:00 2001
From: Kai Pastor <dg0yt@darc.de>
Date: Wed, 15 Dec 2021 09:32:10 +0100
Subject: [PATCH] Find PROJ via cmake config or via pkg-config
Drop the custom find module for PROJ. Cmake config or pkg-config data
is provided from PROJ's build system. This covers PROJ 4.9 to 8.2,
dynamic and static linkage, including transitive dependencies.
---
CMakeLists.txt | 23 ++--
cmake/FindPROJ4.cmake | 152 -------------------------
doc/licensing/linux-distribution.cmake | 5 +-
packaging/CMakeLists.txt | 25 ++--
packaging/android/Mapper.pro.in | 2 +-
src/CMakeLists.txt | 2 +-
test/CMakeLists.txt | 2 +-
7 files changed, 31 insertions(+), 180 deletions(-)
delete mode 100644 cmake/FindPROJ4.cmake
diff --git a/CMakeLists.txt b/CMakeLists.txt
index da5ad1e7b..e6a6ddeaa 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -203,20 +203,27 @@ endif()
# We must not require a minimum version of PROJ via find_package
# because PROJ config requires the major version to match exactly.
-find_package(PROJ4 REQUIRED)
-if(NOT TARGET PROJ4::proj)
- include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindPROJ.cmake")
+find_package(PROJ CONFIG)
+if(NOT PROJ_LIBRARIES)
+ find_package(PkgConfig REQUIRED)
+ if(PKG_CONFIG_FOUND)
+ pkg_check_modules(PROJ4_PC IMPORTED_TARGET proj)
+ endif()
+ if(TARGET PkgConfig::PROJ4_PC)
+ set(PROJ_LIBRARIES PkgConfig::PROJ4_PC)
+ set(PROJ_VERSION "${PROJ4_PC_VERSION}")
+ endif()
endif()
-if(NOT PROJ4_VERSION OR PROJ4_VERSION VERSION_LESS 4.9)
+if(NOT PROJ_VERSION OR PROJ_VERSION VERSION_LESS 4.9)
message(FATAL_ERROR "At least PROJ 4.9 is required")
-elseif(PROJ4_VERSION VERSION_LESS 6.1)
+elseif(PROJ_VERSION VERSION_LESS 6.1)
# New PROJ API missing or incomplete.
# (proj_normalize_for_visualization() came in 6.1.)
- set_property(TARGET PROJ4::proj APPEND PROPERTY
+ set_property(TARGET "${PROJ_LIBRARIES}" APPEND PROPERTY
INTERFACE_COMPILE_DEFINITIONS ACCEPT_USE_OF_DEPRECATED_PROJ_API_H)
-elseif(PROJ4_VERSION VERSION_LESS 6.2.1)
+elseif(PROJ_VERSION VERSION_LESS 6.2.1)
# Datum Potsdam issue, https://github.com/OSGeo/PROJ/pull/1573
- set_property(TARGET PROJ4::proj APPEND PROPERTY
+ set_property(TARGET "${PROJ_LIBRARIES}" APPEND PROPERTY
INTERFACE_COMPILE_DEFINITIONS PROJ_ISSUE_1573)
endif()
diff --git a/cmake/FindPROJ4.cmake b/cmake/FindPROJ4.cmake
deleted file mode 100644
index 093deaa79..000000000
--- a/cmake/FindPROJ4.cmake
+++ /dev/null
@@ -1,152 +0,0 @@
-#.rst:
-# FindPROJ4
-# --------
-#
-# Find the proj includes and library.
-#
-# IMPORTED Targets
-# ^^^^^^^^^^^^^^^^
-#
-# This module defines :prop_tgt:`IMPORTED` target ``PROJ4::proj``,
-# if Proj.4 has been found.
-#
-# Result Variables
-# ^^^^^^^^^^^^^^^^
-#
-# This module defines the following variables:
-#
-# ::
-#
-# PROJ4_INCLUDE_DIRS - where to find proj_api.h, etc.
-# PROJ4_LIBRARIES - List of libraries when using libproj.
-# PROJ4_FOUND - True if libproj found.
-#
-# ::
-#
-# PROJ4_VERSION - The version of libproj found (x.y.z)
-# PROJ4_VERSION_MAJOR - The major version of libproj
-# PROJ4_VERSION_MINOR - The minor version of libproj
-# PROJ4_VERSION_PATCH - The patch version of libproj
-# PROJ4_VERSION_TWEAK - always 0
-# PROJ4_VERSION_COUNT - The number of version components, always 3
-#
-# Hints
-# ^^^^^
-#
-# A user may set ``PROJ4_ROOT`` to a libproj installation root to tell this
-# module where to look exclusively.
-
-#=============================================================================
-# Copyright 2016 Kai Pastor
-#
-#
-# This file was derived from CMake 3.5's module FindZLIB.cmake
-# which has the following terms:
-#
-# Copyright 2001-2011 Kitware, Inc.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-#
-# * The names of Kitware, Inc., the Insight Consortium, or the names of
-# any consortium members, or of any contributors, may not be used to
-# endorse or promote products derived from this software without
-# specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
-# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#=============================================================================
-
-# Search PROJ4_ROOT exclusively if it is set.
-if(PROJ4_ROOT)
- set(_PROJ4_SEARCH PATHS ${PROJ4_ROOT} NO_DEFAULT_PATH)
-else()
- set(_PROJ4_SEARCH)
-endif()
-
-find_path(PROJ4_INCLUDE_DIR NAMES proj_api.h ${_PROJ4_SEARCH} PATH_SUFFIXES include)
-mark_as_advanced(PROJ4_INCLUDE_DIR)
-
-if(PROJ4_INCLUDE_DIR AND EXISTS "${PROJ4_INCLUDE_DIR}/proj_api.h")
- file(STRINGS "${PROJ4_INCLUDE_DIR}/proj_api.h" PROJ4_H REGEX "^#define PJ_VERSION [0-9]+$")
-
- string(REGEX REPLACE "^.*PJ_VERSION ([0-9]).*$" "\\1" PROJ4_VERSION_MAJOR "${PROJ4_H}")
- string(REGEX REPLACE "^.*PJ_VERSION [0-9]([0-9]).*$" "\\1" PROJ4_VERSION_MINOR "${PROJ4_H}")
- string(REGEX REPLACE "^.*PJ_VERSION [0-9][0-9]([0-9]).*$" "\\1" PROJ4_VERSION_PATCH "${PROJ4_H}")
- set(PROJ4_VERSION "${PROJ4_VERSION_MAJOR}.${PROJ4_VERSION_MINOR}.${PROJ4_VERSION_PATCH}")
- set(PROJ4_VERSION_COUNT 3)
-endif()
-
-# Allow PROJ4_LIBRARY to be set manually, as the location of the proj library
-if(NOT PROJ4_LIBRARY)
- set(PROJ4_NAMES proj)
- set(PROJ4_NAMES_DEBUG projd)
- if(WIN32 AND DEFINED PROJ4_VERSION_MAJOR AND DEFINED PROJ4_VERSION_MINOR)
- list(APPEND PROJ4_NAMES proj_${PROJ4_VERSION_MAJOR}_${PROJ4_VERSION_MINOR})
- list(APPEND PROJ4_NAMES projd_${PROJ4_VERSION_MAJOR}_${PROJ4_VERSION_MINOR})
- endif()
- find_library(PROJ4_LIBRARY_RELEASE NAMES ${PROJ4_NAMES} ${_PROJ4_SEARCH} PATH_SUFFIXES lib)
- find_library(PROJ4_LIBRARY_DEBUG NAMES ${PROJ4_NAMES_DEBUG} ${_PROJ4_SEARCH} PATH_SUFFIXES lib)
- include(SelectLibraryConfigurations)
- select_library_configurations(PROJ4)
-endif()
-
-# handle the QUIETLY and REQUIRED arguments and set PROJ4_FOUND to TRUE if
-# all listed variables are TRUE
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(PROJ4
- REQUIRED_VARS
- PROJ4_LIBRARY
- PROJ4_INCLUDE_DIR
- VERSION_VAR
- PROJ4_VERSION
-)
-
-if(PROJ4_FOUND)
- set(PROJ4_INCLUDE_DIRS ${PROJ4_INCLUDE_DIR})
-
- if(NOT PROJ4_LIBRARIES)
- set(PROJ4_LIBRARIES ${PROJ4_LIBRARY})
- endif()
-
- if(NOT TARGET PROJ4::proj)
- add_library(PROJ4::proj UNKNOWN IMPORTED)
- set_target_properties(PROJ4::proj PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${PROJ4_INCLUDE_DIRS}")
-
- if(PROJ4_LIBRARY_RELEASE)
- set_property(TARGET PROJ4::proj APPEND PROPERTY
- IMPORTED_CONFIGURATIONS RELEASE)
- set_target_properties(PROJ4::proj PROPERTIES
- IMPORTED_LOCATION_RELEASE "${PROJ4_LIBRARY_RELEASE}")
- endif()
-
- if(PROJ4_LIBRARY_DEBUG)
- set_property(TARGET PROJ4::proj APPEND PROPERTY
- IMPORTED_CONFIGURATIONS DEBUG)
- set_target_properties(PROJ4::proj PROPERTIES
- IMPORTED_LOCATION_DEBUG "${PROJ4_LIBRARY_DEBUG}")
- endif()
-
- if(NOT PROJ4_LIBRARY_RELEASE AND NOT PROJ4_LIBRARY_DEBUG)
- set_property(TARGET PROJ4::proj APPEND PROPERTY
- IMPORTED_LOCATION "${PROJ4_LIBRARY}")
- endif()
- endif()
-endif()
diff --git a/doc/licensing/linux-distribution.cmake b/doc/licensing/linux-distribution.cmake
index b2bc5d72c..7a1d39f7b 100644
--- a/doc/licensing/linux-distribution.cmake
+++ b/doc/licensing/linux-distribution.cmake
@@ -106,9 +106,8 @@ foreach(dependency ${easy_dependencies})
elseif(dependency STREQUAL "libpolyclipping")
find_package(Polyclipping)
list(APPEND explicit_copyright_${dependency} "${POLYCLIPPING_VERSION}")
- elseif(dependency STREQUAL "proj")
- find_package(PROJ4)
- list(APPEND explicit_copyright_${dependency} "${PROJ4_VERSION}")
+ elseif(dependency STREQUAL "proj" AND PROJ_VERSION)
+ list(APPEND explicit_copyright_${dependency} "${PROJ_VERSION}")
elseif(dependency STREQUAL "zlib")
find_package(ZLIB)
list(APPEND explicit_copyright_${dependency} "${ZLIB_VERSION_STRING}")
diff --git a/packaging/CMakeLists.txt b/packaging/CMakeLists.txt
index 4a981c681..eabb4bb14 100644
--- a/packaging/CMakeLists.txt
+++ b/packaging/CMakeLists.txt
@@ -235,25 +235,22 @@ unset(MAPPER_LIBS)
if(Mapper_PACKAGE_PROJ)
if(NOT PROJ_DATA_DIR)
- unset(PROJ_DATA_DIR CACHE)
- if(PROJ4_ROOT)
- set(proj_data_paths "${PROJ4_ROOT}/share/proj")
- elseif(PROJ4_DIR)
+ if(PROJ_DIR)
# Cf. find_package documentation
- string(REGEX REPLACE "/CMake$|/cmake$" "" proj_data_paths "${PROJ4_DIR}") # U
- string(REGEX REPLACE "/PROJ4[^/]*$|/proj4[^/]*$" "" proj_data_paths "${proj_data_paths}") # U, W
- string(REGEX REPLACE "/cmake$" "" proj_data_paths "${proj_data_paths}") # U
- string(REGEX REPLACE "/lib/[^/]*$|/lib$|/share$" "" proj_data_paths "${proj_data_paths}") # U, W
- set(proj_data_paths "${proj_data_paths}/share/proj")
- elseif(PROJ4_INCLUDE_DIRS)
- string(REGEX REPLACE "/include$" "/share/proj" proj_data_paths ${PROJ4_INCLUDE_DIRS}) # MSYS2 et al.
+ string(REGEX REPLACE "/CMake$|/cmake$" "" proj_prefix "${PROJ_DIR}") # U
+ string(REGEX REPLACE "/PROJ[^/]*$|/proj[^/]*$" "" proj_prefix "${proj_prefix}") # U, W
+ string(REGEX REPLACE "/cmake$" "" proj_prefix "${proj_prefix}") # U
+ string(REGEX REPLACE "/lib/[^/]*$|/lib$|/share$" "" proj_prefix "${proj_prefix}") # U, W
+ elseif(PROJ4_PC_PREFIX)
+ set(proj_prefix "${PROJ4_PC_PREFIX}")
else()
- set(proj_data_paths PATHS "${CMAKE_INSTALL_PREFIX}/share/proj")
+ set(proj_prefix "${CMAKE_INSTALL_PREFIX}")
endif()
find_path(PROJ_DATA_DIR
DOC "The PROJ data files directory"
NAMES epsg proj.db
- PATHS ${proj_data_paths}
+ PATHS ${proj_prefix}
+ PATH_SUFFIXES "share/proj" "share"
NO_DEFAULT_PATH
)
endif()
@@ -266,7 +263,7 @@ if(Mapper_PACKAGE_PROJ)
install(
DIRECTORY "${PROJ_DATA_DIR}"
DESTINATION "${MAPPER_DATA_DESTINATION}")
- list(APPEND MAPPER_LIB_HINTS ${PROJ4_ROOT}/bin)
+ list(APPEND MAPPER_LIB_HINTS "${proj_prefix}/bin")
endif()
if(Mapper_PACKAGE_GDAL)
diff --git a/packaging/android/Mapper.pro.in b/packaging/android/Mapper.pro.in
index b3e88ca11..2017e3933 100644
--- a/packaging/android/Mapper.pro.in
+++ b/packaging/android/Mapper.pro.in
@@ -38,7 +38,7 @@ PROJECT_BINARY_DIR = "@PROJECT_BINARY_DIR@"
# in CPackConfig.cmake when a package version changes.
CPACK_CONFIG_CLEANUP_TRIGGER = \
GDAL: @GDAL_VERSION@ \
- PROJ: @PROJ4_VERSION@ \
+ PROJ: @PROJ_VERSION@ \
Qt5: @Qt5Core_VERSION@
# For the generated .pro file to be used in Qt Creator,
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index a4b7d1454..aff2fa8e4 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -301,7 +301,7 @@ add_dependencies(Mapper_Common
)
target_link_libraries(Mapper_Common
Polyclipping::Polyclipping
- PROJ4::proj
+ ${PROJ_LIBRARIES}
Qt5::Widgets
)
foreach(lib
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 37d5278da..19b2567d9 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -65,7 +65,7 @@ function(add_test_helper testname autorun)
endforeach()
add_executable(${testname} ${testname}.cpp ${TEST_${testname}_SRCS})
target_link_libraries(${testname} PRIVATE
- PROJ4::proj
+ ${PROJ_LIBRARIES}
Qt5::Test
Qt5::Gui
Polyclipping::Polyclipping