diff --git a/CMakeLists.txt b/CMakeLists.txt index bfa645b80f..c6e355b6d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -543,9 +543,9 @@ endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ELSE(NOT PYTHONLIBS_FOUND) # prevent python3 lower than 3.3 (not enough utf8<->unicode tools) IF(PYTHON_VERSION_MAJOR EQUAL 3) - IF(PYTHON_VERSION_MINOR LESS 5) - MESSAGE(FATAL_ERROR "To build FreeCAD with Python3, you need at least version 3.5\n") - ENDIF(PYTHON_VERSION_MINOR LESS 5) + IF(PYTHON_VERSION_MINOR LESS 4) + MESSAGE(FATAL_ERROR "To build FreeCAD with Python3, you need at least version 3.4\n") + ENDIF(PYTHON_VERSION_MINOR LESS 4) ENDIF(PYTHON_VERSION_MAJOR EQUAL 3) ENDIF(NOT PYTHONLIBS_FOUND) diff --git a/src/Base/Interpreter.cpp b/src/Base/Interpreter.cpp index e80f13a853..05fe939a20 100644 --- a/src/Base/Interpreter.cpp +++ b/src/Base/Interpreter.cpp @@ -476,7 +476,11 @@ const char* InterpreterSingleton::init(int argc,char *argv[]) { if (!Py_IsInitialized()) { #if PY_MAJOR_VERSION >= 3 +#if PY_MINOR_VERSION >= 5 Py_SetProgramName(Py_DecodeLocale(argv[0],NULL)); +#else + Py_SetProgramName(_Py_char2wchar(argv[0],NULL)); +#endif #else Py_SetProgramName(argv[0]); #endif @@ -486,7 +490,11 @@ const char* InterpreterSingleton::init(int argc,char *argv[]) size_t size = argc; wchar_t **_argv = new wchar_t*[size]; for (int i = 0; i < argc; i++) { +#if PY_MINOR_VERSION >= 5 _argv[i] = Py_DecodeLocale(argv[i],NULL); +#else + _argv[i] = _Py_char2wchar(argv[i],NULL); +#endif } PySys_SetArgv(argc, _argv); #else @@ -496,7 +504,11 @@ const char* InterpreterSingleton::init(int argc,char *argv[]) this->_global = PyEval_SaveThread(); } #if PY_MAJOR_VERSION >= 3 +#if PY_MINOR_VERSION >= 5 return Py_EncodeLocale(Py_GetPath(),NULL); +#else + return _Py_wchar2char(Py_GetPath(),NULL); +#endif #else return Py_GetPath(); #endif diff --git a/src/Gui/Application.cpp b/src/Gui/Application.cpp index 2906b1dbcb..9489a43dfd 100644 --- a/src/Gui/Application.cpp +++ b/src/Gui/Application.cpp @@ -219,6 +219,53 @@ FreeCADGui_getSoDBVersion(PyObject * /*self*/, PyObject *args) #endif } +// Copied from https://github.com/python/cpython/blob/master/Objects/moduleobject.c +#if PY_MAJOR_VERSION >= 3 +#if PY_MINOR_VERSION <= 4 +static int +_add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions) +{ + PyObject *func; + PyMethodDef *fdef; + + for (fdef = functions; fdef->ml_name != NULL; fdef++) { + if ((fdef->ml_flags & METH_CLASS) || + (fdef->ml_flags & METH_STATIC)) { + PyErr_SetString(PyExc_ValueError, + "module functions cannot set" + " METH_CLASS or METH_STATIC"); + return -1; + } + func = PyCFunction_NewEx(fdef, (PyObject*)module, name); + if (func == NULL) { + return -1; + } + if (PyObject_SetAttrString(module, fdef->ml_name, func) != 0) { + Py_DECREF(func); + return -1; + } + Py_DECREF(func); + } + + return 0; +} + +int +PyModule_AddFunctions(PyObject *m, PyMethodDef *functions) +{ + int res; + PyObject *name = PyModule_GetNameObject(m); + if (name == NULL) { + return -1; + } + + res = _add_methods_to_object(m, name, functions); + Py_DECREF(name); + return res; +} +#endif +#endif + struct PyMethodDef FreeCADGui_methods[] = { {"subgraphFromObject",FreeCADGui_subgraphFromObject,METH_VARARGS, "subgraphFromObject(object) -> Node\n\n" diff --git a/src/Main/MainGui.cpp b/src/Main/MainGui.cpp index e3019495e2..6152930a29 100644 --- a/src/Main/MainGui.cpp +++ b/src/Main/MainGui.cpp @@ -202,7 +202,11 @@ int main( int argc, char ** argv ) "Python version information:\n%4\n") .arg(appName).arg(QString::fromUtf8(e.what())) #if PY_MAJOR_VERSION >= 3 +#if PY_MINOR_VERSION >= 5 .arg(QString::fromUtf8(Py_EncodeLocale(Py_GetPath(),NULL))).arg(QString::fromLatin1(Py_GetVersion())); +#else + .arg(QString::fromUtf8(_Py_wchar2char(Py_GetPath(),NULL))).arg(QString::fromLatin1(Py_GetVersion())); +#endif #else .arg(QString::fromUtf8(Py_GetPath())).arg(QString::fromLatin1(Py_GetVersion())); #endif