diff --git a/wrappers/gmshpy/CMakeLists.txt b/wrappers/gmshpy/CMakeLists.txt
index b9f10c2a851754934b216abe05fd4ab1bcc77fd2..775bb5de46a097ead7b01fa25509a33b0759f866 100644
--- a/wrappers/gmshpy/CMakeLists.txt
+++ b/wrappers/gmshpy/CMakeLists.txt
@@ -11,6 +11,10 @@ set(SWIG_MODULES
   gmshSolver
   gmshMesh
 )
+if (NOT GMSHPY_INSTALL_DIRECTORY)
+  execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print (sysconfig.get_python_lib(1,0,prefix='${CMAKE_INSTALL_PREFIX}'))" OUTPUT_VARIABLE PYTHON_MODULE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
+  set(GMSHPY_INSTALL_DIRECTORY ${PYTHON_MODULE_PATH}/gmshpy CACHE STRING "python wrappers installation directory")
+endif (NOT GMSHPY_INSTALL_DIRECTORY)
 
 # code backported from CMake git version, see CMake bug 4147
 MACRO(SWIG_GET_WRAPPER_DEPENDENCIES swigFile genWrapper language DEST_VARIABLE)
@@ -60,18 +64,10 @@ MACRO(SWIG_GET_WRAPPER_DEPENDENCIES swigFile genWrapper language DEST_VARIABLE)
   ENDIF(NOT ${swig_getdeps_error} EQUAL 0)
 ENDMACRO(SWIG_GET_WRAPPER_DEPENDENCIES)
 
-option(ENABLE_PYTHON_LIB_API "Export all C header files needed to build the python library" OFF)
-if(ENABLE_PYTHON_LIB_API)
-  set(GMSH_API ${GMSH_API} Geo/Curvature.h Mesh/Generator.h 
-      Mesh/meshGFaceLloyd.h Numeric/DivideAndConquer.h Post/PViewFactory.h
-      Solver/linearSystemPETSc.h Fltk/FlGui.h Solver/functionSpace.h
-      Solver/STensor43.h Solver/sparsityPattern.h Solver/SElement.h
-      Solver/groupOfElements.h PARENT_SCOPE)
-endif(ENABLE_PYTHON_LIB_API)
-
 include(${SWIG_USE_FILE})
 include_directories(${PYTHON_INCLUDE_PATH})
 
+option(ENABLE_GMSHPY_SOURCE_PACKAGE "Instead of generating the python bindings for the current python executable, generate a source package that can be used to generate the bindings without requiring the gmsh source code" OFF)
 set(GMSH_PYTHON_MODULES_INCLUDE_CODE "")
 foreach(module ${SWIG_MODULES})
   set_source_files_properties(${module}.i PROPERTIES CPLUSPLUS ON)
@@ -91,74 +87,92 @@ foreach(module ${SWIG_MODULES})
   set(GMSH_PYTHON_MODULES_INCLUDE_CODE 
       "${GMSH_PYTHON_MODULES_INCLUDE_CODE}from gmshpy.${module} import *\n")
   list(APPEND GMSHPY_DEPENDS "${module}PYTHON_wrap.cxx")
+
+  if (NOT ENABLE_GMSHPY_SOURCE_PACKAGE)
+    install(TARGETS ${SWIG_MODULE_${module}_REAL_NAME} DESTINATION ${GMSHPY_INSTALL_DIRECTORY})
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${module}.py DESTINATION ${GMSHPY_INSTALL_DIRECTORY})
+  endif (NOT ENABLE_GMSHPY_SOURCE_PACKAGE)
   if(APPLE)
     set_target_properties("_${module}" PROPERTIES LINK_FLAGS "-undefined suppress -flat_namespace")
   endif(APPLE)
 endforeach(module)
 
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/__init__.py.in ${CMAKE_CURRENT_BINARY_DIR}/__init__.py.orig)
-IF(HAVE_MPI)
-  # this hack is only required for openmpi compiled with dynamic modules
-  # unfortunately I do not know how to detect this situation => I always enable it
-  set(GMSH_PYTHON_OPENMPI_HACK "import ctypes\n")
-  FOREACH (lib ${MPI_C_LIBRARIES})
-    IF (${lib} MATCHES ".*libmpi.*")
-      set(GMSH_PYTHON_OPENMPI_HACK 
-        "${GMSH_PYTHON_OPENMPI_HACK}ctypes.CDLL(\"${lib}\", mode = ctypes.RTLD_GLOBAL)\n")
-    ENDIF (${lib} MATCHES ".*libmpi.*")
-  ENDFOREACH (lib)
-ENDIF(HAVE_MPI)
+if (NOT ENABLE_GMSHPY_SOURCE_PACKAGE)
+  IF(HAVE_MPI)
+    # this hack is only required for openmpi compiled with dynamic modules
+    # unfortunately I do not know how to detect this situation => I always enable it
+    set(GMSH_PYTHON_OPENMPI_HACK "import ctypes\n")
+    FOREACH (lib ${MPI_C_LIBRARIES})
+      IF (${lib} MATCHES ".*libmpi.*")
+        set(GMSH_PYTHON_OPENMPI_HACK 
+          "${GMSH_PYTHON_OPENMPI_HACK}ctypes.CDLL(\"${lib}\", mode = ctypes.RTLD_GLOBAL)\n")
+      ENDIF (${lib} MATCHES ".*libmpi.*")
+    ENDFOREACH (lib)
+  ENDIF(HAVE_MPI)
+endif (NOT ENABLE_GMSHPY_SOURCE_PACKAGE)
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/__init__.py.in ${CMAKE_CURRENT_BINARY_DIR}/__init__.py)
+if (NOT ENABLE_GMSHPY_SOURCE_PACKAGE)
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/__init__.py DESTINATION ${GMSHPY_INSTALL_DIRECTORY})
+endif (NOT ENABLE_GMSHPY_SOURCE_PACKAGE)
 
