Commit ff6f7b23 authored by Seth R Johnson's avatar Seth R Johnson
Browse files

FindSWIG: reduce calls to SWIG exe, and clean up variables

If all SWIG cache variables (EXECUTABLE, DIR, VERSION) are set,
there should be no need to invoke the SWIG exe on a reconfigure. This
changeset reduces the number of calls to the SWIG executable, and
additonially prevents temporary `SWIG_xxx` values from propagating outside
the `find_package` call.

I also refactored the conditionals to be less nested (and thus more
predictable), including changing theh definition of SWIG_USE_FILE to
reflect that it's if and only if SWIG_FOUND is trure.
parent 4f88cb16
...@@ -87,56 +87,68 @@ if (NOT _SWIG_NAMES) ...@@ -87,56 +87,68 @@ if (NOT _SWIG_NAMES)
endif() endif()
find_program(SWIG_EXECUTABLE NAMES ${_SWIG_NAMES} swig) find_program(SWIG_EXECUTABLE NAMES ${_SWIG_NAMES} swig)
unset(_SWIG_NAMES)
if(SWIG_EXECUTABLE) if(SWIG_EXECUTABLE AND NOT SWIG_DIR)
# Find default value for SWIG library directory
execute_process(COMMAND ${SWIG_EXECUTABLE} -swiglib execute_process(COMMAND ${SWIG_EXECUTABLE} -swiglib
OUTPUT_VARIABLE SWIG_swiglib_output OUTPUT_VARIABLE _swig_output
ERROR_VARIABLE SWIG_swiglib_error ERROR_VARIABLE _swig_error
RESULT_VARIABLE SWIG_swiglib_result) RESULT_VARIABLE _swig_result)
if(SWIG_swiglib_result) if(_swig_result)
set(_msg "Command \"${SWIG_EXECUTABLE} -swiglib\" failed with output:\n${_swig_error}")
if(SWIG_FIND_REQUIRED) if(SWIG_FIND_REQUIRED)
message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -swiglib\" failed with output:\n${SWIG_swiglib_error}") message(SEND_ERROR "${_msg}")
else() else()
message(STATUS "Command \"${SWIG_EXECUTABLE} -swiglib\" failed with output:\n${SWIG_swiglib_error}") message(STATUS "${_msg}")
endif() endif()
unset(_msg)
else() else()
string(REGEX REPLACE "[\n\r]+" ";" SWIG_swiglib_output ${SWIG_swiglib_output}) string(REGEX REPLACE "[\n\r]+" ";" _SWIGLIB ${_swig_output})
find_path(SWIG_DIR swig.swg PATHS ${SWIG_swiglib_output} NO_CMAKE_FIND_ROOT_PATH)
if(SWIG_DIR)
set(SWIG_USE_FILE ${CMAKE_CURRENT_LIST_DIR}/UseSWIG.cmake)
execute_process(COMMAND ${SWIG_EXECUTABLE} -version
OUTPUT_VARIABLE SWIG_version_output
ERROR_VARIABLE SWIG_version_output
RESULT_VARIABLE SWIG_version_result)
if(SWIG_version_result)
message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -version\" failed with output:\n${SWIG_version_output}")
else()
string(REGEX REPLACE ".*SWIG Version[^0-9.]*\([0-9.]+\).*" "\\1"
SWIG_version_output "${SWIG_version_output}")
set(SWIG_VERSION ${SWIG_version_output} CACHE STRING "Swig version" FORCE)
endif()
endif()
endif() endif()
endif()
if(SWIG_FIND_COMPONENTS) # Find SWIG library directory
execute_process(COMMAND ${SWIG_EXECUTABLE} -help find_path(SWIG_DIR swig.swg PATHS ${_SWIGLIB} NO_CMAKE_FIND_ROOT_PATH)
OUTPUT_VARIABLE SWIG_swighelp_output unset(_SWIGLIB)
ERROR_VARIABLE SWIG_swighelp_error
RESULT_VARIABLE SWIG_swighelp_result) if(SWIG_EXECUTABLE AND SWIG_DIR AND NOT SWIG_VERSION)
if(SWIG_swighelp_result) # Determine SWIG version
message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -help\" failed with output:\n${SWIG_swiglib_error}") execute_process(COMMAND ${SWIG_EXECUTABLE} -version
else() OUTPUT_VARIABLE _swig_output
string(REPLACE "\n" ";" SWIG_swighelp_output "${SWIG_swighelp_output}") ERROR_VARIABLE _swig_output
foreach(SWIG_line IN LISTS SWIG_swighelp_output) RESULT_VARIABLE _swig_result)
if(SWIG_line MATCHES "-([A-Za-z0-9_]+) +- *Generate.*wrappers") if(_swig_result)
set(SWIG_${CMAKE_MATCH_1}_FOUND TRUE) message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -version\" failed with output:\n${_swig_output}")
endif() else()
endforeach() string(REGEX REPLACE ".*SWIG Version[^0-9.]*\([0-9.]+\).*" "\\1"
endif() _swig_output "${_swig_output}")
set(SWIG_VERSION ${_swig_output} CACHE STRING "Swig version" FORCE)
endif() endif()
endif() endif()
if(SWIG_EXECUTABLE AND SWIG_FIND_COMPONENTS)
execute_process(COMMAND ${SWIG_EXECUTABLE} -help
OUTPUT_VARIABLE _swig_output
ERROR_VARIABLE _swig_error
RESULT_VARIABLE _swig_result)
if(_swig_result)
message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -help\" failed with output:\n${_swig_error}")
else()
string(REPLACE "\n" ";" _swig_output "${_swig_output}")
foreach(SWIG_line IN LISTS _swig_output)
if(SWIG_line MATCHES "-([A-Za-z0-9_]+) +- *Generate.*wrappers")
set(SWIG_${CMAKE_MATCH_1}_FOUND TRUE)
endif()
endforeach()
endif()
endif()
unset(_swig_output)
unset(_swig_error)
unset(_swig_result)
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
find_package_handle_standard_args( find_package_handle_standard_args(
SWIG HANDLE_COMPONENTS SWIG HANDLE_COMPONENTS
...@@ -144,4 +156,8 @@ find_package_handle_standard_args( ...@@ -144,4 +156,8 @@ find_package_handle_standard_args(
VERSION_VAR SWIG_VERSION VERSION_VAR SWIG_VERSION
HANDLE_VERSION_RANGE) HANDLE_VERSION_RANGE)
if(SWIG_FOUND)
set(SWIG_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UseSWIG.cmake")
endif()
mark_as_advanced(SWIG_DIR SWIG_VERSION SWIG_EXECUTABLE) mark_as_advanced(SWIG_DIR SWIG_VERSION SWIG_EXECUTABLE)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment