FindQGIS.cmake 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. ## Once run this will define:
  2. ##
  3. ## QGIS_FOUND = system has QGIS lib
  4. ##
  5. ## QGIS_CORE_LIBRARY = full path to the CORE library
  6. ## QGIS_ANALYSIS_LIBRARY = full path to the ANALYSIS library
  7. ## QGIS_INCLUDE_DIR = where to find headers
  8. ##
  9. ## QGIS_VERSION = version as defined in qgsconfig.h, as major.minor.patch
  10. ##
  11. ## Definitions or ENV variables affecting search locations
  12. ##
  13. ## OSGEO4W_ROOT = [A-Z]:/path/to/OSGeo4W/install/root
  14. ## (^ use forward slashes!)
  15. ## OSGEO4W_QGIS_SUBDIR = qgis[-rel|-ltr][-dev], in OSGEO4W_ROOT/apps/
  16. ## QGIS_MAC_PATH = /path/to/any/QGIS.app/Contents
  17. ## QGIS_BUILD_PATH = [A-Z:]/path/to/QGIS/build/directory
  18. ##
  19. ## Tim Sutton
  20. ## Larry Shaffer (2017-01-31)
  21. #MESSAGE("Searching for QGIS")
  22. IF(WIN32)
  23. # OSGEO4W_QGIS_SUBDIR relative install: qgis[-rel|-ltr][-dev], etc.
  24. IF (NOT OSGEO4W_QGIS_SUBDIR OR "${OSGEO4W_QGIS_SUBDIR}" STREQUAL "")
  25. IF (NOT "$ENV{OSGEO4W_QGIS_SUBDIR}" STREQUAL "")
  26. SET (OSGEO4W_QGIS_SUBDIR $ENV{OSGEO4W_QGIS_SUBDIR})
  27. ELSE ()
  28. SET (OSGEO4W_QGIS_SUBDIR qgis)
  29. ENDIF ()
  30. ENDIF ()
  31. #MESSAGE("Searching for QGIS in $ENV{PROGRAMFILES}/QGIS")
  32. IF (MINGW)
  33. FIND_PATH(QGIS_INCLUDE_DIR
  34. NAMES qgsapplication.h
  35. PATHS
  36. "$ENV{PROGRAMFILES}/QGIS/include"
  37. )
  38. FIND_LIBRARY(QGIS_CORE_LIBRARY
  39. NAMES qgis_core
  40. PATHS
  41. "$ENV{PROGRAMFILES}/QGIS/"
  42. )
  43. ENDIF (MINGW)
  44. IF (MSVC)
  45. FIND_PATH(QGIS_PLUGIN_DIR
  46. NAMES wmsprovider.dll
  47. PATHS
  48. "$ENV{OSGEO4W_ROOT}/apps/${OSGEO4W_QGIS_SUBDIR}/plugins"
  49. "$ENV{PROGRAMFILES}/QGIS/plugins"
  50. "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools/qgis/plugins"
  51. )
  52. FIND_PATH(QGIS_INCLUDE_DIR
  53. NAMES qgsapplication.h
  54. PATHS
  55. "$ENV{INCLUDE}"
  56. "$ENV{LIB_DIR}/include/qgis"
  57. "$ENV{OSGEO4W_ROOT}/include"
  58. "$ENV{OSGEO4W_ROOT}/apps/${OSGEO4W_QGIS_SUBDIR}/include"
  59. "$ENV{PROGRAMFILES}/QGIS/include"
  60. )
  61. FIND_LIBRARY(QGIS_CORE_LIBRARY
  62. NAMES qgis_core
  63. PATHS
  64. "$ENV{LIB_DIR}/lib/"
  65. "$ENV{LIB}"
  66. "$ENV{OSGEO4W_ROOT}/lib"
  67. "$ENV{OSGEO4W_ROOT}/apps/${OSGEO4W_QGIS_SUBDIR}/lib"
  68. "$ENV{PROGRAMFILES}/QGIS/lib"
  69. )
  70. FIND_LIBRARY(QGIS_ANALYSIS_LIBRARY
  71. NAMES qgis_analysis
  72. PATHS
  73. "$ENV{LIB_DIR}"
  74. "$ENV{LIB}"
  75. "$ENV{OSGEO4W_ROOT}/lib"
  76. "$ENV{OSGEO4W_ROOT}/apps/${OSGEO4W_QGIS_SUBDIR}/lib"
  77. "$ENV{PROGRAMFILES}/QGIS/lib"
  78. )
  79. ENDIF (MSVC)
  80. elseif(ANDROID)
  81. find_path(
  82. QGIS_INCLUDE_DIR
  83. NAMES qgis.h
  84. HINTS ${OSGEO4A_STAGE_DIR}/${ANDROID_ABI}
  85. PATH_SUFFIXES /include/qgis
  86. )
  87. find_library(
  88. QGIS_CORE_LIBRARY
  89. qgis_core_${ANDROID_ABI}
  90. HINTS ${OSGEO4A_STAGE_DIR}/${ANDROID_ABI}
  91. PATH_SUFFIXES /lib
  92. )
  93. find_library(
  94. QGIS_ANALYSIS_LIBRARY
  95. qgis_analysis_${ANDROID_ABI}
  96. HINTS ${OSGEO4A_STAGE_DIR}/${ANDROID_ABI}
  97. PATH_SUFFIXES /lib
  98. )
  99. ELSEIF(UNIX)
  100. #MESSAGE("Searching for QGIS in /usr/bin; /usr/local/bin")
  101. FIND_PATH(QGIS_INCLUDE_DIR
  102. NAMES qgis.h
  103. PATHS
  104. ${CMAKE_PREFIX_PATH}
  105. ${QGIS_BUILD_PATH}/output/lib/qgis_core.framework/Headers
  106. ${QGIS_MAC_PATH}/Frameworks/qgis_core.framework/Headers
  107. ${QGIS_PREFIX_PATH}/include/qgis
  108. /usr/include/qgis
  109. /usr/local/include/qgis
  110. /Library/Frameworks/qgis_core.framework/Headers
  111. "$ENV{LIB_DIR}/include/qgis"
  112. PATH_SUFFIXES QGIS.app/Contents/Frameworks/qgis_core.framework/Headers
  113. )
  114. # also get other frameworks' headers folders on OS X
  115. IF (APPLE AND USE_MAC_BUNDLING)
  116. FIND_PATH(QGIS_ANALYSIS_INCLUDE_DIR
  117. NAMES qgsanalysis.h
  118. PATHS
  119. ${CMAKE_PREFIX_PATH}
  120. ${QGIS_BUILD_PATH}/output/lib
  121. ${QGIS_MAC_PATH}/Frameworks
  122. /Library/Frameworks
  123. PATH_SUFFIXES
  124. qgis_analysis.framework/Headers
  125. QGIS.app/Contents/Frameworks/qgis_analysis.framework/Headers
  126. )
  127. SET(QGIS_INCLUDE_DIR
  128. ${QGIS_INCLUDE_DIR}
  129. ${QGIS_ANALYSIS_INCLUDE_DIR}
  130. )
  131. # qgis_core is an archive without extensions for ios
  132. SET(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} "")
  133. ENDIF (APPLE AND USE_MAC_BUNDLING)
  134. FIND_LIBRARY(QGIS_CORE_LIBRARY
  135. NAMES qgis_core
  136. PATHS
  137. ${CMAKE_PREFIX_PATH}
  138. ${QGIS_BUILD_PATH}/output/lib
  139. ${QGIS_MAC_PATH}/Frameworks
  140. ${QGIS_MAC_PATH}/lib
  141. ${QGIS_PREFIX_PATH}/lib/
  142. /usr/lib64
  143. /usr/lib
  144. /usr/local/lib
  145. /Library/Frameworks
  146. "$ENV{LIB_DIR}/lib/"
  147. PATH_SUFFIXES
  148. QGIS.app/Contents/Frameworks/qgis_core.framework
  149. )
  150. FIND_LIBRARY(QGIS_ANALYSIS_LIBRARY
  151. NAMES qgis_analysis
  152. PATHS
  153. ${CMAKE_PREFIX_PATH}
  154. ${QGIS_BUILD_PATH}/output/lib
  155. ${QGIS_MAC_PATH}/Frameworks
  156. ${QGIS_MAC_PATH}/lib
  157. ${QGIS_PREFIX_PATH}/lib/
  158. /usr/lib64
  159. /usr/lib
  160. /usr/local/lib
  161. /Library/Frameworks
  162. "$ENV{LIB_DIR}/lib/"
  163. PATH_SUFFIXES
  164. QGIS.app/Contents/Frameworks/qgis_analysis.framework
  165. )
  166. IF (APPLE AND USE_MAC_BUNDLING)
  167. FIND_PATH(QGIS_APPLE_RESOURCES_DIR
  168. NAMES FindQGIS.cmake
  169. PATHS
  170. ${CMAKE_PREFIX_PATH}
  171. ${QGIS_BUILD_PATH}/output/bin
  172. ${QGIS_MAC_PATH}/Frameworks
  173. /Library/Frameworks
  174. PATH_SUFFIXES
  175. QGIS.app/Contents/Resources
  176. REQUIRED
  177. )
  178. ENDIF()
  179. # Not sure how this affect other build, so let's keep that only for iOs for now
  180. IF(${CMAKE_SYSTEM_NAME} STREQUAL "iOS")
  181. function(find_and_link_library TARGET LIBRARY FORCE_SDK)
  182. if(FORCE_SDK)
  183. set(ADDITIONAL_ARGS "NO_CMAKE_FIND_ROOT_PATH")
  184. endif()
  185. find_library(${LIBRARY}-LIBRARY ${LIBRARY} ${ADDITIONAL_ARGS})
  186. if(${LIBRARY}-LIBRARY)
  187. message(STATUS "Link ${${LIBRARY}-LIBRARY} interface to ${TARGET}")
  188. target_link_libraries(${TARGET} INTERFACE ${${LIBRARY}-LIBRARY})
  189. else()
  190. message(FATAL_ERROR "Fail to find library ${LIBRARY}. Make sure it is present in CMAKE_PREFIX_PATH")
  191. endif()
  192. endfunction()
  193. # Create an interface library for qgis_core & qgis_analysis
  194. # In the best world, this should have been properly handled inside qgis
  195. # qgis should use cpack, and generate its correct find cmake scripts.
  196. # If this is implemented in QGIS in the future, this whole won't have a reason to exist.
  197. add_library(qgis_core INTERFACE)
  198. target_link_libraries(qgis_core INTERFACE ${QGIS_CORE_LIBRARY})
  199. function(qgis_core_link_library LIBRARY FORCE_SDK)
  200. find_and_link_library(qgis_core ${LIBRARY} ${FORCE_SDK})
  201. endfunction()
  202. # qgis_core is built using bz2, xml2 from sysroot
  203. qgis_core_link_library(bz2 FALSE)
  204. qgis_core_link_library(z FALSE)
  205. qgis_core_link_library(xml2 FALSE)
  206. # lzma support is disabled in libzip
  207. # qgis_core_link_library(lzma FALSE)
  208. qgis_core_link_library(iconv FALSE)
  209. qgis_core_link_library(charset TRUE)
  210. qgis_core_link_library(expat TRUE)
  211. qgis_core_link_library(freexl TRUE)
  212. qgis_core_link_library(gdal TRUE)
  213. qgis_core_link_library(geos TRUE)
  214. qgis_core_link_library(geos_c TRUE)
  215. qgis_core_link_library(pq TRUE)
  216. qgis_core_link_library(proj TRUE)
  217. # Be careful, protobuf/protobuf-lite are also in sysroot. But we want to use the one from our sdk
  218. qgis_core_link_library(protobuf-lite TRUE)
  219. qgis_core_link_library(protobuf TRUE)
  220. qgis_core_link_library(protoc TRUE)
  221. qgis_core_link_library(qt5keychain TRUE)
  222. qgis_core_link_library(qca-qt5 TRUE)
  223. qgis_core_link_library(spatialindex TRUE)
  224. qgis_core_link_library(spatialite TRUE)
  225. qgis_core_link_library(tasn1 TRUE)
  226. qgis_core_link_library(zip TRUE)
  227. qgis_core_link_library(zstd TRUE)
  228. function(qgis_core_link_plugin PLUGIN)
  229. find_library(QGIS_${PLUGIN}_PLUGIN_LIBRARY ${PLUGIN}
  230. PATH_SUFFIXES
  231. QGIS.app/Contents/PlugIns/qgis/
  232. qgis/plugins
  233. )
  234. if(QGIS_${PLUGIN}_PLUGIN_LIBRARY)
  235. message(STATUS "Link ${QGIS_${PLUGIN}_PLUGIN_LIBRARY} interface to qgis_core")
  236. target_link_libraries(qgis_core INTERFACE ${QGIS_${PLUGIN}_PLUGIN_LIBRARY})
  237. else()
  238. message(FATAL_ERROR "Fail to find library ${PLUGIN}. Make sure it is present in CMAKE_PREFIX_PATH/QGIS.app/Contents/PlugIns/qgis/")
  239. endif()
  240. endfunction()
  241. qgis_core_link_plugin(provider_wms_a)
  242. qgis_core_link_plugin(provider_postgres_a)
  243. qgis_core_link_plugin(provider_postgresraster_a)
  244. qgis_core_link_plugin(authmethod_basic_a)
  245. qgis_core_link_plugin(authmethod_esritoken_a)
  246. qgis_core_link_plugin(authmethod_identcert_a)
  247. qgis_core_link_plugin(authmethod_oauth2_a)
  248. qgis_core_link_plugin(authmethod_pkcs12_a)
  249. qgis_core_link_plugin(authmethod_pkipaths_a)
  250. target_include_directories(qgis_core INTERFACE ${QGIS_INCLUDE_DIR})
  251. # Versionless tagging of Qt, only supported from Qt5.15
  252. if(NOT TARGET Qt::PrintSupport)
  253. target_compile_definitions(qgis_core INTERFACE "-DQT_NO_PRINTER")
  254. endif()
  255. function(qgis_analysis_link_library LIBRARY FORCE_SDK)
  256. find_and_link_library(qgis_analysis ${LIBRARY} ${FORCE_SDK})
  257. endfunction()
  258. add_library(qgis_analysis INTERFACE)
  259. target_link_libraries(qgis_analysis INTERFACE ${QGIS_ANALYSIS_LIBRARY} qgis_core)
  260. qgis_analysis_link_library(exiv2 TRUE)
  261. qgis_analysis_link_library(exiv2-xmp TRUE)
  262. target_include_directories(qgis_analysis INTERFACE ${QGIS_ANALYSIS_INCLUDE_DIR})
  263. # Overwrite the variable to point to the interface library
  264. set(QGIS_CORE_LIBRARY qgis_core)
  265. set(QGIS_ANALYSIS_LIBRARY qgis_analysis)
  266. find_file(PROJ_DB proj.db PATHS ${CMAKE_PREFIX_PATH} PATH_SUFFIXES share/proj share/proj4 REQUIRED)
  267. get_filename_component(QFIELD_PROJ_DIR ${PROJ_DB} DIRECTORY)
  268. message("Found Proj DB directory: " ${QFIELD_PROJ_DIR})
  269. FIND_PATH(PROJ_INCLUDE_DIR proj_api.h NO_CMAKE_FIND_ROOT_PATH)
  270. MESSAGE("Found Proj include dir: " ${PROJ_INCLUDE_DIR})
  271. FIND_PATH(GDAL_INCLUDE_DIR gdal.h NO_CMAKE_FIND_ROOT_PATH)
  272. MESSAGE("Found GDAL include dir: " ${GDAL_INCLUDE_DIR})
  273. ENDIF() # iOs
  274. ENDIF()
  275. IF (QGIS_INCLUDE_DIR)
  276. SET(QGIS_VERSION QGIS_VERSION-NOTFOUND)
  277. FIND_FILE(_qgsconfig_h qgsconfig.h PATHS ${QGIS_INCLUDE_DIR})
  278. IF (_qgsconfig_h)
  279. FILE(READ ${_qgsconfig_h} _qgsconfig)
  280. IF (_qgsconfig)
  281. # version defined like #define VERSION "2.14.8-Essen"
  282. FILE(STRINGS "${_qgsconfig_h}" _qgsversion_str REGEX "^#define VERSION .*$")
  283. STRING(REGEX REPLACE "^#define VERSION +\"([0-9]+\\.[0-9]+\\.[0-9]+).*$" "\\1" _qgsversion "${_qgsversion_str}")
  284. IF (_qgsversion)
  285. SET(QGIS_VERSION ${_qgsversion})
  286. ELSE ()
  287. MESSAGE(WARNING "No QGIS version determined: failed to parse qgsconfig.h")
  288. ENDIF ()
  289. ELSE()
  290. MESSAGE(WARNING "No QGIS version determined: failed to read qgsconfig.h")
  291. ENDIF ()
  292. ELSE ()
  293. MESSAGE(WARNING "No QGIS version determined: failed to find qgsconfig.h")
  294. ENDIF ()
  295. ENDIF ()
  296. IF (QGIS_INCLUDE_DIR AND QGIS_CORE_LIBRARY AND QGIS_ANALYSIS_LIBRARY)
  297. SET(QGIS_FOUND TRUE)
  298. ELSE ()
  299. # Useful logs addressed to sdk mainteners
  300. IF(NOT QGIS_INCLUDE_DIR)
  301. MESSAGE(WARNING "Fail to find QGIS core include folder")
  302. ENDIF ()
  303. IF(NOT QGIS_CORE_LIBRARY)
  304. MESSAGE(WARNING "Fail to find QGIS core include folder")
  305. ENDIF ()
  306. IF(NOT QGIS_ANALYSIS_INCLUDE_DIR)
  307. MESSAGE(WARNING "Fail to find QGIS analysis include folder")
  308. ENDIF ()
  309. IF(NOT QGIS_ANALYSIS_LIBRARY)
  310. MESSAGE(WARNING "Fail to find QGIS analysis include folder")
  311. ENDIF ()
  312. ENDIF ()
  313. IF (QGIS_FOUND)
  314. IF (NOT QGIS_FIND_QUIETLY)
  315. MESSAGE(STATUS "Found QGIS: ${QGIS_VERSION}")
  316. MESSAGE(STATUS "Found QGIS core: ${QGIS_CORE_LIBRARY}")
  317. MESSAGE(STATUS "Found QGIS analysis: ${QGIS_ANALYSIS_LIBRARY}")
  318. ENDIF (NOT QGIS_FIND_QUIETLY)
  319. ELSE (QGIS_FOUND)
  320. IF (QGIS_FIND_REQUIRED)
  321. MESSAGE(FATAL_ERROR "Could not find QGIS. Make sure QGIS sdk is located in CMAKE_PREFIX_PATH")
  322. ENDIF (QGIS_FIND_REQUIRED)
  323. ENDIF (QGIS_FOUND)