Problemas con la construcción de PyQt5 en Ubuntu 14.04

Estoy teniendo algunos problemas para construir PyQt5 en Ubuntu 14.04. Estoy trabajando con un código que tiene una fuerte dependencia de Python 2.7; por lo tanto, no puedo usar los paquetes python3 del repository de Ubuntu. Otras búsquedas en los paquetes de Ubuntu revelan que hay paquetes dev y doc para Python 2 pyqt5. Pero, nada para instalar las librerías necesarias para escribir código.

Esto me ha llevado a crear una comstackción personalizada para PyQt5. Obtuve la fuente para la versión 5.5 desde aquí: https://www.riverbankcomputing.com/software/pyqt/download5 y estoy usando sip como lo proporcionan los repositorys de Ubuntu (la instalación de kubuntu-desktop requiere sip).

Leí que es fácil tener versiones desiguales de Sip, así que hice la siguiente comprobación:

Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sip >>> print(sip, sip.SIP_VERSION_STR) (, '4.16.9') 

Y:

 $ sip -V 4.16.9 

También estoy usando las herramientas Qt5 provistas por los repositorys de Ubuntu. Esto incluyó la instalación de qtdeclarative5- * (probablemente overkill) y qt5-default. Aquí hay alguna información sobre qmake:

 qmake --version QMake version 3.0 Using Qt version 5.2.1 in /usr/lib/x86_64-linux-gnu 

Actualmente tengo PyQt4 instalado y leí en las notas de instalación que esto estaría bien siempre y cuando ambos estuvieran comstackdos con la misma versión de SIP.

Después de descargar, desempaqué el tarball e intenté construirlo de la siguiente manera:

 sudo ln -s /usr/include/python2.7 /usr/local/include/python2.7 python configure.py --sip-incdir=/usr/include/python2.7/ make 

La salida de la configuración pareció identificar la versión correcta de sip y obtengo los siguientes errores de comstackción relacionados con sip:

 make[1]: Entering directory `~/Downloads/PyQt-gpl-5.5/QtWebKit' g++ -c -m64 -pipe -fno-exceptions -O2 -Wall -W -D_REENTRANT -fPIC -DSIP_PROTECTED_IS_PUBLIC -Dprotected=public -DQT_NO_DEBUG -DQT_PLUGIN -DQT_WEBKIT_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I. -I/usr/include/python2.7 -I/usr/include/qt5 -I/usr/include/qt5/QtWebKit -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o sipQtWebKitQWebSecurityOrigin.o sipQtWebKitQWebSecurityOrigin.cpp ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: In function 'PyObject* meth_QWebSecurityOrigin_addAccessWhitelistEntry(PyObject*, PyObject*)': ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:384:9: error: 'SubdomainSetting' is not a member of 'QWebSecurityOrigin' QWebSecurityOrigin::SubdomainSetting a2; ^ ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:384:46: error: expected ';' before 'a2' QWebSecurityOrigin::SubdomainSetting a2; ^ ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:387:214: error: 'a2' was not declared in this scope if (sipParseArgs(&sipParseErr, sipArgs, "BJ1J1E", &sipSelf, sipType_QWebSecurityOrigin, &sipCpp, sipType_QString,&a0, &a0State, sipType_QString,&a1, &a1State, sipType_QWebSecurityOrigin_SubdomainSetting, &a2)) ^ ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:389:21: error: 'class QWebSecurityOrigin' has no member named 'addAccessWhitelistEntry' sipCpp->addAccessWhitelistEntry(*a0,*a1,a2); ^ ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: In function 'PyObject* meth_QWebSecurityOrigin_removeAccessWhitelistEntry(PyObject*, PyObject*)': ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:417:9: error: 'SubdomainSetting' is not a member of 'QWebSecurityOrigin' QWebSecurityOrigin::SubdomainSetting a2; ^ ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:417:46: error: expected ';' before 'a2' QWebSecurityOrigin::SubdomainSetting a2; ^ ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:420:214: error: 'a2' was not declared in this scope if (sipParseArgs(&sipParseErr, sipArgs, "BJ1J1E", &sipSelf, sipType_QWebSecurityOrigin, &sipCpp, sipType_QString,&a0, &a0State, sipType_QString,&a1, &a1State, sipType_QWebSecurityOrigin_SubdomainSetting, &a2)) ^ ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:422:21: error: 'class QWebSecurityOrigin' has no member named 'removeAccessWhitelistEntry' sipCpp->removeAccessWhitelistEntry(*a0,*a1,a2); ^ ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: In function 'void* init_type_QWebSecurityOrigin(sipSimpleWrapper*, PyObject*, PyObject*, PyObject**, PyObject**, PyObject**)': ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:477:48: error: no matching function for call to 'QWebSecurityOrigin::QWebSecurityOrigin(const QUrl&)' sipCpp = new QWebSecurityOrigin(*a0); ^ ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:477:48: note: candidates are: In file included from ~/Downloads/PyQt-gpl-5.5/sip/QtWebKit/qwebsecurityorigin.sip:26:0: /usr/include/qt5/QtWebKit/qwebsecurityorigin.h:64:5: note: QWebSecurityOrigin::QWebSecurityOrigin(QWebSecurityOriginPrivate*) QWebSecurityOrigin(QWebSecurityOriginPrivate* priv); ^ /usr/include/qt5/QtWebKit/qwebsecurityorigin.h:64:5: note: no known conversion for argument 1 from 'const QUrl' to 'QWebSecurityOriginPrivate*' /usr/include/qt5/QtWebKit/qwebsecurityorigin.h:58:5: note: QWebSecurityOrigin::QWebSecurityOrigin(const QWebSecurityOrigin&) QWebSecurityOrigin(const QWebSecurityOrigin& other); ^ /usr/include/qt5/QtWebKit/qwebsecurityorigin.h:58:5: note: no known conversion for argument 1 from 'const QUrl' to 'const QWebSecurityOrigin&' ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp: At global scope: ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:516:48: error: 'AllowSubdomains' is not a member of 'QWebSecurityOrigin' {sipName_AllowSubdomains, static_cast(QWebSecurityOrigin::AllowSubdomains), 21}, ^ ~/Downloads/PyQt-gpl-5.5/QtWebKit/sipQtWebKitQWebSecurityOrigin.cpp:517:51: error: 'DisallowSubdomains' is not a member of 'QWebSecurityOrigin' {sipName_DisallowSubdomains, static_cast(QWebSecurityOrigin::DisallowSubdomains), 21}, ^ make[1]: *** [sipQtWebKitQWebSecurityOrigin.o] Error 1 make[1]: Leaving directory `~/Downloads/PyQt-gpl-5.5/QtWebKit' make: *** [sub-QtWebKit-make_first-ordered] Error 2 

