From 34903fe1ba157683efb0062abcc73cd163d5ff89 Mon Sep 17 00:00:00 2001
From: "Marcus D. Hanwell" <marcus.hanwell@kitware.com>
Date: Sat, 9 Mar 2013 15:49:26 -0500
Subject: [PATCH] Move the Python wrapping to the end

This moves the Python wrapping to the end of the build process, using
the information exported by the module files.

Change-Id: I711382f79fc1fdb15cd80c87f55dd2f97a2c5cd8
---
 CMake/vtkModuleMacros.cmake                   |   5 +
 CMake/vtkPythonWrapping.cmake                 |  18 +-
 CMake/vtkWrapPython.cmake                     | 160 ++++++-
 CMake/vtkWrapping.cmake                       |  10 +-
 CMakeLists.txt                                |   7 +-
 Common/Core/CMakeLists.txt                    |  42 +-
 Common/DataModel/CMakeLists.txt               |   2 +
 Wrapping/Python/CMakeLists.txt                | 424 +++++++-----------
 Wrapping/Python/setup_install_paths.py        |   2 +-
 Wrapping/Python/vtkpython.cxx.in              |   2 -
 Wrapping/PythonCore/CMakeLists.txt            |  45 ++
 .../{Python => PythonCore}/PyVTKClass.cxx     |   0
 Wrapping/{Python => PythonCore}/PyVTKClass.h  |   0
 .../PyVTKMutableObject.cxx                    |   0
 .../PyVTKMutableObject.h                      |   0
 .../{Python => PythonCore}/PyVTKObject.cxx    |   0
 Wrapping/{Python => PythonCore}/PyVTKObject.h |   0
 .../PyVTKSpecialObject.cxx                    |   0
 .../PyVTKSpecialObject.h                      |   0
 .../{Python => PythonCore}/PyVTKTemplate.cxx  |   0
 .../{Python => PythonCore}/PyVTKTemplate.h    |   0
 .../{Python => PythonCore}/conversionlist.in  |   0
 Wrapping/{Python => PythonCore}/module.cmake  |   0
 .../{Python => PythonCore}/vtkPythonArgs.cxx  |   0
 .../{Python => PythonCore}/vtkPythonArgs.h    |   0
 .../vtkPythonCommand.cxx                      |   0
 .../{Python => PythonCore}/vtkPythonCommand.h |   0
 .../vtkPythonOverload.cxx                     |   0
 .../vtkPythonOverload.h                       |   0
 .../{Python => PythonCore}/vtkPythonUtil.cxx  |   0
 .../{Python => PythonCore}/vtkPythonUtil.h    |   0
 31 files changed, 440 insertions(+), 277 deletions(-)
 delete mode 100644 Wrapping/Python/vtkpython.cxx.in
 create mode 100644 Wrapping/PythonCore/CMakeLists.txt
 rename Wrapping/{Python => PythonCore}/PyVTKClass.cxx (100%)
 rename Wrapping/{Python => PythonCore}/PyVTKClass.h (100%)
 rename Wrapping/{Python => PythonCore}/PyVTKMutableObject.cxx (100%)
 rename Wrapping/{Python => PythonCore}/PyVTKMutableObject.h (100%)
 rename Wrapping/{Python => PythonCore}/PyVTKObject.cxx (100%)
 rename Wrapping/{Python => PythonCore}/PyVTKObject.h (100%)
 rename Wrapping/{Python => PythonCore}/PyVTKSpecialObject.cxx (100%)
 rename Wrapping/{Python => PythonCore}/PyVTKSpecialObject.h (100%)
 rename Wrapping/{Python => PythonCore}/PyVTKTemplate.cxx (100%)
 rename Wrapping/{Python => PythonCore}/PyVTKTemplate.h (100%)
 rename Wrapping/{Python => PythonCore}/conversionlist.in (100%)
 rename Wrapping/{Python => PythonCore}/module.cmake (100%)
 rename Wrapping/{Python => PythonCore}/vtkPythonArgs.cxx (100%)
 rename Wrapping/{Python => PythonCore}/vtkPythonArgs.h (100%)
 rename Wrapping/{Python => PythonCore}/vtkPythonCommand.cxx (100%)
 rename Wrapping/{Python => PythonCore}/vtkPythonCommand.h (100%)
 rename Wrapping/{Python => PythonCore}/vtkPythonOverload.cxx (100%)
 rename Wrapping/{Python => PythonCore}/vtkPythonOverload.h (100%)
 rename Wrapping/{Python => PythonCore}/vtkPythonUtil.cxx (100%)
 rename Wrapping/{Python => PythonCore}/vtkPythonUtil.h (100%)

diff --git a/CMake/vtkModuleMacros.cmake b/CMake/vtkModuleMacros.cmake
index ac1b08b8107..88c6c0541dd 100644
--- a/CMake/vtkModuleMacros.cmake
+++ b/CMake/vtkModuleMacros.cmake
@@ -201,6 +201,7 @@ function(vtk_module_export sources)
         get_source_file_property(_wrap_exclude ${src} WRAP_EXCLUDE)
         get_source_file_property(_abstract ${src} ABSTRACT)
         get_source_file_property(_wrap_special ${src} WRAP_SPECIAL)
+        get_source_file_property(_wrap_header ${src} WRAP_HEADER)
 
         if(_wrap_special OR NOT _wrap_exclude)
           list(APPEND vtk-module-CLASSES ${_cls})
@@ -219,6 +220,10 @@ function(vtk_module_export sources)
             set(vtk-module-WRAP_SPECIAL
               "${vtk-module-WRAP_SPECIAL}set(${vtk-module}_CLASS_${_cls}_WRAP_SPECIAL 1)\n")
           endif()
+          if(_wrap_header)
+            set(vtk-module-WRAP_SPECIAL
+              "${vtk-module-WRAP_SPECIAL}set(${vtk-module}_CLASS_${_cls}_WRAP_HEADER 1)\n")
+          endif()
         endif()
       endif()
     endif()
diff --git a/CMake/vtkPythonWrapping.cmake b/CMake/vtkPythonWrapping.cmake
index 99e03d7a468..a3eed82b15e 100644
--- a/CMake/vtkPythonWrapping.cmake
+++ b/CMake/vtkPythonWrapping.cmake
@@ -1,9 +1,9 @@
 find_package(PythonLibs REQUIRED)
 include(vtkWrapPython)
 
-function(vtk_add_python_wrapping module_name module_srcs module_hdrs)
+function(vtk_add_python_wrapping module_name)
   if(NOT VTK_WRAP_PYTHON_INIT_EXE)
-    if (TARGET vtkWrapPythonInit)
+    if(TARGET vtkWrapPythonInit)
       set (VTK_WRAP_PYTHON_INIT_EXE vtkWrapPythonInit)
     else()
       message(FATAL_ERROR "VTK must be built with Python wrapping turned on.")
@@ -30,21 +30,13 @@ function(vtk_add_python_wrapping module_name module_srcs module_hdrs)
   set(XY ${PYTHON_MAJOR_VERSION}${PYTHON_MINOR_VERSION})
 
   # Figure out the dependent PythonXYD libraries for the module
-  foreach(dep ${${vtk-module}_LINK_DEPENDS})
-    if(NOT "${vtk-module}" STREQUAL "${dep}" AND TARGET ${dep}PythonD)
+  foreach(dep ${${module_name}_DEPENDS})
+    if(NOT "${module_name}" STREQUAL "${dep}" AND TARGET ${dep}PythonD)
       list(APPEND extra_links ${dep}PythonD)
     endif()
   endforeach()
 
-  set(_wrap_files ${module_srcs})
-  foreach(hdr ${module_hdrs})
-    get_source_file_property(_wrap_header "${hdr}" WRAP_HEADER)
-    if(_wrap_header)
-      list(APPEND _wrap_files "${hdr}")
-    endif()
-  endforeach()
-
-  vtk_wrap_python3(${module_name}Python Python_SRCS "${_wrap_files}")
+  vtk_wrap_python(${module_name}Python Python_SRCS ${module_name})
   vtk_add_library(${module_name}PythonD ${Python_SRCS} ${extra_srcs})
   get_property(output_name TARGET ${module_name}PythonD PROPERTY OUTPUT_NAME)
   string(REPLACE "PythonD" "Python${XY}D" output_name "${output_name}")
