Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #54641 from m-kuhn/cmake-proj
[cmake] Use proj cmake configuration and cleanup GDAL_INCLUDE_DIR
  • Loading branch information
m-kuhn committed Sep 19, 2023
2 parents b14be57 + 1e1fb47 commit 80c1bc7
Show file tree
Hide file tree
Showing 22 changed files with 85 additions and 108 deletions.
158 changes: 84 additions & 74 deletions cmake/FindProj.cmake
Expand Up @@ -7,9 +7,9 @@
# CMake module to search for Proj library
#
# If it's found it sets PROJ_FOUND to TRUE
# and following variables are set:
# PROJ_INCLUDE_DIR
# PROJ_LIBRARY
# and adds the following target
#
# PROJ::proj

# FIND_PATH and FIND_LIBRARY normally search standard locations
# before the specified paths. To search non-standard paths first,
Expand All @@ -18,79 +18,89 @@
# locations. When an earlier FIND_* succeeds, subsequent FIND_*s
# searching for the same item do nothing.

# try to use framework on mac
# want clean framework path, not unix compatibility path
IF (APPLE)
IF (CMAKE_FIND_FRAMEWORK MATCHES "FIRST"
OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY"
OR NOT CMAKE_FIND_FRAMEWORK)
SET (CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE)
SET (CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE)
#FIND_PATH(PROJ_INCLUDE_DIR PROJ/proj_api.h)
FIND_LIBRARY(PROJ_LIBRARY PROJ)
IF (PROJ_LIBRARY)
# FIND_PATH doesn't add "Headers" for a framework
SET (PROJ_INCLUDE_DIR ${PROJ_LIBRARY}/Headers CACHE PATH "Path to a file.")
ENDIF (PROJ_LIBRARY)
SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE)
ENDIF ()
ENDIF (APPLE)
find_package(PROJ CONFIG)

FIND_PATH(PROJ_INCLUDE_DIR proj_api.h
"$ENV{INCLUDE}"
"$ENV{LIB_DIR}/include"
)
IF (NOT PROJ_INCLUDE_DIR)
FIND_PATH(PROJ_INCLUDE_DIR proj.h
# Fallback for systems where proj-targets.cmake is not present.
if(NOT PROJ_FOUND)
# try to use framework on mac
# want clean framework path, not unix compatibility path
IF (APPLE)
IF (CMAKE_FIND_FRAMEWORK MATCHES "FIRST"
OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY"
OR NOT CMAKE_FIND_FRAMEWORK)
SET (CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE)
SET (CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE)
#FIND_PATH(PROJ_INCLUDE_DIR PROJ/proj_api.h)
FIND_LIBRARY(PROJ_LIBRARY PROJ)
IF (PROJ_LIBRARY)
# FIND_PATH doesn't add "Headers" for a framework
SET (PROJ_INCLUDE_DIR ${PROJ_LIBRARY}/Headers CACHE PATH "Path to a file.")
ENDIF (PROJ_LIBRARY)
SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE)
ENDIF ()
ENDIF (APPLE)

FIND_PATH(PROJ_INCLUDE_DIR proj_api.h
"$ENV{INCLUDE}"
"$ENV{LIB_DIR}/include"
)
ENDIF (NOT PROJ_INCLUDE_DIR)

FIND_LIBRARY(PROJ_LIBRARY NAMES proj_i proj PATHS
"$ENV{LIB}"
"$ENV{LIB_DIR}/lib"
)

IF (PROJ_INCLUDE_DIR AND PROJ_LIBRARY)
SET(PROJ_FOUND TRUE)
ENDIF (PROJ_INCLUDE_DIR AND PROJ_LIBRARY)

IF (PROJ_FOUND)
IF (EXISTS ${PROJ_INCLUDE_DIR}/proj.h AND EXISTS ${PROJ_INCLUDE_DIR}/proj_experimental.h)
FILE(READ ${PROJ_INCLUDE_DIR}/proj.h proj_version)
STRING(REGEX REPLACE "^.*PROJ_VERSION_MAJOR +([0-9]+).*$" "\\1" PROJ_VERSION_MAJOR "${proj_version}")
STRING(REGEX REPLACE "^.*PROJ_VERSION_MINOR +([0-9]+).*$" "\\1" PROJ_VERSION_MINOR "${proj_version}")
STRING(REGEX REPLACE "^.*PROJ_VERSION_PATCH +([0-9]+).*$" "\\1" PROJ_VERSION_PATCH "${proj_version}")
STRING(CONCAT PROJ_VERSION_STR "(" ${PROJ_VERSION_MAJOR} "." ${PROJ_VERSION_MINOR} "." ${PROJ_VERSION_PATCH} ")")
IF ((PROJ_VERSION_MAJOR EQUAL 7) AND ((PROJ_VERSION_MINOR LESS 2) OR (PROJ_VERSION_MAJOR LESS 7)))
MESSAGE (FATAL_ERROR "Cannot build QGIS using Proj ${PROJ_VERSION_MAJOR}.${PROJ_VERSION_MINOR}.${PROJ_VERSION_PATCH} Use 7.2.0 or higher.")
ENDIF ((PROJ_VERSION_MAJOR EQUAL 7) AND ((PROJ_VERSION_MINOR LESS 2) OR (PROJ_VERSION_MAJOR LESS 7)))
ELSE(EXISTS ${PROJ_INCLUDE_DIR}/proj.h AND EXISTS ${PROJ_INCLUDE_DIR}/proj_experimental.h)
FILE(READ ${PROJ_INCLUDE_DIR}/proj_api.h proj_version)
STRING(REGEX REPLACE "^.*PJ_VERSION ([0-9]+).*$" "\\1" PJ_VERSION "${proj_version}")

# This will break if 4.10.0 ever will be released (highly unlikely)
STRING(REGEX REPLACE "([0-9])([0-9])([0-9])" "\\1" PROJ_VERSION_MAJOR "${PJ_VERSION}")
STRING(REGEX REPLACE "([0-9])([0-9])([0-9])" "\\2" PROJ_VERSION_MINOR "${PJ_VERSION}")
STRING(REGEX REPLACE "([0-9])([0-9])([0-9])" "\\3" PROJ_VERSION_PATCH "${PJ_VERSION}")
STRING(CONCAT PROJ_VERSION_STR "(" ${PROJ_VERSION_MAJOR} "." ${PROJ_VERSION_MINOR} "." ${PROJ_VERSION_PATCH} ")")

# Minimum Proj version required is 4.9.3
IF ((PROJ_VERSION_MAJOR EQUAL 4) AND ((PROJ_VERSION_MINOR LESS 9) OR ((PROJ_VERSION_MINOR EQUAL 9) AND (PROJ_VERSION_PATCH LESS 3))))
MESSAGE(FATAL_ERROR "Found Proj: ${PROJ_VERSION_MAJOR}.${PROJ_VERSION_MINOR}.${PROJ_VERSION_PATCH}. Cannot build QGIS using Proj older than 4.9.3.")
ENDIF((PROJ_VERSION_MAJOR EQUAL 4) AND ((PROJ_VERSION_MINOR LESS 9) OR ((PROJ_VERSION_MINOR EQUAL 9) AND (PROJ_VERSION_PATCH LESS 3))))
ENDIF(EXISTS ${PROJ_INCLUDE_DIR}/proj.h AND EXISTS ${PROJ_INCLUDE_DIR}/proj_experimental.h)
IF (NOT PROJ_FIND_QUIETLY)
MESSAGE(STATUS "Found Proj: ${PROJ_LIBRARY} version ${PROJ_VERSION_MAJOR} ${PROJ_VERSION_STR}")
ENDIF (NOT PROJ_FIND_QUIETLY)

INCLUDE_DIRECTORIES(BEFORE SYSTEM ${PROJ_INCLUDE_DIR})

ELSE (PROJ_FOUND)

