swt2c / rpms / mathgl

Forked from rpms/mathgl 5 years ago
Clone
Blob Blame History Raw
diff -urp mathgl-2.4.1/lang/CMakeLists.txt mathgl-2.4.1-lang/lang/CMakeLists.txt
--- mathgl-2.4.1/lang/CMakeLists.txt	2017-12-05 12:02:01.776791073 +0700
+++ mathgl-2.4.1-lang/lang/CMakeLists.txt	2017-12-06 12:19:53.510447509 +0700
@@ -17,48 +17,6 @@ if(NOT SWIG_FOUND)
 endif(NOT SWIG_FOUND)
 INCLUDE(${SWIG_USE_FILE})
 
-if(enable-python)
-	set(Python_ADDITIONAL_VERSIONS 2.7)
-	FIND_PACKAGE(PythonInterp)
-	if(NOT PYTHONINTERP_FOUND)
-		message(SEND_ERROR "Couldn't find python interpreter.")
-	endif(NOT PYTHONINTERP_FOUND)
-	FIND_PACKAGE(PythonLibs)
-	if(NOT PYTHONLIBS_FOUND)
-		message(SEND_ERROR "Couldn't find python development libraries.")
-	endif(NOT PYTHONLIBS_FOUND)
-	execute_process(
-		COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print numpy.get_include()"
-		OUTPUT_VARIABLE NUMPY_INCLUDE_PATH
-		RESULT_VARIABLE NUMPY_ERR
-		OUTPUT_STRIP_TRAILING_WHITESPACE
-	)
-	if(NOT NUMPY_INCLUDE_PATH)
-		message(SEND_ERROR "Couldn't find numpy.")
-	endif(NOT NUMPY_INCLUDE_PATH)
-
-	include_directories(${PYTHON_INCLUDE_DIR}  ${NUMPY_INCLUDE_PATH})
-	execute_process(
-		COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(prefix='${CMAKE_INSTALL_PREFIX}')"
-		OUTPUT_VARIABLE MGL_PYTHON_SITE_PACKAGES
-		OUTPUT_STRIP_TRAILING_WHITESPACE)
-	set(SWIG_MODULE_mathgl_EXTRA_DEPS numpy.i ${src_imp_dep})
-	SWIG_ADD_MODULE(mathgl python mathgl.i)
-	SWIG_LINK_LIBRARIES(mathgl mgl ${PYTHON_LIBRARIES})
-	set_target_properties(_mathgl PROPERTIES BUILD_WITH_INSTALL_RPATH ON)
-	add_custom_command(OUTPUT mathgl.pyc
-		COMMAND ${PYTHON_EXECUTABLE}
-		ARGS -c \"from py_compile import compile\; compile('mathgl.py') \"
-		WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang
-		DEPENDS _mathgl
-	)
-	add_custom_target(mgl_python_module ALL DEPENDS _mathgl mathgl.pyc)
-
-	install(FILES ${MathGL2_BINARY_DIR}/lang/mathgl.py ${MathGL2_BINARY_DIR}/lang/mathgl.pyc DESTINATION ${MGL_PYTHON_SITE_PACKAGES})
-	install (TARGETS _mathgl LIBRARY DESTINATION ${MGL_PYTHON_SITE_PACKAGES})
-	set(mgl_clean_files ${mgl_clean_files} mathgl.py)
-endif(enable-python)
-
 if(enable-lua)
 	INCLUDE(FindLua51)
 	if(NOT LUA51_FOUND)