diff --git a/CMake/vtkWrapPython.cmake b/CMake/vtkWrapPython.cmake
index b28464502e9..058ecff32dc 100644
--- a/CMake/vtkWrapPython.cmake
+++ b/CMake/vtkWrapPython.cmake
@@ -1,5 +1,5 @@
 #
-# a cmake implementation of the Wrap Python command
+# CMake implementation of the Wrap Python command.
 #
 macro(VTK_WRAP_PYTHON2 TARGET SOURCE_LIST_NAME)
   # convert to the WRAP3 signature
@@ -198,3 +198,161 @@ if(VTK_WRAP_PYTHON_FIND_LIBS)
   # Include any extra libraries for python.
   set(VTK_PYTHON_LIBRARIES ${VTK_PYTHON_LIBRARIES} ${PYTHON_EXTRA_LIBS})
 endif()
+
+# Determine the location of the supplied header in the include_dirs supplied.
+macro(vtk_find_header header include_dirs full_path)
+  unset(${full_path})
+  foreach(_dir ${include_dirs})
+    if(EXISTS "${_dir}/${header}")
+      set(${full_path} "${_dir}/${header}")
+      break()
+    endif()
+  endforeach()
+endmacro()
+
+# Macro that just takes the name of the module, figure the rest out from there.
+macro(vtk_wrap_python TARGET SRC_LIST_NAME module)
+  if(NOT VTK_WRAP_PYTHON_INIT_EXE)
+    if(TARGET vtkWrapPythonInit)
+      set(VTK_WRAP_PYTHON_INIT_EXE vtkWrapPythonInit)
+    else()
+      message(SEND_ERROR
+        "VTK_WRAP_PYTHON_INIT_EXE not specified when calling VTK_WRAP_PYTHON3")
+    endif()
+  endif()
+  if(NOT VTK_WRAP_PYTHON_EXE)
+    if(TARGET vtkWrapPython)
+      set(VTK_WRAP_PYTHON_EXE vtkWrapPython)
+    else()
+      message(SEND_ERROR
+        "VTK_WRAP_PYTHON_EXE not specified when calling vtk_wrap_python")
+    endif()
+  endif()
+
+  # The shell into which nmake.exe executes the custom command has some issues
+  # with mixing quoted and unquoted arguments :( Let's help.
+  if(CMAKE_GENERATOR MATCHES "NMake Makefiles")
+    set(verbatim "")
+    set(quote "\"")
+  else()
+    set(verbatim "VERBATIM")
+    set(quote "")
+  endif()
+
+  # Initialize the custom target counter.
+  if(VTK_WRAP_PYTHON_NEED_CUSTOM_TARGETS)
+    set(VTK_WRAP_PYTHON_CUSTOM_COUNT "")
+    set(VTK_WRAP_PYTHON_CUSTOM_NAME ${TARGET})
+    set(VTK_WRAP_PYTHON_CUSTOM_LIST)
+  endif()
+
+  # start writing the input file for the init file
+  set(VTK_WRAPPER_INIT_DATA "${TARGET}")
+
+  # all the include directories
+  if(${module}_INCLUDE_DIRS)
+    set(TMP_INCLUDE_DIRS ${${module}_INCLUDE_DIRS})
+  elseif(VTK_WRAP_INCLUDE_DIRS)
+    set(TMP_INCLUDE_DIRS ${VTK_WRAP_INCLUDE_DIRS})
+  else()
+    set(TMP_INCLUDE_DIRS ${VTK_INCLUDE_DIRS})
+  endif()
+
+  # collect the common wrapper-tool arguments
+  set(_common_args)
+  get_directory_property(_def_list DEFINITION COMPILE_DEFINITIONS)
+  foreach(TMP_DEF ${_def_list})
+    set(_common_args "${_common_args}-D${TMP_DEF}\n")
+  endforeach()
+  foreach(INCLUDE_DIR ${TMP_INCLUDE_DIRS})
+    set(_common_args "${_common_args}-I\"${INCLUDE_DIR}\"\n")
+  endforeach()
+  if(VTK_WRAP_HINTS)
+    set(_common_args "${_common_args}--hints \"${VTK_WRAP_HINTS}\"\n")
+  endif()
+  if(KIT_HIERARCHY_FILE)
+    set(_common_args "${_common_args}--types \"${KIT_HIERARCHY_FILE}\"\n")
+  endif()
+
+  # write wrapper-tool arguments to a file
+  string(STRIP "${_common_args}" CMAKE_CONFIGURABLE_FILE_CONTENT)
+  set(_args_file ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.args)
+  configure_file(${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in
+                 ${_args_file} @ONLY)
+
+  # Decide what to do for each class.
+  foreach(class ${${module}_CLASSES})
+    # Everything in this block is for classes that will be wrapped.
+    if(${module}_CLASSES_${class}_WRAP_SPECIAL OR
+       NOT ${module}_CLASSES_${class}_WRAP_EXCLUDE)
+
+      # Find the full path to the header file to be wrapped.
+      vtk_find_header(${class}.h "${${module}_INCLUDE_DIRS}" class_header_path)
+      if(NOT class_header_path)
+        message(FATAL_ERROR "Could not find header for ${class}.")
+      endif()
+
+      # add the info to the init file
+      set(VTK_WRAPPER_INIT_DATA
+        "${VTK_WRAPPER_INIT_DATA}\n${class}")
+
+      # new source file is namePython.cxx, add to resulting list
+      set(${SRC_LIST_NAME} ${${SRC_LIST_NAME}} ${class}Python.cxx)
+
+      # add custom command to output
+      add_custom_command(
+        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${class}Python.cxx
+        DEPENDS ${VTK_WRAP_PYTHON_EXE} ${VTK_WRAP_HINTS} ${class_header_path}
+          ${_args_file} ${KIT_HIERARCHY_FILE}
+        COMMAND ${VTK_WRAP_PYTHON_EXE}
+          ARGS
+          "${quote}@${_args_file}${quote}"
+          "-o" "${quote}${CMAKE_CURRENT_BINARY_DIR}/${class}Python.cxx${quote}"
+          "${quote}${class_header_path}${quote}"
+        COMMENT "Python Wrapping - generating ${class}Python.cxx"
+          ${verbatim}
+        )
+
+      # Add this output to a custom target if needed.
+      if(VTK_WRAP_PYTHON_NEED_CUSTOM_TARGETS)
+        set(VTK_WRAP_PYTHON_CUSTOM_LIST ${VTK_WRAP_PYTHON_CUSTOM_LIST}
+          ${CMAKE_CURRENT_BINARY_DIR}/${class}Python.cxx)
+        set(VTK_WRAP_PYTHON_CUSTOM_COUNT ${VTK_WRAP_PYTHON_CUSTOM_COUNT}x)
+        if(VTK_WRAP_PYTHON_CUSTOM_COUNT MATCHES "^${VTK_WRAP_PYTHON_CUSTOM_LIMIT}$")
+          set(VTK_WRAP_PYTHON_CUSTOM_NAME ${VTK_WRAP_PYTHON_CUSTOM_NAME}Hack)
+          add_custom_target(${VTK_WRAP_PYTHON_CUSTOM_NAME}
+            DEPENDS ${VTK_WRAP_PYTHON_CUSTOM_LIST})
+          set(KIT_PYTHON_DEPS ${VTK_WRAP_PYTHON_CUSTOM_NAME})
+          set(VTK_WRAP_PYTHON_CUSTOM_LIST)
+          set(VTK_WRAP_PYTHON_CUSTOM_COUNT)
+        endif()
+      endif()
+    else()
+      message("${class} will not be wrapped.")
+    endif()
+  endforeach()
+
+  # finish the data file for the init file
+  configure_file(
+    ${VTK_CMAKE_DIR}/vtkWrapperInit.data.in
+    ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}Init.data
+    COPY_ONLY
+    IMMEDIATE
+    )
+
+  add_custom_command(
+    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}Init.cxx
+    DEPENDS ${VTK_WRAP_PYTHON_INIT_EXE}
+      ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}Init.data
+    COMMAND ${VTK_WRAP_PYTHON_INIT_EXE}
+    ARGS
+      "${quote}${CMAKE_CURRENT_BINARY_DIR}/${TARGET}Init.data${quote}"
+      "${quote}${CMAKE_CURRENT_BINARY_DIR}/${TARGET}Init.cxx${quote}"
+    COMMENT "Python Wrapping - generating ${TARGET}Init.cxx"
+      ${verbatim}
+    )
+
+  # Create the Init File
+  set(${SRC_LIST_NAME} ${${SRC_LIST_NAME}} ${TARGET}Init.cxx)
+
+endmacro()
diff --git a/CMake/vtkWrapping.cmake b/CMake/vtkWrapping.cmake
index 7e015385170..4cf1224bc5e 100644
--- a/CMake/vtkWrapping.cmake
+++ b/CMake/vtkWrapping.cmake
@@ -4,7 +4,7 @@
 
 # First, ensure we include the correct CMake code so that we can wrap.
 if(VTK_WRAP_PYTHON)