-string(REPLACE ";" "\", \"" GMSH_PYTHON_MODULES "${SWIG_MODULES}")
-set(GMSH_PYTHON_MODULES "\"${GMSH_PYTHON_MODULES}\"")
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in ${CMAKE_CURRENT_BINARY_DIR}/setup.py)
+if(ENABLE_GMSHPY_SOURCE_PACKAGE)
+  set(GMSH_API ${GMSH_API} Geo/Curvature.h Mesh/Generator.h 
+      Mesh/meshGFaceLloyd.h Numeric/DivideAndConquer.h Post/PViewFactory.h
+      Solver/linearSystemPETSc.h Fltk/FlGui.h Solver/functionSpace.h
+      Solver/STensor43.h Solver/sparsityPattern.h Solver/SElement.h
+      Solver/groupOfElements.h PARENT_SCOPE)
 
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/__init__.py.orig DESTINATION gmshpy/src RENAME __init__.py)
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/setup.py DESTINATION gmshpy)
-foreach(module ${SWIG_MODULES})
-  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${module}PYTHON_wrap.cxx DESTINATION gmshpy/src)
-  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${module}.py DESTINATION gmshpy/src)
-  install(TARGETS _${module} DESTINATION gmshpy/src)
-endforeach(module)
 
-set (GMSH_PYTHON_EXTRA_INCLUDE 
-  Numeric/BasisFactory.h
-  Numeric/BergotBasis.h
-  Mesh/CenterlineField.h
-  Geo/Curvature.h
-  Common/Options.h
-  Mesh/directions3D.h
-  Mesh/DivideAndConquer.h
-  Mesh/Field.h
-  Mesh/FieldPython.h
-  Fltk/FlGui.h
-  Solver/frameSolver.h
-  Solver/functionSpace.h
-  Solver/eigenSolver.h
-  Mesh/Generator.h
-  Geo/GeomMeshMatcher.h
-  Geo/GFaceCompound.h
-  Geo/gmshLevelset.h
-  Numeric/jacobiPolynomials.h
-  Numeric/legendrePolynomials.h
-  Plugin/Plugin.h
-  Solver/linearSystemPETSc.h
-  Mesh/meshGFaceLloyd.h
-  contrib/HighOrderMeshOptimizer/OptHomRun.h
-  contrib/HighOrderMeshOptimizer/OptHomElastic.h
-  contrib/MeshQualityOptimizer/MeshQualityOptimizer.h
-  Post/PViewAsSimpleFunction.h
-  Post/PViewDataList.h
-  Post/PViewFactory.h
-  Numeric/pyramidalBasis.h
-  Numeric/FuncSpaceData.h
-  Solver/SElement.h
-  Numeric/simpleFunctionPython.h
-  Solver/STensor33.h
-  Solver/STensor43.h
-)
+  string(REPLACE ";" "\", \"" GMSH_PYTHON_MODULES "${SWIG_MODULES}")
+  set(GMSH_PYTHON_MODULES "\"${GMSH_PYTHON_MODULES}\"")
+  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in ${CMAKE_CURRENT_BINARY_DIR}/setup.py)
+
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/__init__.py.orig DESTINATION gmshpy/src RENAME __init__.py)
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/setup.py DESTINATION gmshpy)
+  foreach(module ${SWIG_MODULES})
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${module}PYTHON_wrap.cxx DESTINATION gmshpy/src)
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${module}.py DESTINATION gmshpy/src)
+    install(TARGETS _${module} DESTINATION gmshpy/src)
+  endforeach(module)
+
+  set (GMSH_PYTHON_EXTRA_INCLUDE 
+    Numeric/BasisFactory.h
+    Numeric/BergotBasis.h
+    Mesh/CenterlineField.h
+    Geo/Curvature.h
+    Common/Options.h
+    Mesh/directions3D.h
+    Mesh/DivideAndConquer.h
+    Mesh/Field.h
+    Mesh/FieldPython.h
+    Fltk/FlGui.h
+    Solver/frameSolver.h
+    Solver/functionSpace.h
+    Solver/eigenSolver.h
+    Mesh/Generator.h
+    Geo/GeomMeshMatcher.h
+    Geo/GFaceCompound.h
+    Geo/gmshLevelset.h
+    Numeric/jacobiPolynomials.h
+    Numeric/legendrePolynomials.h
+    Plugin/Plugin.h
+    Solver/linearSystemPETSc.h
+    Mesh/meshGFaceLloyd.h
+    contrib/HighOrderMeshOptimizer/OptHomRun.h
+    contrib/HighOrderMeshOptimizer/OptHomElastic.h
+    contrib/MeshQualityOptimizer/MeshQualityOptimizer.h
+    Post/PViewAsSimpleFunction.h
+    Post/PViewDataList.h
+    Post/PViewFactory.h
+    Numeric/pyramidalBasis.h
+    Numeric/FuncSpaceData.h
+    Solver/SElement.h
+    Numeric/simpleFunctionPython.h
+    Solver/STensor33.h
+    Solver/STensor43.h
+  )
 
-foreach (file ${GMSH_PYTHON_EXTRA_INCLUDE})
-  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../${file} DESTINATION gmshpy/extra_include)
-endforeach(file)
+  foreach (file ${GMSH_PYTHON_EXTRA_INCLUDE})
+    install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../${file} DESTINATION gmshpy/extra_include)
+  endforeach(file)
+endif(ENABLE_GMSHPY_SOURCE_PACKAGE)