@@ -133,4 +91,8 @@ message(STATUS "${oct_prog} ${oct_host}
 	endif(enable-octave-install)
 	set(mgl_clean_files ${mgl_clean_files} mathgl)
 endif(enable-octave)
+
+add_subdirectory( python2 )
+add_subdirectory( python3 )
+
 set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${mgl_clean_files}")
diff -urp mathgl-2.4.1/lang/numpy.i mathgl-2.4.1-lang/lang/numpy.i
--- mathgl-2.4.1/lang/numpy.i	2017-12-05 12:02:01.776791073 +0700
+++ mathgl-2.4.1-lang/lang/numpy.i	2017-12-05 12:02:18.766427285 +0700
@@ -97,7 +97,7 @@
 {
   /* Given a PyObject, return a string describing its type.
    */
-  char* pytype_string(PyObject* py_obj) {
+  const char* pytype_string(PyObject* py_obj) {
     if (py_obj == NULL          ) return "C NULL value";
     if (py_obj == Py_None       ) return "Python None" ;
     if (PyCallable_Check(py_obj)) return "callable"    ;
@@ -107,17 +107,18 @@
     if (PyDict_Check(    py_obj)) return "dict"        ;
     if (PyList_Check(    py_obj)) return "list"        ;
     if (PyTuple_Check(   py_obj)) return "tuple"       ;
-    if (PyFile_Check(    py_obj)) return "file"        ;
     if (PyModule_Check(  py_obj)) return "module"      ;
+%#if PY_MAJOR_VERSION < 3
+    if (PyFile_Check(    py_obj)) return "file"        ;
     if (PyInstance_Check(py_obj)) return "instance"    ;
-
-    return "unknow type";
+%#endif
+    return "unkown type";
   }
 
   /* Given a NumPy typecode, return a string describing the type.
    */
-  char* typecode_string(int typecode) {
-    static char* type_names[25] = {"bool", "byte", "unsigned byte",
+  const char* typecode_string(int typecode) {
+    static const char* type_names[25] = {"bool", "byte", "unsigned byte",
                                    "short", "unsigned short", "int",
                                    "unsigned int", "long", "unsigned long",
                                    "long long", "unsigned long long",
@@ -159,8 +160,8 @@
     }
     else if is_array(input)
     {
-      char* desired_type = typecode_string(typecode);
-      char* actual_type  = typecode_string(array_type(input));
+      const char* desired_type = typecode_string(typecode);
+      const char* actual_type  = typecode_string(array_type(input));
       PyErr_Format(PyExc_TypeError,
                    "Array of type '%s' required.  Array of type '%s' given",
                    desired_type, actual_type);
@@ -168,8 +169,8 @@
     }
     else
     {
-      char * desired_type = typecode_string(typecode);
-      char * actual_type  = pytype_string(input);
+      const char * desired_type = typecode_string(typecode);
+      const char * actual_type  = pytype_string(input);
       PyErr_Format(PyExc_TypeError,
                    "Array of type '%s' required.  A '%s' was given",
                    desired_type, actual_type);
@@ -307,6 +308,95 @@
     return ary1;
   }
 
+  /* The following code was added by Ilmar M. Wilbers for forcing a copy of the
+   * object even when it is a NumPy array. This is meant for use with the
+   * IN_ARRAY typemaps, and allows the user to perform changes on an array
+   * without these chenges being reflected in the calling code.
+   */
+
+  /* Convert the given PyObject to a NumPy array with the given
+   * typecode as a copy. On success, return a valid PyArrayObject* with the
+   * correct type.  On failure, the python error string will be set and
+   * the routine returns NULL.
+   */
+  PyArrayObject* obj_to_array_force_conversion(PyObject* input, int typecode,
+                                               int* is_new_object)
+  {
+    PyArrayObject* ary = NULL;
+    PyObject* py_obj;
+    if (is_array(input) && (typecode == NPY_NOTYPE ||
+                            PyArray_EquivTypenums(array_type(input),typecode)))
+    {
+      py_obj = PyArray_Copy((PyArrayObject*) input);
+      ary = (PyArrayObject*) py_obj;
+      *is_new_object = 1;
+    }
+    else
+    {
+      py_obj = PyArray_FROMANY(input, typecode, 0, 0, NPY_DEFAULT);
+      /* If NULL, PyArray_FromObject will have set python error value.*/
+      ary = (PyArrayObject*) py_obj;
+      *is_new_object = 1;
+    }
+    return ary;
+  }
+
+ /* Convert a given PyObject to a contiguous PyArrayObject of the
+   * specified type.  If the input object is not a contiguous
+   * PyArrayObject, a new one will be created and the new object flag
+   * will be set.
+   */
+  PyArrayObject* obj_to_array_contiguous_force_conversion(PyObject* input,
+                                                          int typecode,
+                                                          int* is_new_object)
+  {
+    int is_new1 = 0;
+    int is_new2 = 0;
+    PyArrayObject* ary2;
+    PyArrayObject* ary1 = obj_to_array_force_conversion(input, typecode,
+                                                        &is_new1);
+    if (ary1)
+    {
+      ary2 = make_contiguous(ary1, &is_new2, 0, 0);
+      if ( is_new1 && is_new2)
+      {
+        Py_DECREF(ary1);
+      }
+      ary1 = ary2;
+    }
+    *is_new_object = is_new1 || is_new2;
+    return ary1;
+  }
+
+  /* Convert a given PyObject to a Fortran-ordered PyArrayObject of the
+   * specified type.  If the input object is not a Fortran-ordered
+   * PyArrayObject, a new one will be created and the new object flag
+   * will be set.
+   */
+  PyArrayObject* obj_to_array_fortran_force_conversion(PyObject* input,
+                                                       int typecode,
+                                                       int* is_new_object)
+  {
+    int is_new1 = 0;
+    int is_new2 = 0;
+    PyArrayObject* ary2;
+    PyArrayObject* ary1 = obj_to_array_force_conversion(input, typecode,
+                                                        &is_new1);
+    if (ary1)
+    {
+      ary2 = make_fortran(ary1, &is_new2, 0, 0);
+      if (is_new1 && is_new2)
+      {
+        Py_DECREF(ary1);
+      }
+      ary1 = ary2;
+    }
+    *is_new_object = is_new1 || is_new2;
+    return ary1;
+  }
+  /* End modifications by Ilmar M. Wilbers
+   */
+
 } /* end fragment */
 
 
@@ -601,7 +691,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[1] = { $1_dim0 };
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 1) ||
       !require_size(array, size, 1)) SWIG_fail;
@@ -628,7 +718,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[1] = { -1 };
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 1) ||
       !require_size(array, size, 1)) SWIG_fail;
@@ -656,7 +746,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[1] = {-1};
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 1) ||
       !require_size(array, size, 1)) SWIG_fail;