-  include(vtkPythonWrapping)
+#  include(vtkPythonWrapping)
 endif()
 if(VTK_WRAP_TCL)
   include(vtkTclWrapping)
@@ -54,11 +54,9 @@ function(vtk_add_wrapping module_name module_srcs module_hdrs)
       endif()
 
       # Now to wrap the languages that are on.
-      if(VTK_WRAP_PYTHON)
-        if (${module_name}_WRAP_PYTHON)
-          set_property(GLOBAL APPEND PROPERTY VTK_PYTHON_WRAPPED ${module_name})
-          vtk_add_python_wrapping(${module_name} "${module_srcs}" "${module_hdrs}")
-        endif()
+      if(VTK_WRAP_PYTHON AND ${module_name}_WRAP_PYTHON)
+        # Note that the module should be Python wrapped.
+        set_property(GLOBAL APPEND PROPERTY VTK_PYTHON_WRAPPED ${module_name})
       endif()
       if(VTK_WRAP_TCL)
         set_property(GLOBAL APPEND PROPERTY VTK_TCL_WRAPPED ${module_name})
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d67f1edfa94..1fbdab09f51 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -354,9 +354,14 @@ find_program(VTK_GHOSTSCRIPT_EXECUTABLE gs gswin32c gsos2)
 mark_as_advanced(VTK_GHOSTSCRIPT_EXECUTABLE)
 
 #----------------------------------------------------------------------
-# Load the module DAG.
+# Load the module DAG, assess all modules etc.
 include(vtkModuleTop)
 
+# Now build the Python wrapping if necessary.
+if(VTK_WRAP_PYTHON)
+  add_subdirectory(Wrapping/Python)
+endif()
+
 if(BUILD_TESTING)
   add_subdirectory(Testing/Install)
 endif()
diff --git a/Common/Core/CMakeLists.txt b/Common/Core/CMakeLists.txt
index 3de9e96c879..410bdff7b5d 100644
--- a/Common/Core/CMakeLists.txt
+++ b/Common/Core/CMakeLists.txt
@@ -444,6 +444,46 @@ set_source_files_properties(
   vtkSparseArray.h
   vtkTypedArray.h
   vtkTypeTemplate.h
+
+  vtkABI.h
+  vtkArrayInterpolate.h
+  vtkArrayInterpolate.txx
+  vtkArrayIteratorIncludes.h
+  vtkArrayIteratorTemplate.h
+  vtkArrayIteratorTemplate.txx
+  vtkArrayIteratorTemplateImplicit.txx
+  vtkArrayPrint.h
+  vtkArrayPrint.txx
+  vtkAutoInit.h
+  vtkDataArrayTemplate.txx
+  vtkDataArrayTemplateImplicit.txx
+  vtkDenseArray.txx
+  vtkIOStreamFwd.h
+  vtkInformationInternals.h
+  vtkMathUtilities.h
+  vtkNew.h
+  vtkSetGet.h
+  vtkSmartPointer.h
+  vtkSparseArray.txx
+  vtkTemplateAliasMacro.h
+  vtkTypeTraits.h
+  vtkTypedArray.txx
+  vtkVariantCast.h
+  vtkVariantCreate.h
+  vtkVariantExtract.h
+  vtkVariantInlineOperators.h
+  vtkWeakPointer.h
+  vtkWin32Header.h
+  vtkWindows.h
+  vtkToolkits.h
+
+  # We need to get these wrapped, WRAP_SPECIAL? WRAP_HEADER does not seem to be used.
+  #vtkSystemIncludes.h
+  #vtkType.h
+  #vtkConfigure.h
+  #vtkMathConfigure.h
+  #vtkVersionMacros.h
+
   WRAP_EXCLUDE
   )
 
@@ -482,7 +522,7 @@ if(CMAKE_SYSTEM MATCHES "SunOS.*")
   set(KIT_LIBS ${KIT_LIBS} socket nsl)
 endif()
 
-vtk_module_library(vtkCommonCore ${Module_SRCS})
+vtk_module_library(vtkCommonCore ${Module_SRCS} ${${vtk-module}_HDRS})
 
 target_link_libraries(vtkCommonCore ${CMAKE_THREAD_LIBS_INIT})
 set_target_properties(vtkCommonCore PROPERTIES LINK_INTERFACE_LIBRARIES "")
