diff --git a/pkgs/development/python-modules/pyqt/5.x.nix b/pkgs/development/python-modules/pyqt/5.x.nix index 288f35f23524..5791299bdc12 100644 --- a/pkgs/development/python-modules/pyqt/5.x.nix +++ b/pkgs/development/python-modules/pyqt/5.x.nix @@ -1,5 +1,10 @@ { lib, fetchurl, pythonPackages, pkgconfig -, qmake, lndir, qtbase, qtsvg, qtwebengine, dbus +, dbus +, qmake, lndir +, qtbase +, qtsvg +, qtdeclarative +, qtwebchannel , withConnectivity ? false, qtconnectivity , withWebKit ? false, qtwebkit , withWebSockets ? false, qtwebsockets @@ -9,29 +14,61 @@ let inherit (pythonPackages) buildPythonPackage python isPy3k dbus-python enum34; - sip = pythonPackages.sip.override { sip-module = "PyQt5.sip"; }; + sip = (pythonPackages.sip.override { sip-module = "PyQt5.sip"; }).overridePythonAttrs(oldAttrs: { + # If we install sip in another folder, then we need to create a __init__.py as well + # if we want to be able to import it with Python 2. + # Python 3 could rely on it being an implicit namespace package, however, + # PyQt5 we made an explicit namespace package so sip should be as well. + postInstall = '' + cat << EOF > $out/${python.sitePackages}/PyQt5/__init__.py + from pkgutil import extend_path + __path__ = extend_path(__path__, __name__) + EOF + ''; + }); in buildPythonPackage rec { - pname = "PyQt"; - version = "5.11.3"; + pname = "pyqt"; + version = "5.13.0"; format = "other"; src = fetchurl { - url = "mirror://sourceforge/pyqt/PyQt5/PyQt-${version}/PyQt5_gpl-${version}.tar.gz"; - sha256 = "0wqh4srqkcc03rvkwrcshaa028psrq58xkys6npnyhqxc0apvdf9"; + url = "https://www.riverbankcomputing.com/static/Downloads/PyQt5/${version}/PyQt5_gpl-${version}.tar.gz"; + sha256 = "1ydgdz28f1v17qqz3skyv26k5l0w63fr4dncc5xm49jr2gjzznqc"; }; outputs = [ "out" "dev" ]; - nativeBuildInputs = [ pkgconfig qmake lndir sip ]; - - buildInputs = [ dbus sip ]; - - propagatedBuildInputs = [ qtbase qtsvg qtwebengine dbus-python ] - ++ lib.optional (!isPy3k) enum34 + nativeBuildInputs = [ + pkgconfig + qmake + lndir + sip + qtbase + qtsvg + qtdeclarative + qtwebchannel + ] ++ lib.optional withConnectivity qtconnectivity ++ lib.optional withWebKit qtwebkit - ++ lib.optional withWebSockets qtwebsockets; + ++ lib.optional withWebSockets qtwebsockets + ; + + buildInputs = [ + dbus + qtbase + qtsvg + qtdeclarative + ] + ++ lib.optional withConnectivity qtconnectivity + ++ lib.optional withWebKit qtwebkit + ++ lib.optional withWebSockets qtwebsockets + ; + + propagatedBuildInputs = [ + dbus-python + sip + ] ++ lib.optional (!isPy3k) enum34; patches = [ # Fix some wrong assumptions by ./configure.py @@ -39,6 +76,10 @@ in buildPythonPackage rec { ./pyqt5-fix-dbus-mainloop-support.patch ]; + passthru = { + inherit sip; + }; + configurePhase = '' runHook preConfigure @@ -62,8 +103,34 @@ in buildPythonPackage rec { for i in $out/bin/*; do wrapProgram $i --prefix PYTHONPATH : "$PYTHONPATH" done + + # Let's make it a namespace package + cat << EOF > $out/${python.sitePackages}/PyQt5/__init__.py + from pkgutil import extend_path + __path__ = extend_path(__path__, __name__) + EOF ''; + installCheckPhase = let + modules = [ + "PyQt5" + "PyQt5.QtCore" + "PyQt5.QtQml" + "PyQt5.QtWidgets" + "PyQt5.QtGui" + ] + ++ lib.optional withWebSockets "PyQt5.QtWebSockets" + ++ lib.optional withWebKit "PyQt5.QtWebKit" + ++ lib.optional withConnectivity "PyQt5.QtConnectivity" + ; + imports = lib.concatMapStrings (module: "import ${module};") modules; + in '' + echo "Checking whether modules can be imported..." + ${python.interpreter} -c "${imports}" + ''; + + doCheck = true; + enableParallelBuilding = true; meta = with lib; {