# Find GDAL # ~~~~~~~~~ # Copyright (c) 2007, Magnus Homann # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # # # Once run this will define: # # GDAL_FOUND = system has GDAL lib # # GDAL_LIBRARY = full path to the library # # GDAL_INCLUDE_DIR = where to find headers message( STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " "Inside of FindGDAL.cmake... Searching for GDAL..." ) IF( WIN32 ) IF( MINGW ) FIND_PATH(GDAL_INCLUDE_DIR gdal.h /usr/local/include /usr/include c:/msys/local/include) FIND_LIBRARY(GDAL_LIBRARY NAMES gdal PATHS /usr/local/lib /usr/lib c:/msys/local/lib) ENDIF() IF( MSVC ) FIND_PATH( GDAL_INCLUDE_DIR gdal.h HINTS PATH_SUFFIXES include "$ENV{LIB_DIR}/include/gdal" $ENV{INCLUDE} PATHS "${AFTR_3RD_PARTY_ROOT}/gdal-3.0.4" ) FIND_LIBRARY( GDAL_LIBRARY NAMES gdal gdal_i PATHS "$ENV{LIB_DIR}/lib" $ENV{LIB} /usr/lib c:/msys/local/lib "${AFTR_3RD_PARTY_ROOT}/gdal-3.0.4/lib" DOC "Windows GDAL Library Location" ) IF( GDAL_LIBRARY ) SET( GDAL_LIBRARY;odbc32;odbccp32 CACHE STRING INTERNAL ) ENDIF( GDAL_LIBRARY ) ENDIF() ELSE() IF(UNIX) # 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_LIBRARY( GDAL_LIBRARY GDAL ) IF( GDAL_LIBRARY ) # they're all the same in a framework SET( GDAL_INCLUDE_DIR ${GDAL_LIBRARY}/Headers CACHE PATH "Path to a file.") SET( GDAL_CONFIG ${GDAL_LIBRARY}/Programs/geos-config CACHE FILEPATH "Path to a program." ) ENDIF( GDAL_LIBRARY ) SET( CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE ) ENDIF() ENDIF() IF( NOT GDAL_INCLUDE_DIR OR NOT GDAL_LIBRARY OR NOT GDAL_CONFIG ) # didn't find OS X framework, and was not set by user SET( GDAL_CONFIG_PREFER_PATH "$ENV{GDAL_HOME}/bin" CACHE STRING "preferred path to GDAL (gdal-config)" ) SET( GDAL_CONFIG_PREFER_FWTOOLS_PATH "$ENV{FWTOOLS_HOME}/bin_safe" CACHE STRING "preferred path to GDAL (gdal-config) from FWTools" ) FIND_PROGRAM( GDAL_CONFIG gdal-config ${GDAL_CONFIG_PREFER_PATH} ${GDAL_CONFIG_PREFER_FWTOOLS_PATH} /usr/local/bin/ /usr/bin/ ) # MESSAGE("DBG GDAL_CONFIG ${GDAL_CONFIG}") IF( GDAL_CONFIG ) ## extract gdal version EXEC_PROGRAM(${GDAL_CONFIG} ARGS --version OUTPUT_VARIABLE GDAL_VERSION ) STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" GDAL_VERSION_MAJOR "${GDAL_VERSION}") STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" GDAL_VERSION_MINOR "${GDAL_VERSION}") # MESSAGE("DBG GDAL_VERSION ${GDAL_VERSION}") # MESSAGE("DBG GDAL_VERSION_MAJOR ${GDAL_VERSION_MAJOR}") # MESSAGE("DBG GDAL_VERSION_MINOR ${GDAL_VERSION_MINOR}") # check for gdal version # version 1.2.5 is known NOT to be supported (missing CPL_STDCALL macro) # According to INSTALL, 1.4.0+ is required IF( GDAL_VERSION_MAJOR LESS 1 AND GDAL_VERSION_MINOR LESS 4 ) MESSAGE (FATAL_ERROR "GDAL version is too old (${GDAL_VERSION}). Use 1.4.0 or higher.") ENDIF( GDAL_VERSION_MAJOR LESS 1 AND GDAL_VERSION_MINOR LESS 4 ) # set INCLUDE_DIR to prefix+include EXEC_PROGRAM( ${GDAL_CONFIG} ARGS --prefix OUTPUT_VARIABLE GDAL_PREFIX) #SET(GDAL_INCLUDE_DIR ${GDAL_PREFIX}/include CACHE STRING INTERNAL) FIND_PATH( GDAL_INCLUDE_DIR gdal.h ${GDAL_PREFIX}/include/gdal ${GDAL_PREFIX}/include /usr/local/include /usr/include ) ## extract link dirs for rpath EXEC_PROGRAM( ${GDAL_CONFIG} ARGS --libs OUTPUT_VARIABLE GDAL_CONFIG_LIBS ) ## split off the link dirs (for rpath) ## use regular expression to match wildcard equivalent "-L*" ## with is a space or a semicolon STRING( REGEX MATCHALL "[-][L]([^ ;])+" GDAL_LINK_DIRECTORIES_WITH_PREFIX "${GDAL_CONFIG_LIBS}" ) # MESSAGE("DBG GDAL_LINK_DIRECTORIES_WITH_PREFIX=${GDAL_LINK_DIRECTORIES_WITH_PREFIX}") ## remove prefix -L because we need the pure directory for LINK_DIRECTORIES IF( GDAL_LINK_DIRECTORIES_WITH_PREFIX) STRING(REGEX REPLACE "[-][L]" "" GDAL_LINK_DIRECTORIES ${GDAL_LINK_DIRECTORIES_WITH_PREFIX} ) ENDIF( GDAL_LINK_DIRECTORIES_WITH_PREFIX) ## split off the name ## use regular expression to match wildcard equivalent "-l*" ## with is a space or a semicolon STRING(REGEX MATCHALL "[-][l]([^ ;])+" GDAL_LIB_NAME_WITH_PREFIX "${GDAL_CONFIG_LIBS}" ) # MESSAGE("DBG GDAL_LIB_NAME_WITH_PREFIX=${GDAL_LIB_NAME_WITH_PREFIX}") ## remove prefix -l because we need the pure name IF( GDAL_LIB_NAME_WITH_PREFIX) STRING(REGEX REPLACE "[-][l]" "" GDAL_LIB_NAME ${GDAL_LIB_NAME_WITH_PREFIX} ) ENDIF( GDAL_LIB_NAME_WITH_PREFIX) IF( APPLE) IF( NOT GDAL_LIBRARY) # work around empty GDAL_LIBRARY left by framework check # while still preserving user setting if given # ***FIXME*** need to improve framework check so below not needed SET(GDAL_LIBRARY ${GDAL_LINK_DIRECTORIES}/lib${GDAL_LIB_NAME}.dylib CACHE STRING INTERNAL FORCE) ENDIF( NOT GDAL_LIBRARY) ELSE (APPLE) SET(GDAL_LIBRARY ${GDAL_LINK_DIRECTORIES}/lib${GDAL_LIB_NAME}.so CACHE STRING INTERNAL) ENDIF( APPLE) ELSE(GDAL_CONFIG) MESSAGE("FindGDAL.cmake: gdal-config not found. Please set it manually. GDAL_CONFIG=${GDAL_CONFIG}") ENDIF(GDAL_CONFIG) ENDIF( NOT GDAL_INCLUDE_DIR OR NOT GDAL_LIBRARY OR NOT GDAL_CONFIG) ENDIF(UNIX) ENDIF(WIN32) IF( GDAL_INCLUDE_DIR AND GDAL_LIBRARY) SET(GDAL_FOUND TRUE) ENDIF() IF( GDAL_FOUND ) IF( NOT GDAL_FIND_QUIETLY ) MESSAGE( STATUS "Found GDAL_INCLUDE_DIR=${GDAL_INCLUDE_DIR}" ) MESSAGE( STATUS "Found GDAL_LIBRARY=${GDAL_LIBRARY}" ) ENDIF(NOT GDAL_FIND_QUIETLY) ELSE() MESSAGE(GDAL_INCLUDE_DIR=${GDAL_INCLUDE_DIR}) MESSAGE(GDAL_LIBRARY=${GDAL_LIBRARY}) MESSAGE(WARNING "Could not find GDAL") ENDIF()