diff --git a/Common/DataModel/CMakeLists.txt b/Common/DataModel/CMakeLists.txt
index f9424281ff8..7e760182016 100644
--- a/Common/DataModel/CMakeLists.txt
+++ b/Common/DataModel/CMakeLists.txt
@@ -177,6 +177,7 @@ set(Module_SRCS
   vtkBond.cxx
   vtkMolecule.cxx
   vtkAbstractElectronicData.cxx
+  vtkCellType.h
 
   # Header only classes
   vtkDataArrayDispatcher.h
@@ -244,6 +245,7 @@ set_source_files_properties(
   vtkAtom
   vtkBond
   vtkBoundingBox
+  vtkCellType
   vtkDataArrayDispatcher
   vtkDispatcher_Private
   vtkDispatcher
diff --git a/Wrapping/Python/CMakeLists.txt b/Wrapping/Python/CMakeLists.txt
index a9c2bd8e7ca..7be86ca5198 100644
--- a/Wrapping/Python/CMakeLists.txt
+++ b/Wrapping/Python/CMakeLists.txt
@@ -1,70 +1,32 @@
-include(GenerateExportHeader)
+# This is where we actually wrap the modules that have requested it.
 include(vtkPythonWrapping)
 
-set(Module_SRCS
-  vtkPythonArgs.cxx
-  vtkPythonCommand.cxx
-  vtkPythonOverload.cxx
-  vtkPythonUtil.cxx
-  PyVTKClass.cxx
-  PyVTKMutableObject.cxx
-  PyVTKObject.cxx
-  PyVTKSpecialObject.cxx
-  PyVTKTemplate.cxx
-  )
-
-set(Module_HDRS
-  ${CMAKE_CURRENT_BINARY_DIR}/${vtk-module}Module.h
-  )
-
-list(APPEND Module_SRCS ${Module_HDRS})
-
-set_source_files_properties(
-  ${Module_HDRS}
-  HEADER_FILE_ONLY
-  )
-
-include_directories(
-  ${VTK_SOURCE_DIR}/Utilities
-  )
-
-# SIP directory will be searched before other python dirs
-SET(PYTHON_WRAPPING_INCLUDE_DIRS)
-if(VTK_WRAP_PYTHON_SIP)
-  list(APPEND PYTHON_WRAPPING_INCLUDE_DIRS "${SIP_INCLUDE_DIR}")
-endif()
-set(${vtk-module}_SYSTEM_INCLUDE_DIRS ${PYTHON_WRAPPING_INCLUDE_DIRS})
-
-set(${vtk-module}_NO_HeaderTest 1)
-set(${vtk-module}_INCLUDE_DIRS)
-
-set(XY ${PYTHON_MAJOR_VERSION}${PYTHON_MINOR_VERSION})
-vtk_module_library(${vtk-module} ${Module_SRCS})
-get_property(output_name TARGET ${vtk-module} PROPERTY OUTPUT_NAME)
-string(REPLACE "Python" "Python${XY}" output_name "${output_name}")
-set_property(TARGET ${vtk-module} PROPERTY OUTPUT_NAME ${output_name})
+get_property(VTK_PYTHON_MODULES GLOBAL PROPERTY VTK_PYTHON_WRAPPED)
 
+# Get the include directories for the module and all its dependencies.
+macro(vtk_include_recurse module)
+  _vtk_module_config_recurse("py" ${module})
+  include_directories(${py_INCLUDE_DIRS})
+endmacro()
+
+# Loop through all modules that should be wrapped, and wrap them.
+foreach(module ${VTK_PYTHON_MODULES})
+  vtk_module_load(${module})
+  vtk_module_classes_load(${module})
+  vtk_include_recurse(${module})
+  vtk_add_python_wrapping(${module})
+endforeach()
+
+# Now to build the vtkPython executable, configure the .py files etc.
 get_property(VTK_PYTHON_MODULES GLOBAL PROPERTY VTK_PYTHON_WRAPPED)
 
-# If we are using instantiators then configure them all into a header.
-unset(vtk_instantiators)
-unset(vtk_link_modules)
-if(VTK_MAKE_INSTANTIATORS)
-  foreach(module ${VTK_PYTHON_MODULES})
-    set(vtk_instantiators
-      "${vtk_instantiators}#include \"${module}Instantiator.h\"\n")
-    list(APPEND vtk_link_modules ${module})
-    include_directories("${${module}_BINARY_DIR}")
-  endforeach()
-endif()
-# Make a nice empty file if not using instantiators.
-file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/vtkInstantiators.h.in"
-  "@vtk_instantiators@\n")
-configure_file("${CMAKE_CURRENT_BINARY_DIR}/vtkInstantiators.h.in"
-  "${CMAKE_CURRENT_BINARY_DIR}/vtkInstantiators.h" @ONLY)
-
-#-----------------------
-# for the vtkpython executable
+vtk_module_load(vtkWrappingPython)
+vtk_module_load(vtkPython)
+include_directories(${CMAKE_CURRENT_BINARY_DIR}
+  ${VTK_SOURCE_DIR}/Utilities
+  ${vtkPython_INCLUDE_DIRS}
+  ${vtkWrappingPython_INCLUDE_DIRS})
+# Needed for the vtkpython executable.
 if(VTK_USE_CARBON)
   find_program(VTK_APPLE_RESOURCE Rez "${OSX_DEVELOPER_ROOT}/usr/bin")
 endif()
@@ -72,26 +34,25 @@ endif()
 if(UNIX)
   find_library(PYTHON_UTIL_LIBRARY
     NAMES util
-    DOC "Utility library needed for vtkpython"
-    )
+    DOC "Utility library needed for vtkpython")
   mark_as_advanced(PYTHON_UTIL_LIBRARY)
 endif()
 
-# generate the header which initializes Python modules when BUILD_SHARED_LIBS is
-# OFF. py_module_dependencies will be set to the libraries we should link
+# Generate the header which initializes Python modules when BUILD_SHARED_LIBS is
+# OFF. The py_module_dependencies will be set to the libraries we should link
 # against when we use the vtkpythonmodules.h file.
 vtk_write_python_modules_header_for_wrapped_modules(
   "${CMAKE_CURRENT_BINARY_DIR}/vtkpythonmodules.h"
   py_module_dependencies)
 
-# create the VTK/Python  executable
-configure_file(${VTK_SOURCE_DIR}/Wrapping/Python/vtkPythonAppInitConfigure.h.in
-               ${VTK_BINARY_DIR}/Wrapping/Python/vtkPythonAppInitConfigure.h)
+# Create the VTK/Python  executable
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/vtkPythonAppInitConfigure.h.in
+  ${CMAKE_CURRENT_BINARY_DIR}/vtkPythonAppInitConfigure.h)
 
 add_executable(vtkpython vtkPythonAppInit.cxx vtkpython.rc)
 
-set(VTKPYTHON_LINK_FLAGS)
-set(VTKPYTHON_LINK_LIBS  ${vtk_link_modules})
+unset(VTKPYTHON_LINK_FLAGS)
+unset(VTKPYTHON_LINK_LIBS)
 
 if(CMAKE_SYSTEM_NAME MATCHES "AIX")
   get_filename_component(CMAKE_PYTHON_LIB_PREFIX "${PYTHON_LIBRARY}" PATH)
@@ -120,9 +81,7 @@ if(APPLE)
 endif()
 
 # Link against all the kit wrappers.
