PythonQt icon indicating copy to clipboard operation
PythonQt copied to clipboard

exclude webkit at all

Open gambr opened this issue 9 years ago • 30 comments

Hi All, I found that there is a fix to exclude webkit with Qt5 static libraries. In my case I don't use Qt static libraries but I don't need webkit either. So, wouldn't be a better implementation to have a USE_WEBKIT variable so exclude webkit? So that building with USE_WEBKIT = false webkit is skipped even with non static Qt? The Qt5 static libraries case would set that variable properly also.

Moreover I'm not sure the actual PythonQt_QtAll.pro configuration file handles the webkit exclusion with static Qt5 correctly.

Regards, Gianni

gambr avatar Mar 24 '16 13:03 gambr

I modified locally

PythonQt_QtAll.pro

to handle QT_STATIC as env variable like follows:

QT_STATIC = $$(QT_STATIC) QT += gui svg sql network xml xmlpatterns opengl isEmpty(QT_STATIC) { QT += webkit }

It seems working. If you like to open a pull request then I can do it.

Regards, Gianni

gambr avatar Mar 24 '16 15:03 gambr

At least the reason why i maintain my fork of this fork is the use of CMake instead of qmake and i think that @Orochimarufan also doesn’t maintain the qmake files. So if you want to submit a pull request for an webkit opt-out option, please do so for the CMake files.

Optiligence avatar Mar 24 '16 15:03 Optiligence

OK, but then remove all the stuff related to qmake then (at least *.pro/pri/prf and createSolution.bat). Anyway I used qmake because cmake gives a bunch of errors.

gambr avatar Mar 24 '16 15:03 gambr

I left it in, so it is easier to merge when upstream does changes to it. If you have problems with the CMake setup, ask about it, that’s nearly the only thing i did for this project.

Optiligence avatar Mar 24 '16 15:03 Optiligence

Hi Norbert, I have to modify something to make qt webkit optional. So I would like to understand why you made a fork of pythonqt instead of collaborating to the pythonqt project and update that code instead. Moreover I would like to know if this fork is aligned with which version of pythonqt (3.0, trunk ...?).

Regards, Gianni

gambr avatar Apr 04 '16 07:04 gambr

Hi, anyway this is the error I get:

PythonQt.cpp D:\3rd_party\pythonqt\PythonQt-master\src\PythonQt.cpp(857) : error C2121: '#' : invalid character : possibly the result of a macro expansion D:\3rd_party\pythonqt\PythonQt-master\src\PythonQt.cpp(857) : error C2065: 'endif' : undeclared identifier D:\3rd_party\pythonqt\PythonQt-master\src\PythonQt.cpp(857) : error C2146: syntax error : missing ')' before identifier 'PyObject_GetAttrString' D:\3rd_party\pythonqt\PythonQt-master\src\PythonQt.cpp(857) : error C2059: syntax error : ')' D:\3rd_party\pythonqt\PythonQt-master\src\PythonQt.cpp(2201) : fatal error C1070: mismatched #if/#endif pair in file 'd:\3rd_party\pythonqt\pythonqt-master\src\pythonqt.cpp' NMAKE : fatal error U1077: 'C:\PROGRA~2\MICROS~2.0\VC\bin\X86_AM~1\cl.exe' : return code '0x2' Stop.

And here is the recipe I used:

%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"" x86_amd64 set PATH=C:\Program Files (x86)\CMake\bin;%PATH% cd D:\3rd_party\pythonqt\PythonQt-master\build.qt560_no_icu.win.debug cmake -DCMAKE_BUILD_TYPE=Debug -DPYTHON_INCLUDE_DIR:PATH="L:\3rd_party\python\Python-2.7.8\win64\include" -DPYTHON_LIBRARY:PATH="L:\3rd_party\python\Python-2.7.8\win64\libs\python27_d.lib" -DDESIRED_QT_VERSION:STRING="5" -DCMAKE_PREFIX_PATH:PATH="D:\3rd_party\qt\qt-everywhere-enterprise-src-5.6.0_no_icu\install" -DQT_EXCLUDE_WEBKIT:BOOL=1 -G "NMake Makefiles" .. nmake

gambr avatar Apr 04 '16 16:04 gambr

This error has nothing to do with CMake, it tries to use the #endif as macro argument. First time trying to build PythonQt with vc for me, I used the following changes:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9b42831..63010f8 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,8 @@
 project(PythonQt)
 cmake_minimum_required(VERSION 2.8.10)

+#set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wa,-mbig-obj")
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj")
 set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})

 #-----------------------------------------------------------------------------
