Programming Reference:Building Qt for BCI2000

From BCI2000 Wiki
Revision as of 18:36, 14 June 2013 by Mellinger (talk | contribs) (Build and copy MSVC libraries and auxiliary files)

Jump to: navigation, search

This document describes how to build Qt for installation in the BCI2000 source tree. It is current as of Qt 4.8.4.

Note: Following this procedure is only required if you are a member of the BCI2000 team, and if your task is to update the Qt build coming with BCI2000. In case you just want to build BCI2000 against a version of Qt outside the source tree, run CMake a first time, then open the file BCI2000/build/CMakeCache.txt in the CMake GUI, or in a text editor, and set the value of the USE_EXTERNAL_QT option to "ON".

Build and copy MSVC libraries and auxiliary files

  • Download the Qt source code to your machine.
  • Outside the Qt source tree, create a directory qt-x.y.z, e.g. qt-4.7.0 for version 4.7.0.
  • Open the file qt/mkspecs/win32-msvc2008/qmake.conf in a text editor. In QMAKE_CFLAGS_RELEASE and QMAKE_CFLAGS_DEBUG, replace the -MD and -MDd with -MT and -MTd, respectively.
  • Open the file qt/projects.pro, and put a comment sign in front of "examples demos" near the top of the file.
  • Open the VS2008 console window from the start menu, and from the Qt installation's qt directory, run configure with the following options:
-platform win32-msvc2008 
-static 
-no-sql-sqlite
-no-qt3support 
-fast 
-qt-zlib
-qt-libpng 
-qt-libmng 
-no-libtiff 
-no-libjpeg 
-no-phonon 
-no-webkit 
-no-scripttools 
-no-style-plastique 
-no-style-motif 
-no-style-cde 

As a full command line:

configure -platform win32-msvc2008 -static -no-sql-sqlite -no-qt3support -fast -qt-zlib -qt-libpng -qt-libmng -no-libtiff -no-libjpeg -no-phonon -no-webkit -no-scripttools -no-style-plastique -no-style-motif -no-style-cde 
  • When prompted for the type of license, choose "Open Source", and answer "yes" when asked whether you accept the terms of the license.
  • Run nmake as suggested by configure.
  • Inside the qt-x.y.z directory, create a subdirectory win32-msvc2008.
  • Copy the following files from qt/bin to qt-x.y.z/win32-msvc2008/bin:
idc.exe
moc.exe
qmake.exe
rcc.exe
uic.exe

Make sure to leave the qt.conf file unaffected.

  • From qt/lib, copy the following files to qt-x.y.z/win32-msvc2008/lib:
QtCore.lib
QtCored.lib
QtGui.lib
QtGuid.lib
QtOpenGL.lib
QtOpenGLd.lib
  • From qt/mkspecs, copy the file qconfig.pri, and recursively copy the contents of the features and the win32-msvc2008 directories to qt-x.y.z/win32-msvc2008/mkspecs.
  • Repeat the entire process with MSVC2010, with results going into a win32-msvc2010 directory rather than the win32-msvc2008 directory.
  • For 64-bit versions of the libraries, proceed as above, but run configure and nmake steps from a 64-bit Visual Studio command line prompt. The target directory should be named win32-amd64-msvc2008 for MSVC 2008 64-bit builds.

Build and copy mingw libraries and auxiliary files

  • From the Qt installation's qt directory, run configure with the following options:
-platform win32-g++
-static 
-no-sql-sqlite
-no-qt3support 
-fast 
-qt-zlib
-qt-libpng 
-qt-libmng 
-no-libtiff 
-no-libjpeg 
-no-phonon 
-no-webkit 
-no-scripttools 
-no-style-plastique 
-no-style-motif 
-no-style-cde 

The full command line is:

configure -platform win32-g++ -static -no-sql-sqlite -no-qt3support -fast -qt-zlib-qt-libpng -qt-libmng -no-libtiff -no-libjpeg -no-phonon -no-webkit -no-scripttools -no-style-plastique -no-style-motif -no-style-cde
  • When prompted for the type of license, choose "Open Source", and answer "yes" when asked whether you accept the terms of the license.
  • If you have previously done a full build, open a console window, and run mingw32-make in the following directories:
    • qt/src/corelib,
    • qt/src/gui,
    • qt/src/opengl.
  • Otherwise, run mingw32-make from the qt/src directory.
  • When the build is finished, copy the following files from qt/bin to qt-x.y.z/win32-g++/bin:
idc.exe
moc.exe
qmake.exe
rcc.exe
uic.exe
libgcc_s_dw2-1.dll
mingwm10.dll

If the DLL files do not exist, they are not required. Leave the qt.conf file in place, don't modify it.

  • From qt/lib, copy the following files to qt-x.y.z/win32-g++/lib:
libQtCore.a
libQtGui.a
libQtOpenGL.a
  • From qt/mkspecs, copy the file qconfig.pri, and recursively copy the contents of directories features, common, and win32-g++ to qt-x.y.z/win32-g++/mkspecs.

Add configuration information

  • To each of the bin directories created in previous steps, add a file qt.conf with the following content:
[Paths]
Prefix=
Documentation=../doc
Headers=../../include
Libraries=../lib
Binaries=
Plugins=../plugins
Data=..
Translations=../translations
Settings=
Examples=
Demos=

Prepare Qt include files for external use

  • Most header files point to header files in the qt/src header files. We don't want to provide the entire qt/src directory, so we need to replace these header files with the content of the files they point to. There is a fixheader tool provided in the BCI2000 source tree at build/buildutils/fixheader.cpp. Under cygwin, execute
g++ fixheader.cpp -o fixheader

from that directory to build the executable. Then, cd to the qt/include/Qt directory of your Qt installation, and execute

for i in `find *.h`; do /full/path/to/fixheader $i; done

Repeat this step for the QtCore, QtGui, and QtOpenGL include directories.

  • Copy the contents of the directory qt/include/Qt into qt-x.y.z/include/Qt, omitting the private directory.
  • Likewise, copy the QtCore, QtGui, QtOpenGL include directories to qt-x.y.z/include, omitting the respective private directories.

Remove debugging information from MSVC libraries

  • Despite current MSVC compilers store debugging information in .pdb files, .lib files still contain traditional debugging information. In addition, .lib debugging information refers to .pdb files, and the MSVC linker will issue a large number of warnings if it cannot find those .pdb files.
  • Basically, we can use the GNU objcopy tool in order to strip debugging information from MSVC .lib files. Due to nonstandard behavior of MSVC, it is necessary to do some fixup before and after running objdump on an MSVC-generated .lib file.
  • In cygwin, go to build/buildutils, and run
g++ fixup_msvc_lib.cpp -o fixup_msvc_lib
g++ coff_set_debug.cpp -o coff_set_debug
  • Then, go to the qt lib directory that contains the MSVC libraries to be stripped, and execute
/path/to/build/buildutils/strip_msvc_lib.sh *
  • To strip 64-bit libraries, you will need to have the cygwin-64-bit-toolchain installed, and to add -64 as a first argument to the script:
/path/to/build/buildutils/strip_msvc_lib.sh -64 *

Upload Qt to the BCI2000 server

  • Create a self-extracting 7z archive from each subfolder of the qt-x.y.z directory. In order to expand correctly, the archive must contain the qt-x.y.z directory as well.
  • For CMake to find an archive on the server, it must be located at the following http path: /externals/qt/qt-x.y.z.subdirname

Note that archives may not have an .exe file extension on the server. It will be added when the file is downloaded by CMake (see BCI2000/build/cmake/FindQt.cmake for details).

See also

Programming Reference:Build System