-list(APPEND VTKPYTHON_LINK_LIBS
-  ${vtk-module}
-  )
+list(APPEND VTKPYTHON_LINK_LIBS vtkWrappingPython)
 
 set(vtkpython_pyc_depends
   vtkCommonPython
@@ -133,74 +92,59 @@ set(vtkpython_pyc_depends
   )
 
 if(PYTHON_UTIL_LIBRARY)
-  set(VTKPYTHON_LINK_LIBS ${VTKPYTHON_LINK_LIBS} ${PYTHON_UTIL_LIBRARY})
+  list(APPEND VTKPYTHON_LINK_LIBS ${PYTHON_UTIL_LIBRARY})
 endif()
 
 set(VTKPYTHON_LINK_LIBS ${VTKPYTHON_LINK_LIBS} ${py_module_dependencies})
 
 # Link to rt to prevent undefined symbol 'fdatasync'
-IF(CMAKE_SYSTEM MATCHES "SunOS.*" AND NOT CMAKE_COMPILER_IS_GNUCXX)
-  FIND_LIBRARY(VTK_SUNCC_RT_LIBRARY rt)
-  IF(VTK_SUNCC_RT_LIBRARY)
-    SET(VTKPYTHON_LINK_LIBS ${VTKPYTHON_LINK_LIBS} ${VTK_SUNCC_RT_LIBRARY})
-  ENDIF(VTK_SUNCC_RT_LIBRARY)
-ENDIF(CMAKE_SYSTEM MATCHES "SunOS.*" AND NOT CMAKE_COMPILER_IS_GNUCXX)
-
-IF(VTK_WRAP_TCL)
-  TARGET_LINK_LIBRARIES(vtkpython ${VTK_TK_LIBRARIES})
-ENDIF(VTK_WRAP_TCL)
-
-IF(HAVE_PTHREAD_H AND CMAKE_USE_PTHREADS)
-  TARGET_LINK_LIBRARIES(vtkpython ${CMAKE_THREAD_LIBS_INIT})
-ENDIF()
+if(CMAKE_SYSTEM MATCHES "SunOS.*" AND NOT CMAKE_COMPILER_IS_GNUCXX)
+  find_library(VTK_SUNCC_RT_LIBRARY rt)
+  if(VTK_SUNCC_RT_LIBRARY)
+    set(VTKPYTHON_LINK_LIBS ${VTKPYTHON_LINK_LIBS} ${VTK_SUNCC_RT_LIBRARY})
+  endif()
+endif()
 
-IF(VTK_USE_FFMPEG_ENCODER)
-  LIST(APPEND VTKPYTHON_LINK_LIBS ${FFMPEG_BASIC_LIBRARIES})
-ENDIF(VTK_USE_FFMPEG_ENCODER)
+# If we are wrapping Tcl then the Tk libraries are available and should be used
+# in the Python wrapping too.
+if(VTK_WRAP_TCL)
+  list(APPEND VTKPYTHON_LINK_LIBS ${VTK_TK_LIBRARIES})
+endif()
 
-TARGET_LINK_LIBRARIES(vtkpython ${VTKPYTHON_LINK_LIBS})
+if(HAVE_PTHREAD_H AND CMAKE_USE_PTHREADS)
+  list(APPEND VTKPYTHON_LINK_LIBS ${CMAKE_THREAD_LIBS_INIT})
+endif()
 
-IF(VTK_USE_MATLAB_MEX)
-  INCLUDE(${MATLAB_MEX_USE_FILE})
-  SET_TARGET_PROPERTIES(vtkpython PROPERTIES
-                        LINK_FLAGS "${MEX_RPATH} ${VTKPYTHON_LINK_FLAGS}")
-ELSE(VTK_USE_MATLAB_MEX)
-  SET_TARGET_PROPERTIES(vtkpython PROPERTIES LINK_FLAGS "${VTKPYTHON_LINK_FLAGS}")
-ENDIF(VTK_USE_MATLAB_MEX)
+# FIXME: Is this needed here?
+if(VTK_USE_FFMPEG_ENCODER)
+  list(APPEND VTKPYTHON_LINK_LIBS ${FFMPEG_BASIC_LIBRARIES})
+endif()
 
+target_link_libraries(vtkpython ${VTKPYTHON_LINK_LIBS})
 
-SET(PVTKPYTHON_EXECUTABLE)
+unset(PVTKPYTHON_EXECUTABLE)
 # Create the pvtkpython Python wrapper executable with MPI support.
-IF (VTK_USE_PARALLEL AND VTK_USE_MPI)
-  FIND_PACKAGE(MPI REQUIRED)
-  INCLUDE_DIRECTORIES("${MPI_C_INCLUDE_PATH}")
-  set (MPI_LIBRARIES ${MPI_C_LIBRARIES})
-  if (MPI_CXX_LIBRARIES)
-    SET(MPI_LIBRARIES ${MPI_LIBRARIES} ${MPI_CXX_LIBRARIES})
+if(TARGET vtkParallelMPI)
+  find_package(MPI REQUIRED)
+  include_directories(${MPI_C_INCLUDE_PATH})
+  set(MPI_LIBRARIES ${MPI_C_LIBRARIES})
+  if(MPI_CXX_LIBRARIES)
+    set(MPI_LIBRARIES ${MPI_LIBRARIES} ${MPI_CXX_LIBRARIES})
   endif()
-  IF (VTK_USE_PARALLEL_BGL)
-    SET(MPI_LIBRARIES ${MPI_LIBRARIES} "${Boost_LIBRARIES}")
-  ENDIF (VTK_USE_PARALLEL_BGL)
 
   # Needed for mpich 2
-  ADD_DEFINITIONS("-DMPICH_IGNORE_CXX_SEEK")
-
-  SET(PVTKPYTHON_EXECUTABLE pvtkpython)
-  VTK_ADD_EXECUTABLE(pvtkpython vtkParaPythonAppInit.cxx)
-  TARGET_LINK_LIBRARIES(pvtkpython ${VTKPYTHON_LINK_LIBS} ${MPI_LIBRARIES})
-  IF(VTK_USE_MATLAB_MEX)
-    INCLUDE(${MATLAB_MEX_USE_FILE})
-    SET_TARGET_PROPERTIES(pvtkpython PROPERTIES
-                         LINK_FLAGS "${MEX_RPATH} ${VTKPYTHON_LINK_FLAGS}")
-  ELSE(VTK_USE_MATLAB_MEX)
-    SET_TARGET_PROPERTIES(pvtkpython PROPERTIES LINK_FLAGS "${VTKPYTHON_LINK_FLAGS}")
-  ENDIF(VTK_USE_MATLAB_MEX)
-
-  IF(VTK_USE_CARBON AND VTK_APPLE_RESOURCE)
-      ADD_CUSTOM_COMMAND( TARGET pvtkpython POST_BUILD
-                          COMMAND ${VTK_APPLE_RESOURCE} Carbon.r -o ${VTK_EXECUTABLE_DIR}/pvtkpython )
-  ENDIF(VTK_USE_CARBON AND VTK_APPLE_RESOURCE)
-ENDIF (VTK_USE_PARALLEL AND VTK_USE_MPI)
+  add_definitions("-DMPICH_IGNORE_CXX_SEEK")
+
+  set(PVTKPYTHON_EXECUTABLE pvtkpython)
+  add_executable(pvtkpython vtkParaPythonAppInit.cxx)
+  target_link_libraries(pvtkpython ${VTKPYTHON_LINK_LIBS} vtkParallelMPI
+    ${MPI_LIBRARIES})
+
+  if(VTK_USE_CARBON AND VTK_APPLE_RESOURCE)
+    add_custom_command(TARGET pvtkpython POST_BUILD
+      COMMAND ${VTK_APPLE_RESOURCE} Carbon.r -o ${VTK_EXECUTABLE_DIR}/pvtkpython)
+  endif()
+endif()
 
 # Handle out-of-source builds correctly.
 #
@@ -210,31 +154,29 @@ ENDIF (VTK_USE_PARALLEL AND VTK_USE_MPI)
 #
 # *** Step 1 has to be done carefully to avoid missing out files ***
 
-IF(PYTHON_EXECUTABLE)
-# Make the necessary directories.
-    FILE(MAKE_DIRECTORY  ${VTK_BINARY_DIR}/Wrapping/Python/vtk/gtk
-                         ${VTK_BINARY_DIR}/Wrapping/Python/vtk/qt
-                         ${VTK_BINARY_DIR}/Wrapping/Python/vtk/qt4
-                         ${VTK_BINARY_DIR}/Wrapping/Python/vtk/tk
-                         ${VTK_BINARY_DIR}/Wrapping/Python/vtk/util
-                         ${VTK_BINARY_DIR}/Wrapping/Python/vtk/wx
-                         ${VTK_BINARY_DIR}/Wrapping/Python/vtk/test )
+if(PYTHON_EXECUTABLE)
+  # Make the necessary directories.
+  file(MAKE_DIRECTORY
+    ${CMAKE_CURRENT_BINARY_DIR}/vtk/gtk
+    ${CMAKE_CURRENT_BINARY_DIR}/vtk/qt4
+    ${CMAKE_CURRENT_BINARY_DIR}/vtk/tk
+    ${CMAKE_CURRENT_BINARY_DIR}/vtk/util
+    ${CMAKE_CURRENT_BINARY_DIR}/vtk/wx
+    ${CMAKE_CURRENT_BINARY_DIR}/vtk/test)
 
 # Now create a list of Python files.
 
 # Wrapping/Python/vtk/*.py
-  SET(VTK_PYTHON_FILES
-    )
-  SET(VTK_PYTHON_IMPORT_ALL "")
-  FOREACH(module ${VTK_PYTHON_MODULES})
-    SET(VTK_PYTHON_IMPORT_ALL "${VTK_PYTHON_IMPORT_ALL}from ${module} import *\n")
-    CONFIGURE_FILE(vtk/module.py.in vtk/${module}.py @ONLY IMMEDIATE)
-  ENDFOREACH()
-  CONFIGURE_FILE(vtk/__init__.py.in vtk/__init__.py @ONLY IMMEDIATE)
+  unset(VTK_PYTHON_FILES)
+  unset(VTK_PYTHON_IMPORT_ALL)
+  foreach(module ${VTK_PYTHON_MODULES})
+    set(VTK_PYTHON_IMPORT_ALL "${VTK_PYTHON_IMPORT_ALL}from ${module} import *\n")
+    configure_file(vtk/module.py.in vtk/${module}.py @ONLY IMMEDIATE)
+  endforeach()
+  configure_file(vtk/__init__.py.in vtk/__init__.py @ONLY IMMEDIATE)
 
 # vtk.util package
-  SET(VTK_PYTHON_FILES
-    ${VTK_PYTHON_FILES}
+  list(APPEND VTK_PYTHON_FILES
     vtk/util/__init__
     vtk/util/vtkMethodParser
     vtk/util/misc
@@ -247,16 +189,14 @@ IF(PYTHON_EXECUTABLE)
     )
 
 # vtk.test package
-  SET(VTK_PYTHON_FILES
-    ${VTK_PYTHON_FILES}
+  list(APPEND VTK_PYTHON_FILES
     vtk/test/BlackBox
     vtk/test/Testing
     vtk/test/__init__
     )
 
 # Tk related files
-  SET(VTK_PYTHON_FILES
-    ${VTK_PYTHON_FILES}
+  list(APPEND VTK_PYTHON_FILES
     vtk/tk/__init__
     vtk/tk/vtkLoadPythonTkWidgets
     vtk/tk/vtkTkImageViewerWidget
@@ -265,32 +205,21 @@ IF(PYTHON_EXECUTABLE)
     vtk/tk/vtkTkPhotoImage
     )
 
-# PyQt v3 related files
-  SET(VTK_PYTHON_FILES
-    ${VTK_PYTHON_FILES}
-    vtk/qt/QVTKRenderWidget
-    vtk/qt/__init__
-    vtk/qt/QVTKRenderWindowInteractor
-    )
-
 # PyQt v4 related files
-  SET(VTK_PYTHON_FILES
-    ${VTK_PYTHON_FILES}
+  list(APPEND VTK_PYTHON_FILES
     vtk/qt4/__init__
     vtk/qt4/QVTKRenderWindowInteractor
     )
 
 # wxPython related files
-  SET(VTK_PYTHON_FILES
-    ${VTK_PYTHON_FILES}
+  list(APPEND VTK_PYTHON_FILES
     vtk/wx/__init__
     vtk/wx/wxVTKRenderWindow
     vtk/wx/wxVTKRenderWindowInteractor
     )
 
 # pyGTK related files
-  SET(VTK_PYTHON_FILES
-    ${VTK_PYTHON_FILES}
+  list(APPEND VTK_PYTHON_FILES
     vtk/gtk/GtkVTKRenderWindow
     vtk/gtk/__init__
     vtk/gtk/GtkVTKRenderWindowInteractor
@@ -301,153 +230,144 @@ IF(PYTHON_EXECUTABLE)
 # Done listing of files.
 
 # Now copy these files if necessary.
-  SET(VTK_PYTHON_SOURCE_FILES)
-  SET(VTK_PYTHON_OUTPUT_FILES)
-  FOREACH(file ${VTK_PYTHON_FILES})
-    SET(src "${VTK_BINARY_DIR}/Wrapping/Python/${file}.py")
-    SET(VTK_PYTHON_SOURCE_FILES ${VTK_PYTHON_SOURCE_FILES} ${src})
-  ENDFOREACH(file)
-
-  IF (NOT "${VTK_BINARY_DIR}" MATCHES "^${VTK_SOURCE_DIR}$")
-    FOREACH(file ${VTK_PYTHON_FILES})
-      SET(src "${VTK_SOURCE_DIR}/Wrapping/Python/${file}.py")
-      SET(tgt "${VTK_BINARY_DIR}/Wrapping/Python/${file}.py")
-      ADD_CUSTOM_COMMAND(DEPENDS ${src}
-                         COMMAND ${CMAKE_COMMAND} -E copy ${src} ${tgt}
-                         OUTPUT ${tgt}
-                         COMMENT "source copy")
-    ENDFOREACH(file)
-  ENDIF (NOT "${VTK_BINARY_DIR}" MATCHES "^${VTK_SOURCE_DIR}$")
+  unset(VTK_PYTHON_SOURCE_FILES)
+  unset(VTK_PYTHON_OUTPUT_FILES)
+  foreach(file ${VTK_PYTHON_FILES})
+    set(src "${CMAKE_CURRENT_BINARY_DIR}/${file}.py")
+    set(VTK_PYTHON_SOURCE_FILES ${VTK_PYTHON_SOURCE_FILES} ${src})
+  endforeach()
+
+  if(NOT "${VTK_BINARY_DIR}" MATCHES "^${VTK_SOURCE_DIR}$")
+    foreach(file ${VTK_PYTHON_FILES})
+      set(src "${CMAKE_CURRENT_SOURCE_DIR}/${file}.py")
+      set(tgt "${CMAKE_CURRENT_BINARY_DIR}/${file}.py")
+      add_custom_command(DEPENDS ${src}
+        COMMAND ${CMAKE_COMMAND} -E copy ${src} ${tgt}
+        OUTPUT ${tgt}
+        COMMENT "source copy")
+    endforeach()
+  endif()
 
   # Byte compile the Python files.
-  CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/compile_all_vtk.py.in
-                 ${CMAKE_CURRENT_BINARY_DIR}/compile_all_vtk.py
-                 @ONLY IMMEDIATE)
-  ADD_CUSTOM_COMMAND(
+  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/compile_all_vtk.py.in
+    ${CMAKE_CURRENT_BINARY_DIR}/compile_all_vtk.py
+    @ONLY IMMEDIATE)
+  add_custom_command(
     COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/compile_all_vtk.py
     DEPENDS ${VTK_PYTHON_SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/compile_all_vtk.py
-    OUTPUT "${VTK_BINARY_DIR}/Wrapping/Python/vtk_compile_complete"
+    OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/vtk_compile_complete"
     )
 
   # Create a target on which custom commands can depend.  When this
   # is up-to-date, it is safe to run VTK python code.  Therefore
   # this should also depend on the vtkpython executable.
-  ADD_CUSTOM_TARGET(vtkpython_pyc ALL echo "..."
-    DEPENDS "${VTK_BINARY_DIR}/Wrapping/Python/vtk_compile_complete")
-  ADD_DEPENDENCIES(vtkpython_pyc
-      vtkpython
-      ${vtkpython_pyc_depends})
+  add_custom_target(vtkpython_pyc ALL echo "..."
+    DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/vtk_compile_complete")
+  add_dependencies(vtkpython_pyc
+    vtkpython
+    ${vtkpython_pyc_depends})
 
   # If no runtime is to be installed then do not install python modules.
-  IF(VTK_INSTALL_NO_RUNTIME)
-    SET(VTK_INSTALL_NO_PYTHON 1)
-  ENDIF(VTK_INSTALL_NO_RUNTIME)
+  if(VTK_INSTALL_NO_RUNTIME)
+    set(VTK_INSTALL_NO_PYTHON 1)
+  endif()
 
   # If set (generally by projects that include VTK), we install the
   # vtk{*}Python libraries using CMake rather than setup.py. Which implies that
   # they will be put will all other libraries. This is done in
   # KitCommonPythonWrapBlock.cmake
-  IF (VTK_INSTALL_PYTHON_USING_CMAKE)
-    SET(VTK_INSTALL_NO_PYTHON 1)
-  ENDIF (VTK_INSTALL_PYTHON_USING_CMAKE)
-
-  IF(VTK_INSTALL_PYTHON_USING_CMAKE)
+  if(VTK_INSTALL_PYTHON_USING_CMAKE)
+    set(VTK_INSTALL_NO_PYTHON 1)
     # Install python module directory (*.py and *.pyd)
-    #INSTALL(DIRECTORY "${VTK_BINARY_DIR}/Wrapping/Python/vtk"
-    #  DESTINATION "${VTK_INSTALL_BIN_DIR_CM24}/Python" COMPONENT RuntimeLibraries
-    #  USE_SOURCE_PERMISSIONS)
-  ENDIF(VTK_INSTALL_PYTHON_USING_CMAKE)
+    install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/vtk"
+      DESTINATION "${VTK_INSTALL_RUNTIME_DIR}/Python" COMPONENT RuntimeLibraries
+      USE_SOURCE_PERMISSIONS)
+  endif()
 
   # Add a rule to use python distutils to install the python wrappers.
-  IF(NOT VTK_INSTALL_NO_PYTHON)
-    SET(DOLLAR "$")
+  if(NOT VTK_INSTALL_NO_PYTHON)
+    set(DOLLAR "$")
 
     # Create default python setup arguments if they are not set.
-    IF(NOT DEFINED VTK_PYTHON_SETUP_ARGS)
-      SET(VTK_PYTHON_SETUP_ARGS "--prefix=\"${DOLLAR}{CMAKE_INSTALL_PREFIX}\""
+    if(NOT DEFINED VTK_PYTHON_SETUP_ARGS)
+      set(VTK_PYTHON_SETUP_ARGS "--prefix=\"${DOLLAR}{CMAKE_INSTALL_PREFIX}\""
         CACHE STRING "Arguments passed to \"python setup.py install ...\" during installation.")
-      MARK_AS_ADVANCED(VTK_PYTHON_SETUP_ARGS)
-    ENDIF(NOT DEFINED VTK_PYTHON_SETUP_ARGS)
+      mark_as_advanced(VTK_PYTHON_SETUP_ARGS)
+    endif()
 
     # Change dollar sign to DOLLARSIGN
-    STRING(REGEX REPLACE "\\${DOLLAR}" "DOLLARSIGN"
+    string(REGEX REPLACE "\\${DOLLAR}" "DOLLARSIGN"
       PYTHON_SETUP_ARGS "${VTK_PYTHON_SETUP_ARGS}")
 
     # Get the install path for python modules
     execute_process(COMMAND "${PYTHON_EXECUTABLE}"
         "setup_install_paths.py" "purelib" ${PYTHON_SETUP_ARGS}
-      WORKING_DIRECTORY "${VTK_SOURCE_DIR}/Wrapping/Python"
+      WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
       OUTPUT_VARIABLE PYTHON_MODULE_INSTALL_DIR)
 
     # Get the install path for binary python modules
     execute_process(COMMAND "${PYTHON_EXECUTABLE}"
         "setup_install_paths.py" "platlib" ${PYTHON_SETUP_ARGS}
-      WORKING_DIRECTORY "${VTK_SOURCE_DIR}/Wrapping/Python"
+      WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
       OUTPUT_VARIABLE PYTHON_MODULE_PLATFORM_INSTALL_DIR)
 
     # Change DOLLARSIGN to dollar sign
-    STRING(REGEX REPLACE "DOLLARSIGN" "${DOLLAR}"
+    string(REGEX REPLACE "DOLLARSIGN" "${DOLLAR}"
       PYTHON_MODULE_INSTALL_DIR "${PYTHON_MODULE_INSTALL_DIR}")
-    STRING(REGEX REPLACE "DOLLARSIGN" "${DOLLAR}"
+    string(REGEX REPLACE "DOLLARSIGN" "${DOLLAR}"
       PYTHON_MODULE_PLATFORM_INSTALL_DIR
       "${PYTHON_MODULE_PLATFORM_INSTALL_DIR}")
 
     # Replace backslashes with forward slashes
-    IF (WIN32)
-      STRING(REGEX REPLACE "\\\\" "/" PYTHON_MODULE_INSTALL_DIR
+    if(WIN32)
+      string(REGEX REPLACE "\\\\" "/" PYTHON_MODULE_INSTALL_DIR
         "${PYTHON_MODULE_INSTALL_DIR}")
-      STRING(REGEX REPLACE "\\\\" "/" PYTHON_MODULE_PLATFORM_INSTALL_DIR
+      string(REGEX REPLACE "\\\\" "/" PYTHON_MODULE_PLATFORM_INSTALL_DIR
         "${PYTHON_MODULE_PLATFORM_INSTALL_DIR}")
-    ENDIF (WIN32)
+    endif()
 
-    SET(VTK_PYTHON_MODULE_INSTALL_DIR "${PYTHON_MODULE_INSTALL_DIR}"
+    set(VTK_PYTHON_MODULE_INSTALL_DIR "${PYTHON_MODULE_INSTALL_DIR}"
       CACHE INTERNAL "Install directory for Python .py and .pyc files")
 
-    SET(VTK_PYTHON_MODULE_PLATFORM_INSTALL_DIR
+    set(VTK_PYTHON_MODULE_PLATFORM_INSTALL_DIR
       "${PYTHON_MODULE_PLATFORM_INSTALL_DIR}"
       CACHE INTERNAL "Install directory for Python binary modules")
 
     # If there are multiple configurations then add a BUILD_TYPE=...
     # argument to the python setup.py call.  The build type to use is set
     # in the CMake variable BUILD_TYPE while running the install script.
-    IF(CMAKE_CONFIGURATION_TYPES)
-      SET(VTK_PYTHON_SETUP_BUILD_TYPE "BUILD_TYPE=${DOLLAR}{BUILD_TYPE}")
-    ELSE(CMAKE_CONFIGURATION_TYPES)
-      SET(VTK_PYTHON_SETUP_BUILD_TYPE)
-    ENDIF(CMAKE_CONFIGURATION_TYPES)
+    if(CMAKE_CONFIGURATION_TYPES)
+      set(VTK_PYTHON_SETUP_BUILD_TYPE "BUILD_TYPE=${DOLLAR}{BUILD_TYPE}")
+    else()
+      set(VTK_PYTHON_SETUP_BUILD_TYPE)
+    endif()
 
     # Configure the post-install script to run python on setup.py.
-    CONFIGURE_FILE(${VTK_SOURCE_DIR}/Wrapping/Python/PythonInstall.cmake.in
-                   ${VTK_BINARY_DIR}/Wrapping/Python/PythonInstall.cmake
-                   @ONLY IMMEDIATE)
+    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/PythonInstall.cmake.in
+      ${CMAKE_CURRENT_BINARY_DIR}/PythonInstall.cmake
+      @ONLY IMMEDIATE)
 
-    install(SCRIPT ${VTK_BINARY_DIR}/Wrapping/Python/PythonInstall.cmake
-            COMPONENT RuntimeLibraries
-            )
-  ENDIF(NOT VTK_INSTALL_NO_PYTHON)
-ENDIF(PYTHON_EXECUTABLE)
+    install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/PythonInstall.cmake
+      COMPONENT RuntimeLibraries)
+  endif()
+endif()
 
 # Create the setup.py file.
-IF(CMAKE_CONFIGURATION_TYPES)
+if(CMAKE_CONFIGURATION_TYPES)
   # The build has multiple configuration types.  If CMAKE_BUILD_TYPE
   # is set use it as the default BUILD_TYPE for setup.py to install.
-  SET(VTK_PYTHON_HAS_CONFIG_TYPES 1)
-  IF(CMAKE_BUILD_TYPE)
-    SET(VTK_PYTHON_BUILD_TYPE "\"${CMAKE_BUILD_TYPE}\"")
-  ELSE(CMAKE_BUILD_TYPE)
-    SET(VTK_PYTHON_BUILD_TYPE "[]")
-  ENDIF(CMAKE_BUILD_TYPE)
-ELSE(CMAKE_CONFIGURATION_TYPES)
+  set(VTK_PYTHON_HAS_CONFIG_TYPES 1)
+  if(CMAKE_BUILD_TYPE)
+    set(VTK_PYTHON_BUILD_TYPE "\"${CMAKE_BUILD_TYPE}\"")
+  else()
+    set(VTK_PYTHON_BUILD_TYPE "[]")
+  endif()
+else()
   # The build has one configuration type.  The build type does not
   # affect installation.
-  SET(VTK_PYTHON_HAS_CONFIG_TYPES 0)
-  SET(VTK_PYTHON_BUILD_TYPE "[]")
-ENDIF(CMAKE_CONFIGURATION_TYPES)
-
-CONFIGURE_FILE(${VTK_SOURCE_DIR}/Wrapping/Python/setup.py.in
-               ${VTK_BINARY_DIR}/Wrapping/Python/setup.py @ONLY IMMEDIATE)
+  set(VTK_PYTHON_HAS_CONFIG_TYPES 0)
+  set(VTK_PYTHON_BUILD_TYPE "[]")
+endif()
 
-# Allow the user to customize their build with some local options
-#
-INCLUDE (${VTK_BINARY_DIR}/Wrapping/Python/LocalUserOptions.cmake OPTIONAL)
-INCLUDE (${VTK_SOURCE_DIR}/Wrapping/Python/LocalUserOptions.cmake OPTIONAL)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in
+  ${CMAKE_CURRENT_BINARY_DIR}/setup.py @ONLY IMMEDIATE)
diff --git a/Wrapping/Python/setup_install_paths.py b/Wrapping/Python/setup_install_paths.py
index 014b906410a..f5bf49f4240 100755
--- a/Wrapping/Python/setup_install_paths.py
+++ b/Wrapping/Python/setup_install_paths.py
@@ -1,4 +1,4 @@
-#! /bin/env python
+#!/bin/env python
 
 """
 This script will return the paths that distutils will use for installing
diff --git a/Wrapping/Python/vtkpython.cxx.in b/Wrapping/Python/vtkpython.cxx.in
deleted file mode 100644
index 89d59d1f948..00000000000
--- a/Wrapping/Python/vtkpython.cxx.in
+++ /dev/null
@@ -1,2 +0,0 @@
-/* This file has been replaced by vtkPythonAppInit and vtkParaPythonAppInit.  */
-
diff --git a/Wrapping/PythonCore/CMakeLists.txt b/Wrapping/PythonCore/CMakeLists.txt
new file mode 100644
index 00000000000..1402e746de1
--- /dev/null
+++ b/Wrapping/PythonCore/CMakeLists.txt
@@ -0,0 +1,45 @@
+include(GenerateExportHeader)
+include(vtkPythonWrapping)
+
+set(Module_SRCS
+  vtkPythonArgs.cxx
+  vtkPythonCommand.cxx
+  vtkPythonOverload.cxx
+  vtkPythonUtil.cxx
+  PyVTKClass.cxx
+  PyVTKMutableObject.cxx
+  PyVTKObject.cxx
+  PyVTKSpecialObject.cxx
+  PyVTKTemplate.cxx
+  )
+
+set(Module_HDRS
+  ${CMAKE_CURRENT_BINARY_DIR}/${vtk-module}Module.h
+  )
+
+list(APPEND Module_SRCS ${Module_HDRS})
+
+set_source_files_properties(
+  ${Module_HDRS}
+  HEADER_FILE_ONLY
+  )
+
+include_directories(
+  ${VTK_SOURCE_DIR}/Utilities
+  )
+
+# SIP directory will be searched before other python dirs
+set(PYTHON_WRAPPING_INCLUDE_DIRS)
+if(VTK_WRAP_PYTHON_SIP)
+  list(APPEND PYTHON_WRAPPING_INCLUDE_DIRS "${SIP_INCLUDE_DIR}")
+endif()
+set(${vtk-module}_SYSTEM_INCLUDE_DIRS ${PYTHON_WRAPPING_INCLUDE_DIRS})
+
+set(${vtk-module}_NO_HeaderTest 1)
+set(${vtk-module}_INCLUDE_DIRS)
+
+set(XY ${PYTHON_MAJOR_VERSION}${PYTHON_MINOR_VERSION})
+vtk_module_library(${vtk-module} ${Module_SRCS})
+get_property(output_name TARGET ${vtk-module} PROPERTY OUTPUT_NAME)
+string(REPLACE "Python" "Python${XY}" output_name "${output_name}")
+set_property(TARGET ${vtk-module} PROPERTY OUTPUT_NAME ${output_name})
diff --git a/Wrapping/Python/PyVTKClass.cxx b/Wrapping/PythonCore/PyVTKClass.cxx
similarity index 100%
rename from Wrapping/Python/PyVTKClass.cxx
rename to Wrapping/PythonCore/PyVTKClass.cxx
diff --git a/Wrapping/Python/PyVTKClass.h b/Wrapping/PythonCore/PyVTKClass.h
similarity index 100%
rename from Wrapping/Python/PyVTKClass.h
rename to Wrapping/PythonCore/PyVTKClass.h
diff --git a/Wrapping/Python/PyVTKMutableObject.cxx b/Wrapping/PythonCore/PyVTKMutableObject.cxx
similarity index 100%
rename from Wrapping/Python/PyVTKMutableObject.cxx
rename to Wrapping/PythonCore/PyVTKMutableObject.cxx
diff --git a/Wrapping/Python/PyVTKMutableObject.h b/Wrapping/PythonCore/PyVTKMutableObject.h
similarity index 100%
rename from Wrapping/Python/PyVTKMutableObject.h
rename to Wrapping/PythonCore/PyVTKMutableObject.h
diff --git a/Wrapping/Python/PyVTKObject.cxx b/Wrapping/PythonCore/PyVTKObject.cxx
similarity index 100%
rename from Wrapping/Python/PyVTKObject.cxx
rename to Wrapping/PythonCore/PyVTKObject.cxx
diff --git a/Wrapping/Python/PyVTKObject.h b/Wrapping/PythonCore/PyVTKObject.h
similarity index 100%
rename from Wrapping/Python/PyVTKObject.h
rename to Wrapping/PythonCore/PyVTKObject.h
diff --git a/Wrapping/Python/PyVTKSpecialObject.cxx b/Wrapping/PythonCore/PyVTKSpecialObject.cxx
similarity index 100%
rename from Wrapping/Python/PyVTKSpecialObject.cxx
rename to Wrapping/PythonCore/PyVTKSpecialObject.cxx
diff --git a/Wrapping/Python/PyVTKSpecialObject.h b/Wrapping/PythonCore/PyVTKSpecialObject.h
similarity index 100%
rename from Wrapping/Python/PyVTKSpecialObject.h
rename to Wrapping/PythonCore/PyVTKSpecialObject.h
diff --git a/Wrapping/Python/PyVTKTemplate.cxx b/Wrapping/PythonCore/PyVTKTemplate.cxx
similarity index 100%
rename from Wrapping/Python/PyVTKTemplate.cxx
rename to Wrapping/PythonCore/PyVTKTemplate.cxx
diff --git a/Wrapping/Python/PyVTKTemplate.h b/Wrapping/PythonCore/PyVTKTemplate.h
similarity index 100%
rename from Wrapping/Python/PyVTKTemplate.h
rename to Wrapping/PythonCore/PyVTKTemplate.h
diff --git a/Wrapping/Python/conversionlist.in b/Wrapping/PythonCore/conversionlist.in
similarity index 100%
rename from Wrapping/Python/conversionlist.in
rename to Wrapping/PythonCore/conversionlist.in
diff --git a/Wrapping/Python/module.cmake b/Wrapping/PythonCore/module.cmake
similarity index 100%
rename from Wrapping/Python/module.cmake
rename to Wrapping/PythonCore/module.cmake
diff --git a/Wrapping/Python/vtkPythonArgs.cxx b/Wrapping/PythonCore/vtkPythonArgs.cxx
similarity index 100%
rename from Wrapping/Python/vtkPythonArgs.cxx
rename to Wrapping/PythonCore/vtkPythonArgs.cxx
diff --git a/Wrapping/Python/vtkPythonArgs.h b/Wrapping/PythonCore/vtkPythonArgs.h
similarity index 100%
rename from Wrapping/Python/vtkPythonArgs.h
rename to Wrapping/PythonCore/vtkPythonArgs.h
diff --git a/Wrapping/Python/vtkPythonCommand.cxx b/Wrapping/PythonCore/vtkPythonCommand.cxx
similarity index 100%
rename from Wrapping/Python/vtkPythonCommand.cxx
rename to Wrapping/PythonCore/vtkPythonCommand.cxx
diff --git a/Wrapping/Python/vtkPythonCommand.h b/Wrapping/PythonCore/vtkPythonCommand.h
similarity index 100%
rename from Wrapping/Python/vtkPythonCommand.h
rename to Wrapping/PythonCore/vtkPythonCommand.h
diff --git a/Wrapping/Python/vtkPythonOverload.cxx b/Wrapping/PythonCore/vtkPythonOverload.cxx
similarity index 100%
rename from Wrapping/Python/vtkPythonOverload.cxx
rename to Wrapping/PythonCore/vtkPythonOverload.cxx
diff --git a/Wrapping/Python/vtkPythonOverload.h b/Wrapping/PythonCore/vtkPythonOverload.h
similarity index 100%
rename from Wrapping/Python/vtkPythonOverload.h
rename to Wrapping/PythonCore/vtkPythonOverload.h
diff --git a/Wrapping/Python/vtkPythonUtil.cxx b/Wrapping/PythonCore/vtkPythonUtil.cxx
similarity index 100%
rename from Wrapping/Python/vtkPythonUtil.cxx
rename to Wrapping/PythonCore/vtkPythonUtil.cxx
diff --git a/Wrapping/Python/vtkPythonUtil.h b/Wrapping/PythonCore/vtkPythonUtil.h
similarity index 100%
rename from Wrapping/Python/vtkPythonUtil.h
rename to Wrapping/PythonCore/vtkPythonUtil.h
-- 
GitLab