diff --git a/src/PythonQt.cpp b/src/PythonQt.cpp
index 794b230..477c177 100644
--- a/src/PythonQt.cpp
+++ b/src/PythonQt.cpp
@@ -850,11 +850,10 @@ QVariant PythonQt::evalCode(PyObject* object, PyObject* pycode) {
       dict = PyObject_GetAttrString(object, "__dict__");
       globals = PyObject_GetAttrString(PyImport_ImportModule(
 #ifdef PY3K
-                                         PyUnicode_AsUTF8(
+                                         PyUnicode_AsUTF8(PyObject_GetAttrString(object, "__module__"))),"__dict__");
 #else
-                                         PyString_AS_STRING(
+                                         PyString_AS_STRING(PyObject_GetAttrString(object, "__module__"))),"__dict__");
 #endif
-                                           PyObject_GetAttrString(object, "__module__"))),"__dict__");
     }
     PyObject* r = NULL;
     if (dict) {

Optiligence avatar Apr 04 '16 21:04 Optiligence

To disable Qt5WebKit you can comment line 8 and 9 in extensions/PythonQt_QtAll/CMakeLists.txt. I’m not sure if it is that helpful to make the list of modules a non-internal cache variable.

The fork was created (as the description states) because it added Qt5 and Python3 support as well as an improved CMake build system, things upstream didn’t want to support back then. Only the Qt5 support has been added officially since. I just couldn’t get myself to start a conversation to pull the rest of the changes. (I want to build and run the PythonQt generator from CMake, something I haven’t taken to time to do so)

I irregularly merge upstream, so it doesn’t track any release, but also not trunk. (r403 at the moment, which is a few commits after v3.0)

Optiligence avatar Apr 04 '16 22:04 Optiligence

"This error has nothing to do with CMake, it tries to use the #endif as macro argument. " I'm not saying the problem in strictly related to CMake but I don't have that issue building with qmake (yes, qmake) the official PythonQt3.0.

gambr avatar Apr 05 '16 06:04 gambr

"To disable Qt5WebKit you can comment line 8 and 9 in extensions/PythonQt_QtAll/CMakeLists.txt. " I already changed that file in a different way. You can see a QT_EXCLUDE_WEBKIT:BOOL=1 in my cmake command line. That option excludes the webkit and here are my modifications:

extensions\PythonQt_QtAll\PythonQt_QtAll.cpp use #ifndef QT_EXCLUDE_WEBKIT instead of #ifndef QT_STATIC

extensions\PythonQt_QtAll\CMakeLists.txt if(NOT QT_STATIC)#WebKit is not available in static builds set(QT_EXCLUDE_WEBKIT) endif() if(NOT QT_EXCLUDE_WEBKIT) set(QT ${QT} WebKit) set(WebKitWidgets WebKitWidgets) endif()

QT_STATIC is not the same as "exclude webkit". QT_STATIC means use static Qt and use that define to exclude webkit seems a trick.

gambr avatar Apr 05 '16 07:04 gambr

In the meanwhile I can say your modifications on "src/PythonQt.cpp" work fine, thanks. But the lines you added to PythonQtImporter.cpp wrt the official 3.0 version does not work. Here is the error:

PythonQtImporter.cpp D:\3rd_party\pythonqt\PythonQt-master\src\PythonQtImporter.cpp(356) : error C2065: 'PyExc_FileNotFoundError' : undeclared identifier

gambr avatar Apr 05 '16 07:04 gambr

The python version I use is 2.7 so I surrounded PythonQtImporter_get_data implementation with "ifdef PY3K" and nmake built correctly the static libs. Now I need shared libraries. And in debug mode I have the following error.

[ 93%] Linking CXX shared library Qt5Python27_d.dll LINK : fatal error LNK1104: cannot open file 'python27.lib'

I set the "python27_d.lib" in PYTHON_LIBRARY for cmake but it seems the release version of python library is used.

gambr avatar Apr 05 '16 09:04 gambr

While in release mode, trying to build shared libraries, with the same option and python27.lib in release mode I get a different error:

[ 93%] Linking CXX shared library Qt5Python27.dll Creating library Qt5Python27.lib and object Qt5Python27.exp PythonQt.cpp.obj : error LNK2019: unresolved external symbol "void __cdecl PythonQt_init_QtGuiBuiltin(struct _object *)" (?PythonQt_init_QtGuiBuiltin@@YAXPEAU_object@@@Z) referenced in function "public: static void __cdecl PythonQt::init(int,class QByteArray const &)" (?init@PythonQt@@SAXHAEBVQByteArray@@@Z) PythonQt.cpp.obj : error LNK2019: unresolved external symbol "void __cdecl PythonQt_init_QtCoreBuiltin(struct _object *)" (?PythonQt_init_QtCoreBuiltin@@YAXPEAU_object@@@Z) referenced in function "public: static void __cdecl PythonQt::init(int,class QByteArray const &)" (?init@PythonQt@@SAXHAEBVQByteArray@@@Z) Qt5Python27.dll : fatal error LNK1120: 2 unresolved externals

gambr avatar Apr 05 '16 09:04 gambr

I realized a couple of errors related to release mode build. First of all I use Qt 5.6.0, so I had to modify CMakeLists.txt to add the proper Qt version: if("${generated_cpp_suffix}" STREQUAL "_55" OR "${generated_cpp_suffix}" STREQUAL "_56")

Then I'm not sure the "#ifndef QT_STATIC" precompiler statement works correctly in "extensions\PythonQt_QtAll\PythonQt_QtAll.cpp". AFAIK to pass that define from cmake to the source code an add_definitions() cmake command should be required in CMakeLists.txt

gambr avatar Apr 05 '16 11:04 gambr

Yes.

Qt5WebKit also has to be disabled in the code and if Qt5.6 is used, it needs to be told to also use the wrappers for Qt5.4. see http://pastebin.com/KqY3i4SQ This successfully builds all combinations (debug/release, static/shared), but no guarantee it will actually work.

I’m happy to get it tested, so i’m just curious: why use this fork, if the official PythonQt built with qmake and you don’t use Python3 or want CMake? I still build without the latest commit to PythonQtImporter.cpp. There is a python27_d.lib? I don’t have this.

Optiligence avatar Apr 05 '16 11:04 Optiligence

QT_STATIC is defined by Qt itself. If the used modules are going to be modular (user configurable), CMake must add defines for each of them.

Optiligence avatar Apr 05 '16 11:04 Optiligence

We want to add the pythonQt build in out build system and cmake is fine. I built with qmake just to make a test. We don't like to use qmake in out build system.

gambr avatar Apr 05 '16 11:04 gambr

"QT_STATIC is defined by Qt itself." Honestly I didn't get. I have Qt already built and I understand the CMakeList.txt uses QT_STATIC so I think it must be passed to cmake as option. But in this case if there isn't an add_definitions() to pass it to the source code then "#ifndef QT_STATIC" would be always add the containing piece of code.

gambr avatar Apr 05 '16 12:04 gambr

I just pushed a fix for PythonQtImporter.get_data 313404399e5d564aac230c108bcc1cad56dab16e

Orochimarufan avatar Apr 05 '16 12:04 Orochimarufan

"There is a python27_d.lib? I don’t have this." Well, anybody can build a python library on their own. Anyway, if I pass "-DPYTHON_LIBRARY:PATH="L:\3rd_party\python\Python-2.7.8\win64\libs\python27_d.lib"" to cmake then I expect that lib is used to link. Does it make sense?

gambr avatar Apr 05 '16 12:04 gambr

Yeah, but it populates PYTHON_LIBRARIES and if it was found successfully before, it may contain the previous value of PYTHON_LIBRARY. It should work if you set it at your first CMake run.

Optiligence avatar Apr 05 '16 12:04 Optiligence

If understood correctly I can say I build out of source and I clean the build dir before running cmake. When I run cmake I read as follows:

-- Found PythonLibs: L:/3rd_party/python/Python-2.7.8/win64/libs/python27_d.lib (found suitable version "2.7.8", minimum required is "2.6") -- Building Qt5Python27 + Qt5Python27_QtAll (shared Qt 5.6.0 + Python 2.7.8 | Debug | Shared) -- Configuring done -- Generating done -- Build files have been written to: D:/3rd_party/pythonqt/PythonQt-master/build.qt560_no_icu.win.debug

But then running nmake I get the error:

[ 31%] Linking CXX shared library Qt5Python27_d.dll LINK : fatal error LNK1104: cannot open file 'python27.lib'

gambr avatar Apr 05 '16 12:04 gambr

try cleaning the CMakeCache (in the gui or remove the .txt file in the build dir) and build again it just prints the content of PYTHON_LIBRARY and it has to get the python27.lib from somewhere

Optiligence avatar Apr 05 '16 12:04 Optiligence

I removed completly the build dir where CMakeCache.txt and all other generated files are located (I perform an "out of source" build). I removed a path to a python installation from %PATH% env variable. I run cmake and then nmake but I always get the same error in debug mode. On the contrary the release mode works fine.

gambr avatar Apr 05 '16 13:04 gambr

Then print all the variables set by FindPythonLibs.cmake in your CMake installation to find out what happens.

Optiligence avatar Apr 05 '16 13:04 Optiligence

I added both "-DPYTHON_DEBUG_LIBRARY" and "-DPYTHON_LIBRARY" to cmake command line and here is the list of variables. The build problem in debug mode is not solved.

-- PYTHONLIBS_FOUND=TRUE -- PYTHONLIBS_VERSION_STRING=2.7.8 -- PYTHON_DEBUG_LIBRARIES=L:/3rd_party/python/Python-2.7.8/win64/libs/python27_d.lib -- PYTHON_DEBUG_LIBRARY=L:/3rd_party/python/Python-2.7.8/win64/libs/python27_d.lib -- PYTHON_INCLUDE_DIR=L:/3rd_party/python/Python-2.7.8/win64/include -- PYTHON_INCLUDE_DIRS=L:/3rd_party/python/Python-2.7.8/win64/include -- PYTHON_INCLUDE_PATH=L:/3rd_party/python/Python-2.7.8/win64/include -- PYTHON_LIBRARIES=optimized;L:/3rd_party/python/Python-2.7.8/win64/libs/python27.lib;debug;L:/3rd_party/python/Python-2.7.8/win64/libs/python27_d.lib -- PYTHON_LIBRARY=optimized;L:/3rd_party/python/Python-2.7.8/win64/libs/python27.lib;debug;L:/3rd_party/python/Python-2.7.8/win64/libs/python27_d.lib -- PYTHON_LIBRARY=optimized;L:/3rd_party/python/Python-2.7.8/win64/libs/python27.lib;debug;L:/3rd_party/python/Python-2.7.8/win64/libs/python27_d.lib -- PYTHON_LIBRARY_DEBUG=L:/3rd_party/python/Python-2.7.8/win64/libs/python27_d.lib -- PYTHON_LIBRARY_DEBUG=L:/3rd_party/python/Python-2.7.8/win64/libs/python27_d.lib -- PYTHON_LIBRARY_RELEASE=L:/3rd_party/python/Python-2.7.8/win64/libs/python27.lib -- PYTHON_LIBRARY_RELEASE=L:/3rd_party/python/Python-2.7.8/win64/libs/python27.lib -- PythonLibs_FOUND=TRUE -- PythonQtAll=ON -- PythonQt_BINARY_DIR=D:/3rd_party/pythonqt/PythonQt-master/build.qt560_no_icu.win.debug -- PythonQt_DEBUG=OFF -- PythonQt_Python=OFF -- PythonQt_Python3=OFF -- PythonQt_Python3=OFF -- PythonQt_Qt5=ON -- PythonQt_SOURCE_DIR=D:/3rd_party/pythonqt/PythonQt-master -- PythonQt_VERSION=2.3.0

gambr avatar Apr 06 '16 07:04 gambr

I also tried to add "-DPythonQt_DEBUG=ON" to cmake command line and I get the build error:

PythonQtClassInfo.cpp D:\3rd_party\pythonqt\PythonQt-master\src\PythonQtClassInfo.cpp(287) : error C2227: left of '->constData' must point to class/struct/union/generic type type is 'const char *'

I think that "meta->className()" is enough in this case since it already returns a "const char*"

gambr avatar Apr 06 '16 08:04 gambr

There is also a syntax error:

PythonQtMethodInfo.cpp D:\3rd_party\pythonqt\PythonQt-master\src\PythonQtMethodInfo.cpp(53) : error C2059: syntax error : ')'

It seems nobody have ever built with this option then ...

gambr avatar Apr 06 '16 08:04 gambr

python uses auto linking with vc, so the CMake settings sadly don’t matter: from pyconfig.h

#           ifdef _DEBUG
#               pragma comment(lib,"python27_d.lib")
#           else
#               pragma comment(lib,"python27.lib")
#           endif /* _DEBUG */

and PythonQt abuses it (maybe rightly so, because the debug lib doesn’t exist in the official distribution): from PythonQtPythonInclude.h

// If PYTHONQT_USE_RELEASE_PYTHON_FALLBACK is enabled, try to link
// release Python DLL if it is available by undefining _DEBUG while
// including Python.h

So remove the definition of PYTHONQT_USE_RELEASE_PYTHON_FALLBACK from the top level CMake file and it will link to python27_d.lib in debug mode

It seems nobody have ever built with this option then ...

Ever is a bit of a stretch, if it’s rarely used, errors will sneak in, thx for testing.

Optiligence avatar Apr 06 '16 11:04 Optiligence

Thanks for the help! Now I can generate both debug and release libraries.

gambr avatar Apr 08 '16 10:04 gambr