瀏覽代碼

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
Mathieu Malaterre 14 年之前
父節點
當前提交
1088b0278e
共有 1 個文件被更改,包括 59 次插入0 次删除
  1. 59 0
      Modules/UseSWIG.cmake

+ 59 - 0
Modules/UseSWIG.cmake

@@ -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}"