####################################################################### # Find the library for SWIG # # The goal here is to intercept calls to "FIND_PACKAGE(SWIG)" in order # to do a global version check locally after passing on the "find" to # SWIG-provided scripts. ######################################################################## # make this file non-reentrant within the current context if(__INCLUDED_FIND_SWIG_CMAKE) return() endif() set(__INCLUDED_FIND_SWIG_CMAKE TRUE) # some status messages message(STATUS "") message(STATUS "Checking for module SWIG") # # First check to see if SWIG installed its own CMake file, or if the # one provided by CMake finds SWIG. # # save the current MODULE path set(SAVED_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) # clear the current MODULE path; uses system paths only unset(CMAKE_MODULE_PATH) # try to find SWIG via the provided parameters, # handle REQUIRED internally later unset(SWIG_FOUND) # was the version specified? unset(LOCAL_SWIG_FIND_VERSION) if(SWIG_FIND_VERSION) set(LOCAL_SWIG_FIND_VERSION ${SWIG_FIND_VERSION}) endif(SWIG_FIND_VERSION) # was EXACT specified? unset(LOCAL_SWIG_FIND_VERSION_EXACT) if(SWIG_FIND_VERSION_EXACT) set(LOCAL_SWIG_FIND_VERSION_EXACT "EXACT") endif(SWIG_FIND_VERSION_EXACT) # was REQUIRED specified? unset(LOCAL_SWIG_FIND_REQUIRED) if(SWIG_FIND_REQUIRED) set(LOCAL_SWIG_FIND_REQUIRED "REQUIRED") endif(SWIG_FIND_REQUIRED) # try to find SWIG using the provided parameters, quietly; # # this call will error out internally (and not quietly) if: # 1: EXACT is specified and the version found does not match the requested version; # 2: REQUIRED is set and SWIG was not found; # # this call will return SWIG_FOUND == FALSE if REQUIRED is not set, and: # 1: SWIG was not found; # 2: The version found is less than the requested version. find_package( SWIG ${LOCAL_SWIG_FIND_VERSION} ${LOCAL_SWIG_FIND_VERSION_EXACT} ${LOCAL_SWIG_FIND_REQUIRED} QUIET ) # restore CMAKE_MODULE_PATH set(CMAKE_MODULE_PATH ${SAVED_CMAKE_MODULE_PATH}) # specific version checks set(SWIG_VERSION_CHECK FALSE) if(SWIG_FOUND) # SWIG was found; make sure the version meets GR's needs message(STATUS "Found SWIG version ${SWIG_VERSION}.") if("${SWIG_VERSION}" VERSION_GREATER "1.3.30") if(NOT "${SWIG_VERSION}" VERSION_EQUAL "3.0.3" AND NOT "${SWIG_VERSION}" VERSION_EQUAL "3.0.4") set(SWIG_VERSION_CHECK TRUE) else() message(STATUS "SWIG versions 3.0.3 and 3.0.4 fail to work with GNU Radio.") endif() else() message(STATUS "Minimum SWIG version required is 1.3.31 for GNU Radio.") endif() else() # SWIG was either not found, or is less than the requested version if(SWIG_VERSION) # SWIG_VERSION is set, but SWIG_FOUND is false; probably a version mismatch message(STATUS "Found SWIG version ${SWIG_VERSION}.") message(STATUS "Requested SWIG version is at least ${SWIG_FIND_VERSION}.") endif() endif() # did the version check fail? if(NOT SWIG_VERSION_CHECK) # yes: clear various variables and set FOUND to FALSE message(STATUS "Disabling SWIG because version check failed.") unset(SWIG_VERSION CACHE) unset(SWIG_DIR CACHE) unset(SWIG_EXECUTABLE CACHE) set(SWIG_FOUND FALSE CACHE BOOL "Set to TRUE if a compatible version of SWIG is found" FORCE) endif() # check to see if SWIG variables were set if(SWIG_FOUND AND SWIG_DIR AND SWIG_EXECUTABLE) # yes: even if set SWIG_FOUND==TRUE, then these have already been # done, but done quietly. It does not hurt to redo them here. include(FindPackageHandleStandardArgs) find_package_handle_standard_args(SWIG DEFAULT_MSG SWIG_EXECUTABLE SWIG_DIR) mark_as_advanced(SWIG_EXECUTABLE SWIG_DIR) elseif(SWIG_FIND_REQUIRED) if(SWIG_FIND_VERSION) message(FATAL_ERROR "The found SWIG version (${SWIG_VERSION}) is not compatible with the version required (${SWIG_FIND_VERSION}).") else() message(FATAL_ERROR "SWIG is required, but was not found.") endif() endif()