@@ -684,7 +774,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[2] = { $1_dim0, $1_dim1 };
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 2) ||
       !require_size(array, size, 2)) SWIG_fail;
@@ -711,7 +801,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[2] = { -1, -1 };
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 2) ||
       !require_size(array, size, 2)) SWIG_fail;
@@ -740,7 +830,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[2] = { -1, -1 };
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 2) ||
       !require_size(array, size, 2)) SWIG_fail;
@@ -769,7 +859,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[2] = { -1, -1 };
-  array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_fortran_force_conversion($input, DATA_TYPECODE,
                                                 &is_new_object);
   if (!array || !require_dimensions(array, 2) ||
       !require_size(array, size, 2) || !require_fortran(array)) SWIG_fail;
@@ -798,7 +888,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[2] = { -1, -1 };
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 2) ||
       !require_size(array, size, 2) || !require_fortran(array)) SWIG_fail;
@@ -827,7 +917,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[3] = { $1_dim0, $1_dim1, $1_dim2 };
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 3) ||
       !require_size(array, size, 3)) SWIG_fail;
@@ -855,7 +945,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[3] = { -1, -1, -1 };
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 3) ||
       !require_size(array, size, 3)) SWIG_fail;
@@ -886,7 +976,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[3] = { -1, -1, -1 };
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 3) ||
       !require_size(array, size, 3)) SWIG_fail;
@@ -917,7 +1007,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[3] = { -1, -1, -1 };
-  array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_fortran_force_conversion($input, DATA_TYPECODE,
                                                 &is_new_object);
   if (!array || !require_dimensions(array, 3) ||
       !require_size(array, size, 3) | !require_fortran(array)) SWIG_fail;
