Add a new function SWIG_GET_WRAPPER_DEPENDENCIES to UseSWIG.cmake

This commit fixes BUG: 0004147 it directly uses swig executable
to compute a list of dependencies directly from the .i files
to make sure to rebuild the swig module any of its direct dep.
is touched
This commit is contained in:
Mathieu Malaterre 2011-03-28 18:14:23 +02:00
parent 0e66141bea
commit 1088b0278e
1 changed files with 59 additions and 0 deletions

View File

@ -4,6 +4,9 @@
# - Define swig module with given name and specified language
# SWIG_LINK_LIBRARIES(name [ libraries ])
# - Link libraries to swig module
# SWIG_GET_WRAPPER_DEPENDENCIES(swigFile genWrapper language DEST_VARIABLE)
# - Put dependencies of the wrapper genWrapper generated by swig from
# swigFile in DEST_VARIABLE
# All other macros are for internal use only.
# To get the actual name of the swig module,
# use: ${SWIG_MODULE_${name}_REAL_NAME}.
@ -38,6 +41,58 @@ SET(SWIG_EXTRA_LIBRARIES "")
SET(SWIG_PYTHON_EXTRA_FILE_EXTENSION "py")
#
# Get dependencies of the generated wrapper.
#
MACRO(SWIG_GET_WRAPPER_DEPENDENCIES swigFile genWrapper language DEST_VARIABLE)
GET_FILENAME_COMPONENT(swig_getdeps_basename ${swigFile} NAME_WE)
GET_FILENAME_COMPONENT(swig_getdeps_outdir ${genWrapper} PATH)
GET_SOURCE_FILE_PROPERTY(swig_getdeps_extra_flags "${swigFile}" SWIG_FLAGS)
IF("${swig_getdeps_extra_flags}" STREQUAL "NOTFOUND")
SET(swig_getdeps_extra_flags "")
ENDIF("${swig_getdeps_extra_flags}" STREQUAL "NOTFOUND")
IF(NOT swig_getdeps_outdir)
SET(swig_getdeps_outdir ${CMAKE_CURRENT_BINARY_DIR})
ENDIF(NOT swig_getdeps_outdir)
SET(swig_getdeps_depsfile
${swig_getdeps_outdir}/swig_${swig_getdeps_basename}_deps.txt)
GET_DIRECTORY_PROPERTY(swig_getdeps_include_directories INCLUDE_DIRECTORIES)
SET(swig_getdeps_include_dirs)
FOREACH(it ${swig_getdeps_include_directories})
SET(swig_getdeps_include_dirs ${swig_getdeps_include_dirs} "-I${it}")
ENDFOREACH(it)
EXECUTE_PROCESS(
COMMAND ${SWIG_EXECUTABLE}
-MM -MF ${swig_getdeps_depsfile} ${swig_getdeps_extra_flags}
${CMAKE_SWIG_FLAGS} -${language}
-o ${genWrapper} ${swig_getdeps_include_dirs} ${swigFile}
RESULT_VARIABLE swig_getdeps_result
ERROR_VARIABLE swig_getdeps_error
OUTPUT_STRIP_TRAILING_WHITESPACE)
IF(NOT ${swig_getdeps_error} EQUAL 0)
MESSAGE(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -MM -MF ${swig_getdeps_depsfile} ${swig_getdeps_extra_flags} ${CMAKE_SWIG_FLAGS} -${language} -o ${genWrapper} ${swig_getdeps_include_dirs} ${swigFile}\" failed with output:\n${swig_getdeps_error}")
SET(swig_getdeps_dependencies "")
ELSE(NOT ${swig_getdeps_error} EQUAL 0)
FILE(READ ${swig_getdeps_depsfile} ${DEST_VARIABLE})
# Remove the first line
STRING(REGEX REPLACE "^.+: +\\\\\n +" ""
${DEST_VARIABLE} "${${DEST_VARIABLE}}")
# Clean the end of each line
STRING(REGEX REPLACE " +(\\\\)?\n" "\n" ${DEST_VARIABLE}
"${${DEST_VARIABLE}}")
# Clean beginning of each line
STRING(REGEX REPLACE "\n +" "\n"
${DEST_VARIABLE} "${${DEST_VARIABLE}}")
# clean paths
STRING(REGEX REPLACE "\\\\\\\\" "/" ${DEST_VARIABLE}
"${${DEST_VARIABLE}}")
STRING(REGEX REPLACE "\n" ";"
${DEST_VARIABLE} "${${DEST_VARIABLE}}")
ENDIF(NOT ${swig_getdeps_error} EQUAL 0)
ENDMACRO(SWIG_GET_WRAPPER_DEPENDENCIES)
#
# For given swig module initialize variables associated with it
#
@ -166,6 +221,10 @@ MACRO(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
IF(SWIG_MODULE_${name}_EXTRA_FLAGS)
SET(swig_extra_flags ${swig_extra_flags} ${SWIG_MODULE_${name}_EXTRA_FLAGS})
ENDIF(SWIG_MODULE_${name}_EXTRA_FLAGS)
SWIG_GET_WRAPPER_DEPENDENCIES("${swig_source_file_fullname}"
"${swig_generated_file_fullname}" ${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}
swig_extra_dependencies)
LIST(APPEND SWIG_MODULE_${name}_EXTRA_DEPS ${swig_extra_dependencies})
ADD_CUSTOM_COMMAND(
OUTPUT "${swig_generated_file_fullname}" ${swig_extra_generated_files}
COMMAND "${SWIG_EXECUTABLE}"