IF (PROJ_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find Proj")
ENDIF (PROJ_FIND_REQUIRED)
IF (NOT PROJ_INCLUDE_DIR)
FIND_PATH(PROJ_INCLUDE_DIR proj.h
"$ENV{INCLUDE}"
"$ENV{LIB_DIR}/include"
)
ENDIF (NOT PROJ_INCLUDE_DIR)

FIND_LIBRARY(PROJ_LIBRARY NAMES proj_i proj PATHS
"$ENV{LIB}"
"$ENV{LIB_DIR}/lib"
)

IF (PROJ_INCLUDE_DIR AND PROJ_LIBRARY)
SET(PROJ_FOUND TRUE)
ENDIF (PROJ_INCLUDE_DIR AND PROJ_LIBRARY)

IF (PROJ_FOUND)
IF (EXISTS ${PROJ_INCLUDE_DIR}/proj.h AND EXISTS ${PROJ_INCLUDE_DIR}/proj_experimental.h)
FILE(READ ${PROJ_INCLUDE_DIR}/proj.h proj_version)
STRING(REGEX REPLACE "^.*PROJ_VERSION_MAJOR +([0-9]+).*$" "\\1" PROJ_VERSION_MAJOR "${proj_version}")
STRING(REGEX REPLACE "^.*PROJ_VERSION_MINOR +([0-9]+).*$" "\\1" PROJ_VERSION_MINOR "${proj_version}")
STRING(REGEX REPLACE "^.*PROJ_VERSION_PATCH +([0-9]+).*$" "\\1" PROJ_VERSION_PATCH "${proj_version}")
STRING(CONCAT PROJ_VERSION_STR "(" ${PROJ_VERSION_MAJOR} "." ${PROJ_VERSION_MINOR} "." ${PROJ_VERSION_PATCH} ")")
IF ((PROJ_VERSION_MAJOR EQUAL 7) AND ((PROJ_VERSION_MINOR LESS 2) OR (PROJ_VERSION_MAJOR LESS 7)))
MESSAGE (FATAL_ERROR "Cannot build QGIS using Proj ${PROJ_VERSION_MAJOR}.${PROJ_VERSION_MINOR}.${PROJ_VERSION_PATCH} Use 7.2.0 or higher.")
ENDIF ((PROJ_VERSION_MAJOR EQUAL 7) AND ((PROJ_VERSION_MINOR LESS 2) OR (PROJ_VERSION_MAJOR LESS 7)))
ELSE(EXISTS ${PROJ_INCLUDE_DIR}/proj.h AND EXISTS ${PROJ_INCLUDE_DIR}/proj_experimental.h)
FILE(READ ${PROJ_INCLUDE_DIR}/proj_api.h proj_version)
STRING(REGEX REPLACE "^.*PJ_VERSION ([0-9]+).*$" "\\1" PJ_VERSION "${proj_version}")

# This will break if 4.10.0 ever will be released (highly unlikely)
STRING(REGEX REPLACE "([0-9])([0-9])([0-9])" "\\1" PROJ_VERSION_MAJOR "${PJ_VERSION}")
STRING(REGEX REPLACE "([0-9])([0-9])([0-9])" "\\2" PROJ_VERSION_MINOR "${PJ_VERSION}")
STRING(REGEX REPLACE "([0-9])([0-9])([0-9])" "\\3" PROJ_VERSION_PATCH "${PJ_VERSION}")
STRING(CONCAT PROJ_VERSION_STR "(" ${PROJ_VERSION_MAJOR} "." ${PROJ_VERSION_MINOR} "." ${PROJ_VERSION_PATCH} ")")

# Minimum Proj version required is 4.9.3
IF ((PROJ_VERSION_MAJOR EQUAL 4) AND ((PROJ_VERSION_MINOR LESS 9) OR ((PROJ_VERSION_MINOR EQUAL 9) AND (PROJ_VERSION_PATCH LESS 3))))
MESSAGE(FATAL_ERROR "Found Proj: ${PROJ_VERSION_MAJOR}.${PROJ_VERSION_MINOR}.${PROJ_VERSION_PATCH}. Cannot build QGIS using Proj older than 4.9.3.")
ENDIF((PROJ_VERSION_MAJOR EQUAL 4) AND ((PROJ_VERSION_MINOR LESS 9) OR ((PROJ_VERSION_MINOR EQUAL 9) AND (PROJ_VERSION_PATCH LESS 3))))
ENDIF(EXISTS ${PROJ_INCLUDE_DIR}/proj.h AND EXISTS ${PROJ_INCLUDE_DIR}/proj_experimental.h)
IF (NOT PROJ_FIND_QUIETLY)
MESSAGE(STATUS "Found Proj: ${PROJ_LIBRARY} version ${PROJ_VERSION_MAJOR} ${PROJ_VERSION_STR}")
ENDIF (NOT PROJ_FIND_QUIETLY)

INCLUDE_DIRECTORIES(BEFORE SYSTEM ${PROJ_INCLUDE_DIR})

ENDIF (PROJ_FOUND)
add_library(PROJ::proj UNKNOWN IMPORTED)
target_link_libraries(PROJ::proj INTERFACE ${PROJ_LIBRARY})
target_include_directories(PROJ::proj INTERFACE ${PROJ_INCLUDE_DIR})
set_target_properties(PROJ::proj PROPERTIES IMPORTED_LOCATION ${PROJ_LIBRARY})

ELSE (PROJ_FOUND)

IF (PROJ_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find Proj")
ENDIF (PROJ_FIND_REQUIRED)

ENDIF (PROJ_FOUND)
endif()
1 change: 0 additions & 1 deletion python/CMakeLists.txt
Expand Up @@ -73,7 +73,6 @@ include_directories(SYSTEM
${QT_QTNETWORK_INCLUDE_DIR}
${QT_QTSVG_INCLUDE_DIR}
${QT_QTXML_INCLUDE_DIR}
${GDAL_INCLUDE_DIR}
${GEOS_INCLUDE_DIR}
${QWT_INCLUDE_DIR}
${QCA_INCLUDE_DIR}
Expand Down
3 changes: 1 addition & 2 deletions src/core/CMakeLists.txt
Expand Up @@ -2247,7 +2247,6 @@ target_include_directories(qgis_core SYSTEM PUBLIC
${${QT_VERSION_BASE}Network_INCLUDE_DIRS}
${${QT_VERSION_BASE}Sql_INCLUDE_DIRS}
${${QT_VERSION_BASE}Concurrent_INCLUDE_DIRS}
${PROJ_INCLUDE_DIR}
${LIBZIP_INCLUDE_DIRS}
${SPATIALINDEX_INCLUDE_DIR} # before GEOS for case-insensitive filesystems
${GEOS_INCLUDE_DIR}
Expand Down Expand Up @@ -2415,7 +2414,6 @@ target_link_libraries(qgis_core
${OPTIONAL_QTWEBKIT}
${QCA_LIBRARY}
${QTKEYCHAIN_LIBRARY}
${PROJ_LIBRARY}
${GEOS_LIBRARY}
GDAL::GDAL
${SPATIALINDEX_LIBRARY}
Expand All @@ -2425,6 +2423,7 @@ target_link_libraries(qgis_core
${Protobuf_LITE_LIBRARY}
${ZLIB_LIBRARIES}
${EXIV2_LIBRARY}
PROJ::proj
)

if (WITH_DRACO)
Expand Down
1 change: 0 additions & 1 deletion src/crssync/CMakeLists.txt
Expand Up @@ -10,7 +10,6 @@ else ()

target_link_libraries(crssync
qgis_core
${PROJ_LIBRARY}
)

if(MSVC AND NOT USING_NMAKE)
Expand Down
4 changes: 0 additions & 4 deletions src/plugins/geometry_checker/CMakeLists.txt
Expand Up @@ -49,10 +49,6 @@ include_directories(
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
)
include_directories(SYSTEM
${GDAL_INCLUDE_DIR}
)

target_link_libraries(plugin_geometrychecker
qgis_core
qgis_gui
Expand Down
2 changes: 0 additions & 2 deletions src/plugins/grass/CMakeLists.txt
Expand Up @@ -81,8 +81,6 @@ include_directories(
${CMAKE_CURRENT_BINARY_DIR}
)
include_directories(SYSTEM
${GDAL_INCLUDE_DIR}
${PROJ_INCLUDE_DIR}
${GEOS_INCLUDE_DIR}
${POSTGRES_INCLUDE_DIR}
)
Expand Down
1 change: 0 additions & 1 deletion src/process/CMakeLists.txt
Expand Up @@ -42,7 +42,6 @@ target_link_libraries(qgis_process
qgis_core
qgis_analysis
${QT_VERSION_BASE}::Core
${PROJ_LIBRARY}
${GEOS_LIBRARY}
)

Expand Down
1 change: 0 additions & 1 deletion src/providers/grass/CMakeLists.txt
Expand Up @@ -8,7 +8,6 @@ include_directories(
${CMAKE_CURRENT_BINARY_DIR}
)
include_directories (SYSTEM
${PROJ_INCLUDE_DIR}
${GEOS_INCLUDE_DIR}
${POSTGRES_INCLUDE_DIR}
)
Expand Down
2 changes: 0 additions & 2 deletions src/providers/hana/CMakeLists.txt
Expand Up @@ -67,8 +67,6 @@ include_directories(
)

include_directories (SYSTEM
${PROJ_INCLUDE_DIR}
${GDAL_INCLUDE_DIR}
${ODBC_INCLUDE_DIRS}
${QCA_INCLUDE_DIR}
${QTKEYCHAIN_INCLUDE_DIR}
Expand Down
2 changes: 0 additions & 2 deletions src/quickgui/CMakeLists.txt
Expand Up @@ -26,8 +26,6 @@ include_directories(
)

include_directories(SYSTEM
${GDAL_INCLUDE_DIR}
${PROJ_INCLUDE_DIR}
${LIBZIP_INCLUDE_DIRS}
${SPATIALINDEX_INCLUDE_DIR}
${GEOS_INCLUDE_DIR}
Expand Down
2 changes: 0 additions & 2 deletions src/quickgui/plugin/CMakeLists.txt
Expand Up @@ -28,8 +28,6 @@ include_directories(
)

include_directories(SYSTEM
${GDAL_INCLUDE_DIR}
${PROJ_INCLUDE_DIR}
${LIBZIP_INCLUDE_DIRS}
${SPATIALINDEX_INCLUDE_DIR}
${GEOS_INCLUDE_DIR}
Expand Down
1 change: 0 additions & 1 deletion src/server/CMakeLists.txt
Expand Up @@ -113,7 +113,6 @@ endif()

target_link_libraries(qgis_server
qgis_core
${PROJ_LIBRARY}
${FCGI_LIBRARY}
${POSTGRES_LIBRARY}
${QCA_LIBRARY}
Expand Down
1 change: 0 additions & 1 deletion src/server/services/wcs/CMakeLists.txt
Expand Up @@ -19,7 +19,6 @@ add_library (wcs MODULE ${wcs_SRCS})
target_compile_features(wcs PRIVATE cxx_std_17)

include_directories(SYSTEM
${GDAL_INCLUDE_DIR}
${POSTGRES_INCLUDE_DIR}
)

Expand Down
1 change: 0 additions & 1 deletion src/server/services/wfs/CMakeLists.txt
Expand Up @@ -35,7 +35,6 @@ foreach(_library_type MODULE STATIC)
target_compile_features(${_library_name} PRIVATE cxx_std_17)

include_directories(${_library_name} SYSTEM PUBLIC
${GDAL_INCLUDE_DIR}
${POSTGRES_INCLUDE_DIR}
)

Expand Down
1 change: 0 additions & 1 deletion src/server/services/wfs3/CMakeLists.txt
Expand Up @@ -17,7 +17,6 @@ add_library (wfs3 MODULE ${WFS3_SRCS})
target_compile_features(wfs3 PRIVATE cxx_std_17)

include_directories(SYSTEM
${GDAL_INCLUDE_DIR}
${POSTGRES_INCLUDE_DIR}
)

Expand Down
1 change: 0 additions & 1 deletion src/server/services/wms/CMakeLists.txt
Expand Up @@ -45,7 +45,6 @@ foreach(_library_type MODULE STATIC)
target_compile_features(${_library_name} PRIVATE cxx_std_17)

include_directories(${_library_name} SYSTEM PUBLIC
${GDAL_INCLUDE_DIR}
${POSTGRES_INCLUDE_DIR}
)

Expand Down
1 change: 0 additions & 1 deletion src/server/services/wmts/CMakeLists.txt
Expand Up @@ -24,7 +24,6 @@ add_library (wmts MODULE ${WMTS_SRCS} ${WMTS_HDRS})
target_compile_features(wmts PRIVATE cxx_std_17)

include_directories(SYSTEM
${GDAL_INCLUDE_DIR}
${POSTGRES_INCLUDE_DIR}
)

Expand Down
1 change: 0 additions & 1 deletion tests/src/3d/CMakeLists.txt
Expand Up @@ -13,7 +13,6 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}
)
include_directories(SYSTEM
${QT_INCLUDE_DIR}
${GDAL_INCLUDE_DIR}
${${QT_VERSION_BASE}_3DEXTRA_INCLUDE_DIR}
)

Expand Down
1 change: 0 additions & 1 deletion tests/src/3d/sandbox/CMakeLists.txt
Expand Up @@ -34,7 +34,6 @@ target_link_libraries(qgis_3d_sandbox
${QT_VERSION_BASE}::Svg
${QT_VERSION_BASE}::Network
${QT_VERSION_BASE}::Test
${PROJ_LIBRARY}
${GEOS_LIBRARY}
${QWT_LIBRARY}
qgis_core
Expand Down
4 changes: 0 additions & 4 deletions tests/src/providers/grass/CMakeLists.txt
@@ -1,9 +1,6 @@
include_directories(
${CMAKE_SOURCE_DIR}/src/providers/grass
)
include_directories(BEFORE SYSTEM
${PROJ_INCLUDE_DIR}
)
include_directories(SYSTEM
${POSTGRES_INCLUDE_DIR}
${GEOS_INCLUDE_DIR}
Expand All @@ -28,7 +25,6 @@ macro (ADD_QGIS_GRASS_TEST grass_build_version testname testsrc)
${QT_VERSION_BASE}::Core
${QT_VERSION_BASE}::Svg
${QT_VERSION_BASE}::Test
${PROJ_LIBRARY}
${GEOS_LIBRARY}
qgis_core
qgis_test
Expand Down
2 changes: 0 additions & 2 deletions tests/src/quickgui/CMakeLists.txt
Expand Up @@ -16,11 +16,9 @@ include_directories(
)

include_directories(SYSTEM
${PROJ_INCLUDE_DIR}
${GEOS_INCLUDE_DIR}
${LIBZIP_INCLUDE_DIRS}
${SPATIALINDEX_INCLUDE_DIR}
${GDAL_INCLUDE_DIR}
${QCA_INCLUDE_DIR}
${QTKEYCHAIN_INCLUDE_DIR}
)
Expand Down
2 changes: 0 additions & 2 deletions tests/src/quickgui/app/CMakeLists.txt
Expand Up @@ -21,8 +21,6 @@ include_directories(
)

include_directories(SYSTEM
${GDAL_INCLUDE_DIR}
${PROJ_INCLUDE_DIR}
${LIBZIP_INCLUDE_DIRS}
${SPATIALINDEX_INCLUDE_DIR}
${GEOS_INCLUDE_DIR}
Expand Down

0 comments on commit 80c1bc7

Please sign in to comment.