ATTENTION
À l'heure actuelle (2018-12-14), la dernière étape (compilation de PyQt5 avec MinGW-64), ne fonctionne pas.

Contribuer à un projet FOSS comme PyQt5 peut en rebuter certains au vu de tout le travail à faire en amont. Voici un petit guide pour mettre en place un environnement de développement complet et isolé pour PyQt5 sous Windows .

Notes :

  1. Toute la chaîne de compilation sera faite pour un système 64-bit.
  2. J'utiliserai les versions en cours de développement (SIP, Qt5 et PyQt5), donc pensez à adapter les liens de téléchargement.

Création du virtualenv

Commencez par créer un environnement de développement sain (Python 3.6.7 pour le coup) :

C:\Python36\python.exe -m venv --clear "%USERPROFILE%\venv"

rem Cette variable sera utilisée souvent par la suite
set PYTHON=%USERPROFILE%\venv\Scripts\python.exe

rem Et ces variables seront aussi utiles, pensez à les adapter
set Qt_PATH=F:\Qt\Qt5.12.0
set MINGW_PATH=%Qt_PATH%\Tools\mingw730_64
set PATH=%QT_PATH%\5.12.0\mingw73_64\bin;%MINGW_PATH%\bin;%PATH%

Dépendance n°1/2 : Qt5

Téléchargez Qt5 : qt-opensource-windows-x86-5.12.0.exe. Lors de l'installation, cochez ces options :

  • Qt > MinGW 7.3.0 64-bit
  • Tools > MinGW 7.3.0 64-bit

Dépendance n°2/2 : SIP

Téléchargez et décompressez les sources de SIP : sip-4.19.14.dev1812031459.zip. Rendez-vous dans le dossier et :

rem Configuration
%PYTHON% configure.py ^
	--no-stubs ^
	--platform="win32-g++" ^
	CFLAGS+="-m64" ^
	DEFINES+="MS_WIN64"

rem Compilation
mingw32-make -j 2

rem Installation
mingw32-make install

Compilation de PyQt5

⚠ Malheureusement, il se trouve que cette dernière étape n'est pas encore possible. Lors du make, les symboles de Python ne seront pas trouvés :

release/qpycore_post_init.o:qpycore_post_init.cpp:(.text+0x6f): undefined reference to `__imp_PyDict_SetItemString'
release/qpycore_post_init.o:qpycore_post_init.cpp:(.text+0x158): undefined reference to `__imp_PyUnicode_FromString'
release/qpycore_post_init.o:qpycore_post_init.cpp:(.text+0x1a2): undefined reference to `__imp_PyDict_New'
release/qpycore_post_init.o:qpycore_post_init.cpp:(.text+0x206): undefined reference to `__imp__Py_Dealloc'
release/qpycore_post_init.o:qpycore_post_init.cpp:(.text+0x259): undefined reference to `__imp_Py_FatalError'
release/qpycore_post_init.o:qpycore_post_init.cpp:(.text+0x2bd): more undefined references to `__imp_Py_FatalError' follow
release/qpycore_post_init.o:qpycore_post_init.cpp:(.text+0x371): undefined reference to `__imp_PyDict_New'

Téléchargez et décompressez les sources de PyQt5 : PyQt5_gpl-5.12.dev1812081006.zip. Rendez-vous dans le dossier et :

rem Configuration
%PYTHON% configure.py ^
	--confirm-license ^
	--no-designer-plugin ^
	--no-docstrings ^
	--no-python-dbus ^
	--no-qml-plugin ^
	--no-qsci-api ^
	--no-sip-files ^
	--no-stubs ^
	--no-tools ^
   	--sip="%PYTHON_DIR%\sip.exe" ^
	--spec="win32-g++" ^
	--verbose ^
	DEFINES+="MS_WIN64" ^
	DEFINES+="_hypot=hypot" ^
	QMAKE_CXXFLAGS+="-m64"

rem Compilation
mingw32-make -j 2

rem Installation
mingw32-make install

J'ai volontairement désactivé pas mal de composants, mais vous pouvez très bien les réactiver en supprimant les ligne --no-XXX.

Tentez cette manipulation si vous rencontrez l'erreur :

...\lib\gcc\x86_64-w64-mingw32\7.3.0\include\c++\cmath:1157:11: error: '::hypot' has not been declared

Hacking

Vous pouvez maintenant améliorer le code source de PyQt. Une fois vos modifications terminées, relancez la compilation et l'installation de PyQt5.
Ré-intérez jusqu'à ce que voys ayez un patch digne de ce nom et envoyez-le via la mailing-list.