El resultado es que puedo instalar y obtener algunas de las funcionalidades que esperaría; sin embargo, me falta alguna funcionalidad requerida con los widgets WebKit. Espero haber proporcionado suficiente información para describir dónde estoy atascado. Me siento tímido de indagar en el código; sin embargo, asumo que la respuesta es en realidad mucho más simple.

¡Gracias por adelantado!

Asi que,

Comencé a buscar en el paquete fuente para el archivo que no se comstack. En el directorio sip hay un archivo sip QWebSecurityOrigin que contiene lo siguiente:

 %If (Qt_5_2_0 -) enum SubdomainSetting { AllowSubdomains, DisallowSubdomains, }; %End 

Puedo razonablemente esperar que este código se incluya a medida que qmake me dice lo siguiente:

 qmake --version QMake version 3.0 Using Qt version 5.2.1 in /usr/lib/x86_64-linux-gnu 

A continuación, quería ver el qwebsecurityorigin.h que proporcionaba Qt para ver si el error podía provenir de allí. El mío se instala aquí: /usr/include/qt5/QtWebKit/qwebsecurityorigin.h

 #ifndef _WEBSECURITYORIGIN_H_ #define _WEBSECURITYORIGIN_H_ #include  #include  #include "qwebkitglobal.h" namespace WebCore { class SecurityOrigin; class ChromeClientQt; } class QWebSecurityOriginPrivate; class QWebDatabase; class QWebFrame; class QWEBKIT_EXPORT QWebSecurityOrigin { public: static QList allOrigins(); static void addLocalScheme(const QString& scheme); static void removeLocalScheme(const QString& scheme); static QStringList localSchemes(); ~QWebSecurityOrigin(); QString scheme() const; QString host() const; int port() const; qint64 databaseUsage() const; qint64 databaseQuota() const; void setDatabaseQuota(qint64 quota); void setApplicationCacheQuota(qint64 quota); QList databases() const; QWebSecurityOrigin(const QWebSecurityOrigin& other); QWebSecurityOrigin &operator=(const QWebSecurityOrigin& other); private: friend class QWebDatabase; friend class QWebFrameAdapter; friend class WebCore::ChromeClientQt; QWebSecurityOrigin(QWebSecurityOriginPrivate* priv); private: QExplicitlySharedDataPointer d; }; 

Nota, no se define ninguna enumeración. Una búsqueda de Qt 5.5 sugiere que la enumeración debería estar allí: http://doc.qt.io/qt-5/qwebsecurityorigin.html#SubdomainSetting-enum

Finalmente, recordé que instalé libqt5webkit por separado de la mayoría de las bibliotecas Qt; Entonces, hice una verificación de versión en el paquete:

 dpkg -s libqt5webkit5 Package: libqt5webkit5 Status: install ok installed Priority: optional Section: libs Installed-Size: 34225 Maintainer: Ubuntu Developers  Architecture: amd64 Multi-Arch: same Source: qtwebkit-opensource-src Version: 5.1.1-1ubuntu8 

Esta salida es casi idéntica para el paquete dev. Por lo tanto, esto hace que aparezca como la mayor parte de la distribución de Qt5, en los repositorys, está en una versión diferente a webkit. Además, si QWebKit está en 5.1.1, explicaría por qué falta la enumeración, ya que el archivo sip parece sugerir que fue una adición en 5.2.0.

Así que mi solución fue descargar e instalar Qt 5.5 desde el sitio web de Qt usando el instalador automatizado (ejecutado con sudo, usando valores predeterminados). Luego comencé de nuevo con la fuente PyQt5 eliminando el directorio de comstackción y descomprimiendo la fuente nuevamente:

 python configure.py --sip-incdir=/usr/include/python2.7/ --qmake=/opt/Qt/5.5/gcc_64/bin/qmake make sudo make install 

Las licencias no son compatibles; sin embargo, una búsqueda rápida a través del script configure.py de pyqt5, utilizando la salida de error, puede dar una idea de cómo configurar y comstackr el código.