{ lib , stdenv , buildPythonPackage , setuptools , isPy27 , fetchPypi , pkg-config , dbus , lndir , dbus-python , sip , pyqt5_sip , pyqt-builder , libsForQt5 , enableVerbose ? true , withConnectivity ? false , withMultimedia ? false , withWebKit ? false , withWebSockets ? false , withLocation ? false , withSerialPort ? false , withTools ? false , pkgsBuildTarget , buildPackages , dbusSupport ? !stdenv.isDarwin }: buildPythonPackage rec { pname = "PyQt5"; version = "5.15.9"; format = "pyproject"; disabled = isPy27; src = fetchPypi { inherit pname version; hash = "sha256-3EHoQBqQ3D4raStBG9VJKrVZrieidCTu1L05FVZOxMA="; }; patches = [ # Fix some wrong assumptions by ./project.py # TODO: figure out how to send this upstream ./pyqt5-fix-dbus-mainloop-support.patch # confirm license when installing via pyqt5_sip ./pyqt5-confirm-license.patch ]; postPatch = # be more verbose '' cat >> pyproject.toml < PyQt_PrintDialog # QT_NO_PRINTER => PyQt_Printer # QT_NO_PRINTPREVIEWDIALOG => PyQt_PrintPreviewDialog # QT_NO_PRINTPREVIEWWIDGET => PyQt_PrintPreviewWidget # QT_NO_SSL => PyQt_SSL # QT_SHARED || QT_DLL => shared (otherwise static) # QT_NO_PROCESS => PyQt_Process # QT_NO_FPU || Q_PROCESSOR_ARM || Q_OS_WINCE => PyQt_qreal_double # sizeof (qreal) != sizeof (double) => PyQt_qreal_double # !Q_COMPILER_CONSTEXPR !Q_COMPILER_UNIFORM_INIT => PyQt_CONSTEXPR # QT_NO_ACCESSIBILITY => PyQt_Accessibility # QT_NO_OPENGL => PyQt_OpenGL PyQt_Desktop_OpenGL # defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2) || defined(QT_OPENGL_ES_3) => PyQt_Desktop_OpenGL # QT_NO_RAWFONT => PyQt_RawFont # QT_NO_SESSIONMANAGER => PyQt_SessionManager # + lib.optionalString (!(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) '' rm config-tests/cfgtest_QtCore.cpp rm config-tests/cfgtest_QtGui.cpp rm config-tests/cfgtest_QtNetwork.cpp rm config-tests/cfgtest_QtPrintSupport.cpp ''; enableParallelBuilding = true; # HACK: paralellize compilation of make calls within pyqt's setup.py # pkgs/stdenv/generic/setup.sh doesn't set this for us because # make gets called by python code and not its build phase # format=pyproject means the pip-build-hook hook gets used to build this project # pkgs/development/interpreters/python/hooks/pip-build-hook.sh # does not use the enableParallelBuilding flag postUnpack = '' export MAKEFLAGS+="''${enableParallelBuilding:+-j$NIX_BUILD_CORES}" ''; # tons of warnings from subpackages, no point in playing whack-a-mole env = lib.optionalAttrs (!enableVerbose) { NIX_CFLAGS_COMPILE = "-w"; }; outputs = [ "out" "dev" ]; dontWrapQtApps = true; nativeBuildInputs = [ pkg-config ] ++ lib.optionals (stdenv.buildPlatform == stdenv.hostPlatform) [ libsForQt5.qmake ] ++ [ setuptools lndir sip ] ++ (with pkgsBuildTarget.targetPackages.libsForQt5; [ ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ qmake ] ++ [ qtbase qtsvg qtdeclarative qtwebchannel ] ++ lib.optional withConnectivity qtconnectivity ++ lib.optional withMultimedia qtmultimedia ++ lib.optional withWebKit qtwebkit ++ lib.optional withWebSockets qtwebsockets ++ lib.optional withLocation qtlocation ++ lib.optional withSerialPort qtserialport ++ lib.optional withTools qttools ); buildInputs = with libsForQt5; [ dbus ] ++ lib.optionals (stdenv.buildPlatform == stdenv.hostPlatform) [ qtbase ] ++ [ qtsvg qtdeclarative pyqt-builder ] ++ lib.optional withConnectivity qtconnectivity ++ lib.optional withWebKit qtwebkit ++ lib.optional withWebSockets qtwebsockets ++ lib.optional withLocation qtlocation ++ lib.optional withSerialPort qtserialport ++ lib.optional withTools qttools ; propagatedBuildInputs = [ dbus-python pyqt5_sip ]; passthru = { inherit sip pyqt5_sip; multimediaEnabled = withMultimedia; webKitEnabled = withWebKit; WebSocketsEnabled = withWebSockets; connectivityEnabled = withConnectivity; locationEnabled = withLocation; serialPortEnabled = withSerialPort; toolsEnabled = withTools; }; dontConfigure = true; # Checked using pythonImportsCheck doCheck = false; pythonImportsCheck = [ "PyQt5" "PyQt5.QtCore" "PyQt5.QtQml" "PyQt5.QtWidgets" "PyQt5.QtGui" ] ++ lib.optional withWebSockets "PyQt5.QtWebSockets" ++ lib.optional withWebKit "PyQt5.QtWebKit" ++ lib.optional withMultimedia "PyQt5.QtMultimedia" ++ lib.optional withConnectivity "PyQt5.QtBluetooth" ++ lib.optional withLocation "PyQt5.QtPositioning" ++ lib.optional withSerialPort "PyQt5.QtSerialPort" ++ lib.optional withTools "PyQt5.QtDesigner" ; meta = with lib; { description = "Python bindings for Qt5"; homepage = "https://riverbankcomputing.com/"; license = licenses.gpl3Only; platforms = platforms.mesaPlatforms; maintainers = with maintainers; [ sander ]; }; }