diff --git a/cmake/FindSpatiaLite.cmake b/cmake/FindSpatiaLite.cmake index 86d03e190a46..acb3b0ed4ecc 100644 --- a/cmake/FindSpatiaLite.cmake +++ b/cmake/FindSpatiaLite.cmake @@ -11,69 +11,80 @@ # SPATIALITE_INCLUDE_DIR # SPATIALITE_LIBRARY -# This macro checks if the symbol exists -include(CheckLibraryExists) +find_package(PkgConfig REQUIRED) +pkg_search_module(PC_SPATIALITE IMPORTED_TARGET spatialite) - -# FIND_PATH and FIND_LIBRARY normally search standard locations -# before the specified paths. To search non-standard paths first, -# FIND_* is invoked first with specified paths and NO_DEFAULT_PATH -# and then again with no specified paths to search the default -# locations. When an earlier FIND_* succeeds, subsequent FIND_*s -# searching for the same item do nothing. - -# try to use sqlite framework on mac -# want clean framework path, not unix compatibility path -IF (APPLE AND NOT IOS) - 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(SPATIALITE_INCLUDE_DIR SQLite3/spatialite.h) - # if no SpatiaLite header, we don't want SQLite find below to succeed - IF (SPATIALITE_INCLUDE_DIR) - FIND_LIBRARY(SPATIALITE_LIBRARY SQLite3) - # FIND_PATH doesn't add "Headers" for a framework - SET (SPATIALITE_INCLUDE_DIR ${SPATIALITE_LIBRARY}/Headers CACHE PATH "Path to a file." FORCE) - ENDIF (SPATIALITE_INCLUDE_DIR) - SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE) - ENDIF () -ENDIF (APPLE AND NOT IOS) - -FIND_PATH(SPATIALITE_INCLUDE_DIR spatialite.h - /usr/include - "$ENV{INCLUDE}" - "$ENV{LIB_DIR}/include" - "$ENV{LIB_DIR}/include/spatialite" - ) - -FIND_LIBRARY(SPATIALITE_LIBRARY NAMES spatialite_i spatialite PATHS - /usr/lib - $ENV{LIB} - $ENV{LIB_DIR}/lib - ) - -IF (SPATIALITE_INCLUDE_DIR AND SPATIALITE_LIBRARY) - SET(SPATIALITE_FOUND TRUE) -ENDIF (SPATIALITE_INCLUDE_DIR AND SPATIALITE_LIBRARY) - - -IF (SPATIALITE_FOUND) - - IF (NOT SPATIALITE_FIND_QUIETLY) - MESSAGE(STATUS "Found SpatiaLite: ${SPATIALITE_LIBRARY}") - ENDIF (NOT SPATIALITE_FIND_QUIETLY) - - IF(APPLE) - # no extra LDFLAGS used in link test, may fail in OS X SDK - SET(CMAKE_REQUIRED_LIBRARIES "-F/Library/Frameworks" ${CMAKE_REQUIRED_LIBRARIES}) - ENDIF(APPLE) - -ELSE (SPATIALITE_FOUND) - - IF (SPATIALITE_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find SpatiaLite. Include: ${SPATIALITE_INCLUDE_DIR} Library: ${SPATIALITE_LIBRARY}") - ENDIF (SPATIALITE_FIND_REQUIRED) - -ENDIF (SPATIALITE_FOUND) +if(PC_SPATIALITE_FOUND) + add_library(spatialite::spatialite ALIAS PkgConfig::PC_SPATIALITE) +else() + # This macro checks if the symbol exists + include(CheckLibraryExists) + + + # FIND_PATH and FIND_LIBRARY normally search standard locations + # before the specified paths. To search non-standard paths first, + # FIND_* is invoked first with specified paths and NO_DEFAULT_PATH + # and then again with no specified paths to search the default + # locations. When an earlier FIND_* succeeds, subsequent FIND_*s + # searching for the same item do nothing. + + # try to use sqlite framework on mac + # want clean framework path, not unix compatibility path + IF (APPLE AND NOT IOS) + 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(SPATIALITE_INCLUDE_DIR SQLite3/spatialite.h) + # if no SpatiaLite header, we don't want SQLite find below to succeed + IF (SPATIALITE_INCLUDE_DIR) + FIND_LIBRARY(SPATIALITE_LIBRARY SQLite3) + # FIND_PATH doesn't add "Headers" for a framework + SET (SPATIALITE_INCLUDE_DIR ${SPATIALITE_LIBRARY}/Headers CACHE PATH "Path to a file." FORCE) + ENDIF (SPATIALITE_INCLUDE_DIR) + SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE) + ENDIF () + ENDIF (APPLE AND NOT IOS) + + FIND_PATH(SPATIALITE_INCLUDE_DIR spatialite.h + /usr/include + "$ENV{INCLUDE}" + "$ENV{LIB_DIR}/include" + "$ENV{LIB_DIR}/include/spatialite" + ) + + FIND_LIBRARY(SPATIALITE_LIBRARY NAMES spatialite_i spatialite PATHS + /usr/lib + $ENV{LIB} + $ENV{LIB_DIR}/lib + ) + + IF (SPATIALITE_INCLUDE_DIR AND SPATIALITE_LIBRARY) + SET(SPATIALITE_FOUND TRUE) + ENDIF (SPATIALITE_INCLUDE_DIR AND SPATIALITE_LIBRARY) + + + IF (SPATIALITE_FOUND) + add_library(spatialite::spatialite UNKNOWN IMPORTED) + target_link_libraries(spatialite::spatialite INTERFACE ${SPATIALITE_LIBRARY}) + target_include_directories(spatialite::spatialite INTERFACE ${SPATIALITE_INCLUDE_DIR}) + set_target_properties(spatialite::spatialite PROPERTIES IMPORTED_LOCATION ${SPATIALITE_LIBRARY}) + + IF (NOT SPATIALITE_FIND_QUIETLY) + MESSAGE(STATUS "Found SpatiaLite: ${SPATIALITE_LIBRARY}") + ENDIF (NOT SPATIALITE_FIND_QUIETLY) + + IF(APPLE) + # no extra LDFLAGS used in link test, may fail in OS X SDK + SET(CMAKE_REQUIRED_LIBRARIES "-F/Library/Frameworks" ${CMAKE_REQUIRED_LIBRARIES}) + ENDIF(APPLE) + + ELSE (SPATIALITE_FOUND) + + IF (SPATIALITE_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find SpatiaLite. Include: ${SPATIALITE_INCLUDE_DIR} Library: ${SPATIALITE_LIBRARY}") + ENDIF (SPATIALITE_FIND_REQUIRED) + + ENDIF (SPATIALITE_FOUND) +endif() diff --git a/external/qspatialite/CMakeLists.txt b/external/qspatialite/CMakeLists.txt index 0e5df6a8a1f1..33536dafe913 100644 --- a/external/qspatialite/CMakeLists.txt +++ b/external/qspatialite/CMakeLists.txt @@ -17,8 +17,7 @@ add_library(qsqlspatialite SHARED ${QSQLSPATIALITE_SRC}) target_link_libraries(qsqlspatialite ${Qt5Core_LIBRARIES} ${Qt5Sql_LIBRARIES} - ${SQLITE3_LIBRARY} - ${SPATIALITE_LIBRARY} + spatialite::spatialite qgis_core ) diff --git a/src/analysis/CMakeLists.txt b/src/analysis/CMakeLists.txt index 28b686769ad9..cf0d76e3969c 100644 --- a/src/analysis/CMakeLists.txt +++ b/src/analysis/CMakeLists.txt @@ -458,7 +458,6 @@ if (WITH_PDAL AND PDAL_2_5_OR_HIGHER) ) endif() -include_directories(SYSTEM ${SPATIALITE_INCLUDE_DIR}) include_directories(SYSTEM ${SPATIALINDEX_INCLUDE_DIR}) include_directories(SYSTEM ${SQLITE3_INCLUDE_DIR}) include_directories(BEFORE raster) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index db1c050f154b..79fb3e24394e 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -2262,12 +2262,6 @@ target_include_directories(qgis_core SYSTEM PUBLIC ${EXIV2_INCLUDE_DIR} ) -if (WITH_SPATIALITE) - target_include_directories(qgis_core SYSTEM PUBLIC - ${SPATIALITE_INCLUDE_DIR} - ) -endif() - target_include_directories(qgis_core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} @@ -2444,7 +2438,7 @@ if (NOT IOS) endif() if (WITH_SPATIALITE) - target_link_libraries(qgis_core ${SPATIALITE_LIBRARY}) + target_link_libraries(qgis_core spatialite::spatialite) endif() if (BUILD_WITH_QT6) diff --git a/src/plugins/offline_editing/CMakeLists.txt b/src/plugins/offline_editing/CMakeLists.txt index bb1c90af5459..c7ca21558d36 100644 --- a/src/plugins/offline_editing/CMakeLists.txt +++ b/src/plugins/offline_editing/CMakeLists.txt @@ -36,12 +36,6 @@ target_compile_features(plugin_offlineediting PRIVATE cxx_std_17) target_link_libraries(plugin_offlineediting qgis_core qgis_gui - ${SPATIALITE_LIBRARY} -) - -include_directories(SYSTEM - ${SPATIALITE_INCLUDE_DIR} - ${SQLITE3_INCLUDE_DIR} ) include_directories( diff --git a/src/providers/spatialite/CMakeLists.txt b/src/providers/spatialite/CMakeLists.txt index a9de25a4059b..efaad9a47c81 100644 --- a/src/providers/spatialite/CMakeLists.txt +++ b/src/providers/spatialite/CMakeLists.txt @@ -38,7 +38,7 @@ target_include_directories(provider_spatialite_a PUBLIC target_link_libraries(provider_spatialite_a qgis_core - ${SPATIALITE_LIBRARY} + spatialite::spatialite ) # require c++17 @@ -95,7 +95,7 @@ else() target_link_libraries(provider_spatialite qgis_core - ${SPATIALITE_LIBRARY} + spatialite::spatialite ) if (WITH_GUI) diff --git a/src/providers/virtual/CMakeLists.txt b/src/providers/virtual/CMakeLists.txt index 281e1156c03b..524740624c32 100644 --- a/src/providers/virtual/CMakeLists.txt +++ b/src/providers/virtual/CMakeLists.txt @@ -40,8 +40,6 @@ target_include_directories(provider_virtuallayer_a PUBLIC target_link_libraries(provider_virtuallayer_a qgis_core - ${SQLITE3_LIBRARY} - ${SPATIALITE_LIBRARY} ) # require c++17 @@ -97,8 +95,6 @@ else() qgis_core ${QT_VERSION_BASE}::Core ${QT_VERSION_BASE}::Widgets - ${SQLITE3_LIBRARY} - ${SPATIALITE_LIBRARY} ) if (WITH_GUI) diff --git a/src/quickgui/CMakeLists.txt b/src/quickgui/CMakeLists.txt index 95b853860bef..e1f1e0a85266 100644 --- a/src/quickgui/CMakeLists.txt +++ b/src/quickgui/CMakeLists.txt @@ -32,8 +32,6 @@ include_directories(SYSTEM ${SPATIALINDEX_INCLUDE_DIR} ${GEOS_INCLUDE_DIR} ${EXPAT_INCLUDE_DIR} - ${SQLITE3_INCLUDE_DIR} - ${SPATIALITE_INCLUDE_DIR} ${QCA_INCLUDE_DIR} ${QTKEYCHAIN_INCLUDE_DIR} ) diff --git a/src/quickgui/plugin/CMakeLists.txt b/src/quickgui/plugin/CMakeLists.txt index fa42bede1d40..585e5edf71dc 100644 --- a/src/quickgui/plugin/CMakeLists.txt +++ b/src/quickgui/plugin/CMakeLists.txt @@ -35,7 +35,6 @@ include_directories(SYSTEM ${GEOS_INCLUDE_DIR} ${EXPAT_INCLUDE_DIR} ${SQLITE3_INCLUDE_DIR} - ${SPATIALITE_INCLUDE_DIR} ${QCA_INCLUDE_DIR} ${QTKEYCHAIN_INCLUDE_DIR} ) diff --git a/tests/src/quickgui/CMakeLists.txt b/tests/src/quickgui/CMakeLists.txt index 2e27caff95d8..ea16e3f8a109 100644 --- a/tests/src/quickgui/CMakeLists.txt +++ b/tests/src/quickgui/CMakeLists.txt @@ -22,8 +22,6 @@ include_directories(SYSTEM ${SPATIALINDEX_INCLUDE_DIR} ${GDAL_INCLUDE_DIR} ${EXPAT_INCLUDE_DIR} - ${SQLITE3_INCLUDE_DIR} - ${SPATIALITE_INCLUDE_DIR} ${QCA_INCLUDE_DIR} ${QTKEYCHAIN_INCLUDE_DIR} ) diff --git a/tests/src/quickgui/app/CMakeLists.txt b/tests/src/quickgui/app/CMakeLists.txt index ca552545042d..dd2c90a8258f 100644 --- a/tests/src/quickgui/app/CMakeLists.txt +++ b/tests/src/quickgui/app/CMakeLists.txt @@ -27,8 +27,6 @@ include_directories(SYSTEM ${SPATIALINDEX_INCLUDE_DIR} ${GEOS_INCLUDE_DIR} ${EXPAT_INCLUDE_DIR} - ${SQLITE3_INCLUDE_DIR} - ${SPATIALITE_INCLUDE_DIR} ${QCA_INCLUDE_DIR} ${QTKEYCHAIN_INCLUDE_DIR} )