From cb582d68ebf4ec7a32e8685fa2dc5950aa7175fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simo=20F=C3=A4lt?= Date: Mon, 2 Jul 2018 14:55:41 +0300 Subject: Make sure used pip is up to date Change-Id: I2ba91f259d3f6db9f2d4a169ac103b4b8f2333b6 Reviewed-by: Friedemann Kleint Reviewed-by: Christian Tismer --- coin_build_instructions.py | 2 +- coin_test_instructions.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coin_build_instructions.py b/coin_build_instructions.py index d094d5b2a..1f84ac065 100644 --- a/coin_build_instructions.py +++ b/coin_build_instructions.py @@ -101,7 +101,7 @@ def call_setup(python_ver): rmtree(_env, True) run_instruction(["virtualenv", "-p", _pExe, _env], "Failed to create virtualenv") - install_pip_dependencies(env_pip, ["numpy", "setuptools", "sphinx", "six"]) + install_pip_dependencies(env_pip, ["pip", "numpy", "setuptools", "sphinx", "six"]) install_pip_wheel_package(env_pip) cmd = [env_python, "-u", "setup.py"] diff --git a/coin_test_instructions.py b/coin_test_instructions.py index f31c35e59..2a42ec677 100644 --- a/coin_test_instructions.py +++ b/coin_test_instructions.py @@ -68,7 +68,7 @@ def call_testrunner(python_ver, buildnro): _pExe, _env, env_pip, env_python = get_qtci_virtualEnv(python_ver, CI_HOST_OS, CI_HOST_ARCH, CI_TARGET_ARCH) rmtree(_env, True) run_instruction(["virtualenv", "-p", _pExe, _env], "Failed to create virtualenv") - install_pip_dependencies(env_pip, ["numpy", "PyOpenGL", "setuptools", "six", "pyinstaller"]) + install_pip_dependencies(env_pip, ["pip", "numpy", "PyOpenGL", "setuptools", "six", "pyinstaller"]) install_pip_wheel_package(env_pip) cmd = [env_python, "testrunner.py", "test", "--blacklist", "build_history/blacklist.txt", -- cgit v1.2.3 From b3c9889b1d3cde3eeb25db62b3521e37f5e2bd23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simo=20F=C3=A4lt?= Date: Wed, 8 May 2019 10:19:06 +0300 Subject: Revert "COIN: Skip doc build for Python 2" This reverts commit f02d84ea7953efbbd10f9823b461b3d473efc89e. OpenSuse Sphinx issue is now solved. Change-Id: I3408b85b71ca7c1ef18eab4b6eef5cd6599a9ae0 Reviewed-by: Christian Tismer --- coin_build_instructions.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/coin_build_instructions.py b/coin_build_instructions.py index 1f84ac065..9a7d6272c 100644 --- a/coin_build_instructions.py +++ b/coin_build_instructions.py @@ -116,8 +116,6 @@ def call_setup(python_ver): "--verbose-build"] if python_ver == "3": cmd += ["--limited-api=yes"] - else: - cmd += ["--skip-docs"] # 1.4.2019: errors in sphinx_build on openSUSE 4.2 if is_snapshot_build(): cmd += ["--snapshot-build"] -- cgit v1.2.3 From dc14eba3040b24f538b7fce93a463d1f0a511bc4 Mon Sep 17 00:00:00 2001 From: Christian Tismer Date: Fri, 10 May 2019 14:04:14 +0200 Subject: Fix Shiboken.ObjectType.__new__ for Python 2.7 V2 The original change gave assertion errors and had to be replaced. We now change the heap type flag temporarily in the call to Shiboken.ObjectType.__new__ and restore it afterwards. Change-Id: Ib15ecf2882739dc47db742c2a79e6269cdbb94b6 Fixes: PYSIDE-816 Fixes: PYSIDE-1003 Reviewed-by: Friedemann Kleint --- sources/shiboken2/libshiboken/basewrapper.cpp | 99 ++++++++++++++++++++++++--- 1 file changed, 88 insertions(+), 11 deletions(-) diff --git a/sources/shiboken2/libshiboken/basewrapper.cpp b/sources/shiboken2/libshiboken/basewrapper.cpp index 6ea793a79..faaca5e4b 100644 --- a/sources/shiboken2/libshiboken/basewrapper.cpp +++ b/sources/shiboken2/libshiboken/basewrapper.cpp @@ -94,6 +94,92 @@ static PyType_Spec SbkObjectType_Type_spec = { }; +#if PY_VERSION_HEX < 0x03000000 +/***************************************************************************** + * + * PYSIDE-816: Workaround for Python 2.7 + * + * This is an add-on for function typeobject.c:tp_new_wrapper from Python 2.7 . + * Problem: + * In Python 3.X, tp_new_wrapper uses this check: + + while (staticbase && (staticbase->tp_new == slot_tp_new)) + + * In Python 2.7, it uses this, instead: + + while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE)) + + * The problem is that heap types have this unwanted dependency. + * But we cannot get at static slot_tp_new, and so we have to use + * the original function and patch Py_TPFLAGS_HEAPTYPE away during the call. + */ + +static PyCFunction old_tp_new_wrapper = nullptr; + +static PyObject * +tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds) +{ + PyTypeObject *type = reinterpret_cast(self); + Py_ssize_t orig_flags = type->tp_flags; + type->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; + PyObject *ret = reinterpret_cast(old_tp_new_wrapper)(self, args, kwds); + type->tp_flags = orig_flags; + return ret; +} + +// This is intentionally the new docstring of Python 3.7 . +static struct PyMethodDef tp_new_methoddef[] = { + {"__new__", (PyCFunction)tp_new_wrapper, METH_VARARGS|METH_KEYWORDS, + PyDoc_STR("__new__($type, *args, **kwargs)\n--\n\n" + "Create and return a new object. " + "See help(type) for accurate signature.")}, + {0} +}; + +static int +get_old_tp_new_wrapper(void) +{ + // We get the old tp_new_wrapper from any initialized type. + PyTypeObject *type = &PyType_Type; + PyObject *dict = type->tp_dict; + PyObject *key, *func = nullptr; + Py_ssize_t pos = 0; + while (PyDict_Next(dict, &pos, &key, &func)) { + char *name = PyString_AsString(key); + if (strcmp(name, "__new__") == 0) { + break; + } + } + if (func == nullptr) + return -1; + PyCFunctionObject *pycf_ob = reinterpret_cast(func); + old_tp_new_wrapper = pycf_ob->m_ml->ml_meth; + return 0; +} + +static int +add_tp_new_wrapper(PyTypeObject *type) +{ + // get the original tp_new_wrapper + if (old_tp_new_wrapper == nullptr && get_old_tp_new_wrapper() < 0) + return -1; + // initialize tp_dict + if (type->tp_dict == nullptr) + type->tp_dict = PyDict_New(); + if (type->tp_dict == nullptr) + return -1; + PyObject *ob_type = reinterpret_cast(type); + Shiboken::AutoDecRef func(PyCFunction_New(tp_new_methoddef, ob_type)); + if (func.isNull()) + return -1; + if (PyDict_SetItemString(type->tp_dict, "__new__", func)) + return -1; + return 0; +} +/*****************************************************************************/ +#endif // PY_VERSION_HEX < 0x03000000 + + PyTypeObject *SbkObjectType_TypeF(void) { static PyTypeObject *type = nullptr; @@ -102,13 +188,8 @@ PyTypeObject *SbkObjectType_TypeF(void) PepHeapType_SIZE + sizeof(SbkObjectTypePrivate); type = reinterpret_cast(PyType_FromSpec(&SbkObjectType_Type_spec)); #if PY_VERSION_HEX < 0x03000000 - // PYSIDE-816: Python 2.7 has a bad check for Py_TPFLAGS_HEAPTYPE in - // typeobject.c func tp_new_wrapper. In Python 3 it was updated after - // the transition to the new type API, but not in 2.7 . Fortunately, - // the types did not change much when transitioning to heaptypes. We - // pretend that this type is a normal type in 2.7 and hope that this - // has no bad effect. - type->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; + if (add_tp_new_wrapper(type) < 0) + return nullptr; #endif } return type; @@ -299,10 +380,6 @@ void SbkObjectTypeDealloc(PyObject* pyObj) SbkObjectTypePrivate *sotp = PepType_SOTP(pyObj); PyTypeObject *type = reinterpret_cast(pyObj); -#if PY_VERSION_HEX < 0x03000000 - // PYSIDE-816: Restore the heap type flag. Better safe than sorry. - type->tp_flags |= Py_TPFLAGS_HEAPTYPE; -#endif PyObject_GC_UnTrack(pyObj); #ifndef Py_LIMITED_API Py_TRASHCAN_SAFE_BEGIN(pyObj); -- cgit v1.2.3 From de29b5ddca038393256a1cdc4a3e7c1eee129d2d Mon Sep 17 00:00:00 2001 From: Christian Tismer Date: Tue, 16 Apr 2019 18:50:14 +0200 Subject: Add Some Hints For Dealing With PyInstaller PyInstaller has a bug when multiple versions are installed. There are also some other traps which can give additional trouble. The "--reuse-build" problems have vanished meanwhile and were removed. The numpy problem with Python 2.7.16 was added. Change-Id: I6c60d8ee823963b59fc6b65a6ab8007314e4098c Reviewed-by: Friedemann Kleint --- sources/pyside2/doc/deployment-pyinstaller.rst | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/sources/pyside2/doc/deployment-pyinstaller.rst b/sources/pyside2/doc/deployment-pyinstaller.rst index 8e6a76052..f361daf4a 100644 --- a/sources/pyside2/doc/deployment-pyinstaller.rst +++ b/sources/pyside2/doc/deployment-pyinstaller.rst @@ -122,3 +122,52 @@ an executable inside the `dist/` directory that you can execute:: cd dist/ ./MyApplication + + +Current Caveats To Be Aware Of +============================== + + +PyInstaller Problem +------------------- + +As already mentioned, `PyInstaller` will pick a system installation of PySide2 or +Shiboken2 instead of your virtualenv version without notice, if it exists. +This may be no problem if those PySide2 or shiboken2 versions are the same. + +If you are working with different versions, this can result in frustrating sessions, +when you think you are testing a new version, but `PyInstaller` +is silently working with a different, older version. + + +Problem with numpy in Python 2.7.16 +----------------------------------- + +A recent problem of PyInstaller is the appearance of Python 2.7.16 . +This Python version creates a problem that is known from Python 3 as a `Tcl/Tk` problem. +This does rarely show up in Python 3 because `Tcl/Tk` is seldom used with `PyInstaller. + +On Python 2.7.16, this problem is very much visible, since many people are using numpy. +For some reason, installing `numpy` creates a dependency of `Tcl/Tk`, which can +be circumvented only by explicitly excluding `Tcl/Tk` related things by adding +this line to the analysis section of the spec-file:: + + excludes=['FixTk', 'tcl', 'tk', '_tkinter', 'tkinter', 'Tkinter'], + + +Safety Instructions +------------------- + +o When using `PyInstaller` with `virtualenv`, make sure that there is no system + installation of PySide2 or shiboken2. + +o Before compiling, use `pip -uninstall pyside2 shiboken2 -y` multiple times, until + none of the programs is found anymore. + +o Pip is usually a good tool. But to be 100 % sure, you should directly remove + the PySide2 and shiboken2 folders from site-packages. + +o Be sure to use the right version of pip. The safest way to really run the right + pip, use the Python that you mean: Instead of the pip command, better use:: + + python -m pip -- cgit v1.2.3 From 8689054da961be4cede5cfae7c6a6f9d6efc36a4 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Tue, 14 May 2019 11:21:46 +0200 Subject: Fix pyi generation on Windows When trying to generate the pyi files on Windows, the python modules failed to be imported due to Qt dlls not being in PATH. This happened because we overrode PATH instead of prepending to it. When generating pyi files on Windows, make sure to prepend new values to PATH while also keeping the old values. Amends 97df448edbc035a2f531508a5cfe5739fb2de18d Change-Id: I74c374c3a9687169dd4af0ed232bda76a0267fc4 Reviewed-by: Christian Tismer --- sources/pyside2/cmake/Macros/PySideModules.cmake | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sources/pyside2/cmake/Macros/PySideModules.cmake b/sources/pyside2/cmake/Macros/PySideModules.cmake index cbf401102..77dc8c8ac 100644 --- a/sources/pyside2/cmake/Macros/PySideModules.cmake +++ b/sources/pyside2/cmake/Macros/PySideModules.cmake @@ -169,6 +169,19 @@ macro(create_pyside_module) set(ld_prefix "LD_LIBRARY_PATH=") endif() set(ld_prefix "${ld_prefix}${pysidebindings_BINARY_DIR}/libpyside${PATH_SEP}${SHIBOKEN_SHARED_LIBRARY_DIR}") + + # On Windows we also need to propagate the whole environment PATH value, because pyside modules + # import Qt, and the Qt modules are found from PATH. + if(WIN32) + # Get the value of PATH with CMake separators. + file(TO_CMAKE_PATH "$ENV{PATH}" path_value) + + # Replace the CMake list separators with "\;"s, to avoid the PATH values being + # interpreted as CMake list elements, we actually want to pass the whole string separated + # by ";" to the command line. + make_path(path_value "${path_value}") + string(APPEND ld_prefix "${PATH_SEP}${path_value}") + endif() set(generate_pyi_options run --skip --sys-path "${pysidebindings_BINARY_DIR}" "${SHIBOKEN_PYTHON_MODULE_DIR}") -- cgit v1.2.3