@@ -948,7 +1038,7 @@
   (PyArrayObject* array=NULL, int is_new_object=0)
 {
   npy_intp size[3] = { -1, -1, -1 };
-  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+  array = obj_to_array_contiguous_force_conversion($input, DATA_TYPECODE,
                                                    &is_new_object);
   if (!array || !require_dimensions(array, 3) ||
       !require_size(array, size, 3) || !require_fortran(array)) SWIG_fail;
@@ -1291,7 +1381,7 @@
   npy_intp dims[1];
   if (!PyInt_Check($input))
   {
-    char* typestring = pytype_string($input);
+    const char* typestring = pytype_string($input);
     PyErr_Format(PyExc_TypeError,
                  "Int dimension expected.  '%s' given.",
                  typestring);
@@ -1319,7 +1409,7 @@
   npy_intp dims[1];
   if (!PyInt_Check($input))
   {
-    char* typestring = pytype_string($input);
+    const char* typestring = pytype_string($input);
     PyErr_Format(PyExc_TypeError,
                  "Int dimension expected.  '%s' given.",
                  typestring);
diff -urp mathgl-2.4.1/lang/python2/CMakeLists.txt mathgl-2.4.1-lang/lang/python2/CMakeLists.txt
--- mathgl-2.4.1/lang/python2/CMakeLists.txt	2017-12-06 12:23:26.756865569 +0700
+++ mathgl-2.4.1-lang/lang/python2/CMakeLists.txt	2017-12-06 18:34:24.611303047 +0700
@@ -0,0 +1,56 @@
+set(src_imp_dep
+../../include/mgl2/type.h
+../../include/mgl2/data.h
+../../include/mgl2/mgl.h
+../mgl.i
+../data.i
+../type.i
+)
+
+set(mgl_clean_files "")
+
+SET_SOURCE_FILES_PROPERTIES(../mathgl.i ../numpy.i PROPERTIES CPLUSPLUS ON)
+
+if(enable-python)
+	set(Python_ADDITIONAL_VERSIONS 2.7)
+	FIND_PACKAGE(PythonInterp 2.7 REQUIRED)
+	if(NOT PYTHONINTERP_FOUND)
+		message(SEND_ERROR "Couldn't find python interpreter.")
+	endif(NOT PYTHONINTERP_FOUND)
+	FIND_PACKAGE(PythonLibs)
+	if(NOT PYTHONLIBS_FOUND)
+		message(SEND_ERROR "Couldn't find python development libraries.")
+	endif(NOT PYTHONLIBS_FOUND)
+	execute_process(
+		COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print numpy.get_include()"
+		OUTPUT_VARIABLE NUMPY_INCLUDE_PATH
+		RESULT_VARIABLE NUMPY_ERR
+		OUTPUT_STRIP_TRAILING_WHITESPACE
+	)
+	if(NOT NUMPY_INCLUDE_PATH)
+		message(SEND_ERROR "Couldn't find numpy.")
+	endif(NOT NUMPY_INCLUDE_PATH)
+
+	include_directories(${PYTHON_INCLUDE_DIR}  ${NUMPY_INCLUDE_PATH})
+	execute_process(
+		COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(prefix='${CMAKE_INSTALL_PREFIX}')"
+		OUTPUT_VARIABLE MGL_PYTHON_SITE_PACKAGES
+		OUTPUT_STRIP_TRAILING_WHITESPACE)
+	set(SWIG_MODULE_mathgl_EXTRA_DEPS ../numpy.i ${src_imp_dep})
+	SWIG_ADD_MODULE(mathgl python ../mathgl.i)
+	SWIG_LINK_LIBRARIES(mathgl mgl ${PYTHON_LIBRARIES})
+	set_target_properties(_mathgl PROPERTIES BUILD_WITH_INSTALL_RPATH ON)
+	add_custom_command(OUTPUT mathgl.pyc
+		COMMAND ${PYTHON_EXECUTABLE}
+		ARGS -c \"from py_compile import compile\; compile('mathgl.py') \"
+		WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang/python2
+		DEPENDS _mathgl
+	)
+	add_custom_target(mgl_python_module ALL DEPENDS _mathgl mathgl.pyc)
+
+	install(FILES ${MathGL2_BINARY_DIR}/lang/python2/mathgl.py ${MathGL2_BINARY_DIR}/lang/python2/mathgl.pyc DESTINATION ${MGL_PYTHON_SITE_PACKAGES})
+	install (TARGETS _mathgl LIBRARY DESTINATION ${MGL_PYTHON_SITE_PACKAGES})
+	set(mgl_clean_files ${mgl_clean_files} mathgl.py)
+endif(enable-python)
+
+set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${mgl_clean_files}")
diff -urp mathgl-2.4.1/lang/python3/CMakeLists.txt mathgl-2.4.1-lang/lang/python3/CMakeLists.txt
--- mathgl-2.4.1/lang/python3/CMakeLists.txt	2017-12-06 12:23:26.756865569 +0700
+++ mathgl-2.4.1-lang/lang/python3/CMakeLists.txt	2017-12-06 18:34:43.280894028 +0700
@@ -0,0 +1,75 @@
+set(src_imp_dep
+../../include/mgl2/type.h
+../../include/mgl2/data.h
+../../include/mgl2/mgl.h
+../mgl.i
+../data.i
+../type.i
+)
+
+set(mgl_clean_files "")
+
+SET_SOURCE_FILES_PROPERTIES(../mathgl.i ../numpy.i PROPERTIES CPLUSPLUS ON)
+
+if(enable-python)
+	set(Python_ADDITIONAL_VERSIONS 3.6)
+	unset(PYTHONINTERP_FOUND)
+	unset(PYTHON_EXECUTABLE CACHE)
+	FIND_PACKAGE(PythonInterp 3.6 REQUIRED)
+	if(NOT PYTHONINTERP_FOUND)
+		message(SEND_ERROR "Couldn't find python interpreter.")
+	endif(NOT PYTHONINTERP_FOUND)
+
+	unset(PYTHONLIBS_FOUND)
+	unset(PYTHON_LIBRARIES CACHE)
+	unset(PYTHON_INCLUDE_PATH CACHE)
+	unset(PYTHON_INCLUDE_DIRS CACHE)
+	unset(PYTHON_DEBUG_LIBRARIES CACHE)
+	unset(PYTHONLIBS_VERSION_STRING CACHE)
+	unset(PYTHON_LIBRARY CACHE)
+	unset(PYTHON_INCLUDE_DIR CACHE)
+	FIND_PACKAGE(PythonLibs 3.6)
+	if(NOT PYTHONLIBS_FOUND)
+		message(SEND_ERROR "Couldn't find python development libraries.")
+	endif(NOT PYTHONLIBS_FOUND)
+	execute_process(
+		COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print(numpy.get_include())"
+		OUTPUT_VARIABLE NUMPY_INCLUDE_PATH
+		RESULT_VARIABLE NUMPY_ERR
+		OUTPUT_STRIP_TRAILING_WHITESPACE
+	)
+	if(NOT NUMPY_INCLUDE_PATH)
+		message(SEND_ERROR "Couldn't find numpy.")
+	endif(NOT NUMPY_INCLUDE_PATH)
+
+	include_directories(${PYTHON_INCLUDE_DIR}  ${NUMPY_INCLUDE_PATH})
+	execute_process(
+		COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(prefix='${CMAKE_INSTALL_PREFIX}'))"
+		OUTPUT_VARIABLE MGL_PYTHON_SITE_PACKAGES
+		OUTPUT_STRIP_TRAILING_WHITESPACE)
+	set(SWIG_MODULE_mathglp3_EXTRA_DEPS ../numpy.i ${src_imp_dep})
+	SWIG_ADD_MODULE(mathglp3 python ../mathgl.i)
+	SWIG_LINK_LIBRARIES(mathglp3 mgl ${PYTHON_LIBRARIES})
+	execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('SO'))"
+                  OUTPUT_VARIABLE MGL_PYTHON_LIB_SUFFIX
+                  OUTPUT_STRIP_TRAILING_WHITESPACE)
+	set_target_properties(_mathglp3 PROPERTIES
+		BUILD_WITH_INSTALL_RPATH ON
+		OUTPUT_NAME _mathgl
+		SUFFIX ${MGL_PYTHON_LIB_SUFFIX})
+	add_custom_command(OUTPUT mathgl.pyc
+		COMMAND ${PYTHON_EXECUTABLE}
+		ARGS -c \"from py_compile import compile\; compile('mathgl.py') \"
+		WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang/python3
+		DEPENDS _mathglp3
+	)
+	add_custom_target(mgl_python_modulep3 ALL DEPENDS _mathglp3 mathgl.pyc)
+
+	install(FILES ${MathGL2_BINARY_DIR}/lang/python3/mathgl.py DESTINATION ${MGL_PYTHON_SITE_PACKAGES})
+# harcoded for now. another way is to make glob search on *pyc in __pycache__ dir
+	install(FILES ${MathGL2_BINARY_DIR}/lang/python3/__pycache__/mathgl.cpython-36.pyc DESTINATION ${MGL_PYTHON_SITE_PACKAGES}/__pycache__)
+	install (TARGETS _mathglp3 LIBRARY DESTINATION ${MGL_PYTHON_SITE_PACKAGES})
+	set(mgl_clean_files ${mgl_clean_files} mathgl.py)
+endif(enable-python)
+
+set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${mgl_clean_files}")