[PyQt] Problems building PyQt snapshot on Win32 with MinGW -- all details included

Martin Blais blais at furius.ca
Wed Jul 11 20:05:27 BST 2007


Hi guys

I'm having problems building PyQt4 from source using MinGW under
Windows XP. Here are the steps I went through, with detail about each
of the problems. I'm hoping this information will help you fix some of
the mess. I also hope that it will be convincing enough to make it
obvious that it is a bit painful right now.


0. - I adjusted my PATH to include C:/MinGW/bin
   - I'm running all of the code below in a Cygwin bash shell.


1. I installed Qt-4.3.0 Open Source using the .exe file from
   trolltech's website.


2. Installing sip: since there is no Windows binary available for sip,
   I downloaded the snapshot source: sip-snapshot-20070704, unzipped
   it. From there I followed the instructions::

      C:/Python25/python.exe configure.py -p win32-g++
      make  # using Cygwin's GNU make
      make install

   **ERROR**, this ``make install`` fails::

     Administrator at mblais-690-01 /cygdrive/c/tmp/sip-snapshot-20070704
     $ make install
     make[1]: Entering directory `/cygdrive/c/tmp/sip-snapshot-20070704/sipgen'
     /bin/sh: -c: line 1: syntax error: unexpected end of file
     make[1]: *** [install] Error 2
     make[1]: Leaving directory `/cygdrive/c/tmp/sip-snapshot-20070704/sipgen'
     make: *** [install] Error 2

   Workaround: I copied the files manually to the Python
   installation::

     cp sip*.py siplib/sip.pyq C:/Python25/Lib/site-packages

   ``import sip`` works from Python. So I'm moving on.


3. Installing PyQt: same, I have to use the snapshot until there is a
   release for 4.3.0.  I downloaded the snapshot (20080710), unpacked
   it, and am trying to configure it::

     $ C:/Python25/python configure.py -p win32-g++
     Determining the layout of your Qt installation...
     Error: Make sure you have a working Qt v4 qmake on your PATH or use the -q
     argument to explicitly specify a working Qt v4 qmake.


   So I look for qmake.exe in the Qt installation, and it is in
   C:/Qt/4.3.0/qmake/qmake.exe, so I do::

     $ C:/Python25/python configure.py -p win32-g++ -q
C:/Qt/4.3.0/qmake/qmake.exe -w
     Determining the layout of your Qt installation...
     C:\Qt\4.3.0\qmake\qmake.exe -o qtdirs.mk qtdirs.pro
     QMAKESPEC has not been set, so configuration cannot be deduced.
     Error processing project file: qtdirs.pro
     Error: C:\Qt\4.3.0\qmake\qmake.exe failed to create a makefile.
Make sure you
     have a working Qt v4 qmake on your PATH or use the -q argument to
explicitly
     specify a working Qt v4 qmake.


   Fine, I'll set QMAKESPEC::

     $ export QMAKESPEC="win32-g++"

   I'll set QTDIR as well::

     $ export QTDIR=C:/Qt/4.3.0

   It still fails::

     $ C:/Python25/python configure.py -p win32-g++ -q
C:/Qt/4.3.0/qmake/qmake.exe -w
     Determining the layout of your Qt installation...
     C:\Qt\4.3.0\qmake\qmake.exe -o qtdirs.mk qtdirs.pro
     Could not find mkspecs for your QMAKESPEC(win32-g++) after trying:
             C:/iwmake/build_mingw_opensource\mkspecs
     Error processing project file: qtdirs.pro
     Error: C:\Qt\4.3.0\qmake\qmake.exe failed to create a makefile.
Make sure you
     have a working Qt v4 qmake on your PATH or use the -q argument to
explicitly
     specify a working Qt v4 qmake.


   **ERROR**: How do I change the root of the ``mkspecs`` files for
   qmake? It does not seem to have an option.

   After a fair amount of searching, I find that QMAKEPATH is the
   variable that will help me here::

     $ export QMAKEPATH=C:/Qt/4.3.0


   (This needs to be document more clearly somewhere, or the problem
   needs to be fixed somehow.)


   Moving on, it still fails::

     $ C:/Python25/python configure.py -p win32-g++ -q
C:/Qt/4.3.0/qmake/qmake.exe -w
     Determining the layout of your Qt installation...
     C:\Qt\4.3.0\qmake\qmake.exe -o qtdirs.mk qtdirs.pro
     mingw32-make -f qtdirs.mk release
     mingw32-make -f qtdirs.mk.Release
     mingw32-make[1]: Entering directory
