[[PageOutline]] = Building the Qt port on Linux = These instructions apply to Linux in general with source packages. == Dependencies == The code should be easily built on any Linux distribution which has development packages for Qt installed. Below is the list of dependencies: * '''Qt version 4.8.0-rc1 or later''' * gperf (v3.0 or later) * bison (v2.4.1 or later) * flex (v2.5.33 or later) * sqlite (development files) * fontconfig (development files) * xrender (development files) * phonon (development files) See also: [#DependenciesforspecificLinuxdistributions how to install dependency packages on major linux distributions]. == Building WebKit == First follow the instructions [QtWebKitContrib there to get the sources]. The Qt port is part of the WebKit source tree, so you don't need anything extra. Finally, set the QTDIR environment variable to Qt 4.x's installation path and make sure Qt 4.x's qmake is the first qmake in your PATH (typically by running `export PATH=$QTDIR/bin:$PATH`). If you are planning to compile it with [http://developer.qt.nokia.com/wiki/Building_Qt_5_from_Git Qt 5], QTDIR should point to `PathToRepository/qt5/qtbase/`. If your qmake binary has a different name, e.g. when using Debian, use the --qmake= option to specify the name. Build WebKit and the Qt test browser with {{{ WebKit/Tools/Scripts/build-webkit --qt }}} `build-webkit` (see above) also supports special variable for specifying the OBJDIR directory, as well as some configure and build arguments {{{ WEBKITOUTPUTDIR=`pwd`/qtbuild WebKit/Tools/Scripts/build-webkit --qt --makeargs="-j20 -s" --no-video --debug }}} If you are planning to compile webkit2, an additional parameter to the build script is required: "-2". Qt5 is also required ([http://developer.qt.nokia.com/wiki/Building_Qt_5_from_Git build instructions]). == Optional feature flags and CONFIG options == * features.pri lists many configurable build options for WebCore and JavascriptCore. * For [http://site.icu-project.org/ ICU library] support: pass CONFIG+=use_system_icu as an extra build-webkit argument. (Currently only tested on Linux.) == Testing the port == A very simple test browser is built along with the port and can be executed with {{{ Tools/Scripts/run-launcher --qt }}} == Common Build Errors == === Gold Linker Error === {{{ /usr/bin/gold: fatal error: out of file descriptors and couldn't close any }}} This is a bug in Gold Linker. See [http://sourceware.org/bugzilla/show_bug.cgi?id=10708 here][[BR]] To fix this try the following with root privileges and build: {{{ ulimit -n 65535 }}} If you don't have root privileges you should add the following in ''/etc/security/limits.conf'' file {{{ * hard nofile 65535 }}} This might need restarting X11/reboot. If you wan't a quick temporary workaround, try the following. (Tested in Ubuntu 10.10) {{{ sudo -s; ulimit -n 65535; exec su - yourusername }}} === Using Qt 4.2 === {{{ ../../../WebKitQt/Api/qwebnetworkinterface_p.h:134: error: ‘QSslError’ was not declared in this scope ../../../WebKitQt/Api/qwebnetworkinterface_p.h:134: error: template argument 1 is invalid ../../../WebKitQt/Api/qwebnetworkinterface_p.h:135: error: ‘QAuthenticator’ has not been declared ../../../WebKitQt/Api/qwebnetworkinterface_p.h:136: error: expected ‘,’ or ‘...’ before ‘&’ token ../../../WebKitQt/Api/qwebnetworkinterface_p.h:136: error: ISO C++ forbids declaration of ‘QNetworkProxy’ with no type make[1]: *** [tmp/ResourceHandleQt.o] Error 1 }}} This error is caused by not having the minimum version of Qt installed. Install the minimum version of Qt, set the 'QTDIR' environment variable pointing to this version and try building WebKit again. === Missing gperf === {{{ ../../../WebCore/html/HTMLDocument.cpp: In member function 'virtual void WebCore::HTMLDocument::determineParseMode(const WebCore::String&)': ../../../WebCore/html/HTMLDocument.cpp:389: error: expected initializer before '*' token ../../../WebCore/html/HTMLDocument.cpp:390: error: 'doctypeEntry' was not declared in this scope ../../../WebCore/html/HTMLDocument.cpp:398: error: 'doctypeEntry' was not declared in this scope ../../../WebCore/html/HTMLDocument.cpp:401: error: 'PubIDInfo' has not been declared ../../../WebCore/html/HTMLDocument.cpp:405: error: 'PubIDInfo' has not been declared }}} This error is typically caused by not having `gperf` installed. Install `gperf`, run `touch WebCore/html/DocTypeStrings.gperf` and try building WebKit again. === Missing SQLite development package === {{{ ../../../WebCore/loader/icon/SQLDatabase.cpp:30:21: error: sqlite3.h: No such file or directory ../../../WebCore/loader/icon/SQLDatabase.cpp:36: error: "SQLITE_ERROR" was not declared in this scope ../../../WebCore/loader/icon/SQLDatabase.cpp:37: error: "SQLITE_DONE" was not declared in this scope ../../../WebCore/loader/icon/SQLDatabase.cpp:38: error: "SQLITE_OK" was not declared in this scope ../../../WebCore/loader/icon/SQLDatabase.cpp:39: error: "SQLITE_ROW" was not declared in this scope }}} This error is typically caused by not having the development component of `libsqlite3` installed. Install the development package and try building WebKit again. === Missing flex === {{{ .../WebKitBuild/Release/lib/libWebKitQt.so: undefined reference to `WebCore::CSSParser::lex()' }}} This error is typically caused by not having `flex` installed. Install `flex`, run `touch WebCore/css/tokenizer.flex` and try building WebKit again. === Incompatible version of bison === {{{ bison -d -p kjsyy JavaScriptCore/kjs/grammar.y -o grammar.tab.c && mv grammar.tab.c tmp/grammar.cpp && mv grammar.tab.h tmp/grammar.h JavaScriptCore/kjs/grammar.y:364.3-366.9: type clash (`node' `') on default action JavaScriptCore/kjs/grammar.y:366.10: parse error, unexpected ":", expecting ";" or "|" }}} This error is caused by having an incompatible version of `bison` installed. The single reported case of this error occurred with `bison` 1.75, and was resolved by updating to `bison` 2.3. === Missing Phonon === {{{ In file included from ../../../WebCore/platform/graphics/MediaPlayer.cpp:46: ../../../WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.h:27:29: error: phononnamespace.h: No such file or directory In file included from ../../../WebCore/platform/graphics/MediaPlayer.cpp:46: ../../../WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.h:120: error: ‘Phonon::State’ has not been declared ../../../WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.h:120: error: ‘Phonon::State’ has not been declared }}} This error is caused by not having Phonon installed. Install the development version to resolve. === Missing fontconfig === {{{ error: fontconfig/fontconfig.h: No such file or directory }}} Install fontconfig-dev (libfontconfig-dev). === Outdated Mesa library === {{{ ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp: In member function ‘void WebCore::BitmapTextureGL::bind()’: ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:581:9: error: ‘GL_RENDERBUFFER’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:585:9: error: ‘GL_RENDERBUFFER’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:585:9: error: ‘GL_DEPTH_STENCIL’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:587:9: error: ‘GL_FRAMEBUFFER’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:589:9: error: ‘GL_RENDERBUFFER’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:590:9: error: ‘GL_FRAMEBUFFER’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:590:9: error: ‘GL_COLOR_ATTACHMENT0’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:591:9: error: ‘GL_FRAMEBUFFER’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:591:9: error: ‘GL_STENCIL_ATTACHMENT’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:591:9: error: ‘GL_RENDERBUFFER’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:600:9: error: ‘GL_FRAMEBUFFER’ was not declared in this scope ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp: In member function ‘virtual void WebCore::TextureMapperGL::bindSurface(WebCore::BitmapTexture*)’: ../../../Source/WebCore/platform/graphics/opengl/TextureMapperGL.cpp:646:9: error: ‘GL_FRAMEBUFFER’ was not declared in this scope }}} Update the Mesa OpenGL library ([http://packages.debian.org/search?keywords=libgl1-mesa-dev&searchon=names&suite=unstable§ion=all libgl1-mesa-dev] on Debian systems). == Dependencies for specific Linux distributions == === Debian/Ubuntu Linux === To install required dependencies on Debian/Ubuntu, do {{{ sudo apt-get install bison flex libqt4-dev libqt4-opengl-dev libphonon-dev libicu-dev libsqlite3-dev libxext-dev libxrender-dev gperf libfontconfig1-dev libphonon-dev g++ }}} Note: Some ubuntu distributions does not install qt 4.7.0 with the above command. So you have to install it separately from qt.nokia.com or add "deb http://ppa.launchpad.net/kubuntu-ppa/backports/ubuntu lucid main" to apt sources file /etc/apt/sources.list and do apt-get update and then install libqt4-dev package === Ark Linux === On Ark Linux, install the required dependencies using {{{ apt-get install devel-core qt4-devel qmake gperf bison sqlite-devel }}} Alternatively, install the needed packages (see list above) through Mission Control -> Install Software. === OpenSUSE Linux === This was tested on openSUSE 11.1 {{{ sudo zypper in libqt4-devel gperf bison libicu-devel sqlite-devel }}} === Fedora Linux === This was tested on Fedora 13 {{{ sudo yum install gcc-c++ bison flex gperf phonon-devel qt-devel sqlite-devel libXrender-devel fontconfig-devel libicu-devel libXext-devel }}}