`c:/tmp/PyQt-win-gpl-4-snapshot-20070710'
     g++ -c -O2 -Wall -fno-exceptions -fno-rtti -DUNICODE
-DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_THREAD_
     ORT -DQT_NEEDS_QMAIN
-I'c:/iwmake/build_mingw_opensource/include/QtCore'
-I'c:/iwmake/build_mingw_opensource/include
     'c:/iwmake/build_mingw_opensource/include/ActiveQt' -I'release'
-I'.' -I'../../Qt/4.3.0/mkspecs/win32-g++' -o releas
     dirs.o qtdirs.cpp
     qtdirs.cpp:1:17: QFile: No such file or directory
     qtdirs.cpp:2:24: QLibraryInfo: No such file or directory
     qtdirs.cpp:3:23: QTextStream: No such file or directory
     qtdirs.cpp: In function `int main(int, char**)':
     qtdirs.cpp:7: error: `QFile' undeclared (first use this function)
     qtdirs.cpp:7: error: (Each undeclared identifier is reported only
once for each function it appears in.)
     qtdirs.cpp:7: error: expected `;' before "outf"
     qtdirs.cpp:9: error: `outf' undeclared (first use this function)
     qtdirs.cpp:9: error: `QIODevice' has not been declared
     qtdirs.cpp:9: error: `WriteOnly' undeclared (first use this function)
     qtdirs.cpp:9: error: `QIODevice' has not been declared
     qtdirs.cpp:9: error: `Truncate' undeclared (first use this function)
     qtdirs.cpp:9: error: `QIODevice' has not been declared
     qtdirs.cpp:9: error: `Text' undeclared (first use this function)
     qtdirs.cpp:12: error: `QTextStream' undeclared (first use this function)
     qtdirs.cpp:12: error: expected `;' before "out"
     qtdirs.cpp:14: error: `out' undeclared (first use this function)
     qtdirs.cpp:14: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:14: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:14: error: `PrefixPath' undeclared (first use this function)
     qtdirs.cpp:14: error: `location' undeclared (first use this function)
     qtdirs.cpp:15: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:15: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:15: error: `HeadersPath' undeclared (first use this function)
     qtdirs.cpp:16: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:16: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:16: error: `LibrariesPath' undeclared (first use this function)
     qtdirs.cpp:17: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:17: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:17: error: `BinariesPath' undeclared (first use this function)
     qtdirs.cpp:18: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:18: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:18: error: `DataPath' undeclared (first use this function)
     qtdirs.cpp:19: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:19: error: `QLibraryInfo' has not been declared
     qtdirs.cpp:19: error: `PluginsPath' undeclared (first use this function)
     mingw32-make[1]: *** [release/qtdirs.o] Error 1
     mingw32-make[1]: Leaving directory
`c:/tmp/PyQt-win-gpl-4-snapshot-20070710'
     mingw32-make: *** [release] Error 2
     Error: Failed to create release\qtdirs.exe. Make sure you have a
working Qt v4
     qmake on your PATH or use the -q argument to explicitly specify a
working Qt v4
     qmake.

   ``qmake.exe` is apparently still looking at
   ``c:/iwmake/build_mingw_opensource``.

   **ERROR** After spending 45mins fiddling with numerous variables
   that I would expect to influence qmake (searching a lot on the
   web), I cannot seem to make it change the include file.  How do I
   do that?



   Allright, so I can't do this, damnit. Fine, I'll copy QTDIR where
   it wants it, let's move into kludge-paradise::

     $ cd C:/
     $ mkdir -p C:/iwmake
     $ cp -r C:/Qt/4.3.0 C:/iwmake/build_mingw_opensource

   This time it cannot find my mingw32::

     $ C:/Python25/python configure.py -p win32-g++ -q
C:/Qt/4.3.0/qmake/qmake.exe -w
     Determining the layout of your Qt installation...
     C:\Qt\4.3.0\qmake\qmake.exe -o qtdirs.mk qtdirs.pro
     mingw32-make -f qtdirs.mk release
     mingw32-make -f qtdirs.mk.Release
     mingw32-make[1]: Entering directory
`c:/tmp/PyQt-win-gpl-4-snapshot-20070710'
     g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE
-DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DQT_CORE_LIB -DQ
     T_THREAD_SUPPORT -DQT_NEEDS_QMAIN
-I'../../iwmake/build_mingw_opensource/include/QtCore'
-I'../../iwmake/build_mingw_ope
     nsource/include/QtCore'
-I'../../iwmake/build_mingw_opensource/include'
-I'../../iwmake/build_mingw_opensource/include/A
     ctiveQt' -I'release' -I'.' -I'../../Qt/4.3.0/mkspecs/win32-g++'
-o release/qtdirs.o qtdirs.cpp
     g++ -enable-stdcall-fixup -Wl,-enable-auto-import
-Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads -Wl -Wl,-subsystem,w
     indows -o "release/qtdirs.exe" release/qtdirs.o
-L'c:/iwmake/build_mingw_opensource/lib' -lmingw32 -lqtmain -lQtCore4
     /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld:
cannot find -lmingw32
     collect2: ld returned 1 exit status
     mingw32-make[1]: *** [release/qtdirs.exe] Error 1
     mingw32-make[1]: Leaving directory
`c:/tmp/PyQt-win-gpl-4-snapshot-20070710'
     mingw32-make: *** [release] Error 2
     Error: Failed to create release\qtdirs.exe. Make sure you have a
working Qt v4
     qmake on your PATH or use the -q argument to explicitly specify a
working Qt v4
     qmake.

   Oh, that's easy, my PATH is set wrong, I need to compile with
   MinGW, not Cygwin's gcc::

     $ export PATH=/cygdrive/c/MinGW/bin:$PATH

   Retrying::

     $ C:/Python25/python configure.py -p win32-g++ -q
C:/Qt/4.3.0/qmake/qmake.exe -w
     Determining the layout of your Qt installation...
     C:\Qt\4.3.0\qmake\qmake.exe -o qtdirs.mk qtdirs.pro
     mingw32-make -f qtdirs.mk release
     mingw32-make -f qtdirs.mk.Release
     mingw32-make[1]: Entering directory
`c:/tmp/PyQt-win-gpl-4-snapshot-20070710'
     g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE
-DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DQT_CORE_LIB -DQ
     T_THREAD_SUPPORT -DQT_NEEDS_QMAIN
-I'../../iwmake/build_mingw_opensource/include/QtCore'
-I'../../iwmake/build_mingw_ope
     nsource/include/QtCore'
-I'../../iwmake/build_mingw_opensource/include'
-I'../../iwmake/build_mingw_opensource/include/A
     ctiveQt' -I'release' -I'.' -I'../../Qt/4.3.0/mkspecs/win32-g++'
-o release/qtdirs.o qtdirs.cpp
     g++ -enable-stdcall-fixup -Wl,-enable-auto-import
-Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads -Wl -Wl,-subsystem,w
     indows -o "release/qtdirs.exe" release/qtdirs.o
-L'c:/iwmake/build_mingw_opensource/lib' -lmingw32 -lqtmain -lQtCore4
     mingw32-make[1]: Leaving directory
`c:/tmp/PyQt-win-gpl-4-snapshot-20070710'
     release\qtdirs.exe
     Error: Unable to find the qmake configuration file
     C:\Qt\4.2.2\mkspecs\win32-g++\qmake.conf. Use the QMAKESPEC environment
     variable to specify the correct platform.

   Look at that 4.2.2, what is that?  So I grep and find it in
   configure.py::

     $ grep -sr 4.2.2 .
     ...
     ./configure.py:            0x040202: "Qt_4_2_0",
     ./configure.py:            0x040300: "Qt_4_2_2",
     ...

   Looks like a bug. I edit configure.py::

     $ diff -Naur configure.py  configure.new.py
     --- configure.py        2007-07-11 12:02:54.387145300 -0700
     +++ configure.new.py    2007-07-11 12:03:12.824645300 -0700
     @@ -218,7 +218,7 @@
                  0x040103: "Qt_4_1_2",
                  0x040200: "Qt_4_1_3",
                  0x040202: "Qt_4_2_0",
     -            0x040300: "Qt_4_2_2",
     +            0x040300: "Qt_4_3_0",
                  0x050000: "Qt_4_3_0"
              }

   It does not make a difference, same error.

   I grep all over, in my Qt installation, in PyQt, to no avail.

   I ran a find on my system, there is not other libQtCore4.a other
   than the newly installed one in C:/Qt/4.3.0/lib/libQtCore4.a.


Any help appreciated. I'm stuck. Well, you know, for now. Stuck for now.
(It's a little painful and fiddling with Windows I feel like my life
is passing me by, you know.)


More information about the PyQt mailing list