diff mbox

gnu: Add qtwebkit.

Message ID 20161028.112601.737405433041352600.post@thomasdanckaert.be
State New
Headers show

Commit Message

Thomas Danckaert Oct. 28, 2016, 9:26 a.m. UTC
Hi,

this patch adds QtWebKit 5.7 as a separate package (hopefully this will reduce security concerns: only packages which really need QtWebKit will include it).

QtWebKit is not officially supported anymore as of Qt 5.6, so this is a “community release” (not exactly sure what that entails, or if this includes any updates at all since the Qt 5.5 version).  I suppose many projects are switching to Qt WebEngine, and there are some efforts to create an updated version of QtWebKit (https://github.com/annulen/webkit), but in the mean time, this package might help build packages which still rely on the old QtWebKit.

By default, the qmake build system for qtwebkit insists on installing into the same prefix as qtbase, and it seems no command line parameters will change that. The solution I came up with, was to substitute all the necessary paths in the generated Makefiles. This makes the patch a bit lengthy.

I've also attached a minimal example.

Thomas
QT += widgets
QT += webkit
QT += webkitwidgets
SOURCES = example.cpp
#include <QWebView>
#include <QApplication>

int main(int argc, char** argv) {
    QApplication app(argc, argv);
    QWebView view;
    view.show();
    view.setUrl(QUrl("https://www.gnu.org/software/guix"));
    return app.exec();
}

Comments

Roel Janssen Oct. 28, 2016, 2:44 p.m. UTC | #1
Thomas Danckaert writes:

> Hi,
>
> this patch adds QtWebKit 5.7 as a separate package (hopefully this will reduce security concerns: only packages which really need QtWebKit will include it).
>
> QtWebKit is not officially supported anymore as of Qt 5.6, so this is a “community release” (not exactly sure what that entails, or if this includes any updates at all since the Qt 5.5 version).  I suppose many projects are switching to Qt WebEngine, and there are some efforts to create an updated version of QtWebKit (https://github.com/annulen/webkit), but in the mean time, this package might help build packages which still rely on the old QtWebKit.
>
> By default, the qmake build system for qtwebkit insists on installing into the same prefix as qtbase, and it seems no command line parameters will change that. The solution I came up with, was to substitute all the necessary paths in the generated Makefiles. This makes the patch a bit lengthy.
>
> I've also attached a minimal example.
>
> Thomas
> QT += widgets
> QT += webkit
> QT += webkitwidgets
> SOURCES = example.cpp
>   
> #include <QWebView>
> #include <QApplication>
>
> int main(int argc, char** argv) {
>     QApplication app(argc, argv);
>     QWebView view;
>     view.show();
>     view.setUrl(QUrl("https://www.gnu.org/software/guix"));
>     return app.exec();
> }

Thanks a lot for this patch.  I can confirm it builds fine, yet I have
to test it on some Qt packages that need QtWebkit (Texmaker).

Kind regards,
Roel Janssen
Leo Famulari Oct. 30, 2016, 12:22 a.m. UTC | #2
On Fri, Oct 28, 2016 at 11:26:01AM +0200, Thomas Danckaert wrote:
> Hi,
> 
> this patch adds QtWebKit 5.7 as a separate package (hopefully this
> will reduce security concerns: only packages which really need
> QtWebKit will include it).
> 
> QtWebKit is not officially supported anymore as of Qt 5.6, so this is
> a “community release” (not exactly sure what that entails, or if this
> includes any updates at all since the Qt 5.5 version).  I suppose many
> projects are switching to Qt WebEngine, and there are some efforts to
> create an updated version of QtWebKit
> (https://github.com/annulen/webkit), but in the mean time, this
> package might help build packages which still rely on the old
> QtWebKit.

Interesting!

Is there any official statement from Qt about these "community
releases"? I see that it is hosted on qt.io, so presumably they are
somehow blessed by Qt, but I'd like more information.
Roel Janssen Nov. 2, 2016, 12:35 p.m. UTC | #3
Roel Janssen writes:

> Thomas Danckaert writes:
>
>> Hi,
>>
>> this patch adds QtWebKit 5.7 as a separate package (hopefully this will reduce security concerns: only packages which really need QtWebKit will include it).
>>
>> QtWebKit is not officially supported anymore as of Qt 5.6, so this is a “community release” (not exactly sure what that entails, or if this includes any updates at all since the Qt 5.5 version).  I suppose many projects are switching to Qt WebEngine, and there are some efforts to create an updated version of QtWebKit (https://github.com/annulen/webkit), but in the mean time, this package might help build packages which still rely on the old QtWebKit.
>>
>> By default, the qmake build system for qtwebkit insists on installing into the same prefix as qtbase, and it seems no command line parameters will change that. The solution I came up with, was to substitute all the necessary paths in the generated Makefiles. This makes the patch a bit lengthy.
>>
>> I've also attached a minimal example.
>>
>> Thomas
>> QT += widgets
>> QT += webkit
>> QT += webkitwidgets
>> SOURCES = example.cpp
>>   
>> #include <QWebView>
>> #include <QApplication>
>>
>> int main(int argc, char** argv) {
>>     QApplication app(argc, argv);
>>     QWebView view;
>>     view.show();
>>     view.setUrl(QUrl("https://www.gnu.org/software/guix"));
>>     return app.exec();
>> }
>
> Thanks a lot for this patch.  I can confirm it builds fine, yet I have
> to test it on some Qt packages that need QtWebkit (Texmaker).

I think this patch works fine.  Unfortunately for me, it does not fix
Texmaker's build because it needs QtWebkitWidgets which is apparently a
different thing.

Kind regards,
Roel Janssen
Thomas Danckaert Nov. 2, 2016, 1 p.m. UTC | #4
From: Roel Janssen <roel@gnu.org>
Subject: Re: [PATCH] gnu: Add qtwebkit.
Date: Wed, 02 Nov 2016 13:35:21 +0100

> I think this patch works fine.  Unfortunately for me, it does not 
> fix
> Texmaker's build because it needs QtWebkitWidgets which is 
> apparently a
> different thing.

I'm quite sure QtWebkitWidgets is in there (there's a 
libqtwebkitwidgets.so or something like that if you look in the lib 
directory. See also the 'QT+=webkitwidgets' in the example I 
attached). I don't know how Texmaker's build system works, maybe some 
of qtwebkit's qmake/pkg-config/libtool auxiliary files are incomplete 
or incorrect, and this is why texmaker doesn't find qtwebkitwidgets?  
If you can find out how texmaker looks for qtwebkitwidgets, we might 
improve the patch.

Thomas
Thomas Danckaert Nov. 2, 2016, 1:05 p.m. UTC | #5
From: Leo Famulari <leo@famulari.name>
Subject: Re: [PATCH] gnu: Add qtwebkit.
Date: Sat, 29 Oct 2016 20:22:14 -0400

> Is there any official statement from Qt about these "community
> releases"? I see that it is hosted on qt.io, so presumably they are
> somehow blessed by Qt, but I'd like more information.

I wasn't able to find any information at all.  Maybe someone on #kde 
can tell us more.

Thomas
Roel Janssen Nov. 2, 2016, 1:32 p.m. UTC | #6
Thomas Danckaert writes:

> From: Roel Janssen <roel@gnu.org>
> Subject: Re: [PATCH] gnu: Add qtwebkit.
> Date: Wed, 02 Nov 2016 13:35:21 +0100
>
>> I think this patch works fine.  Unfortunately for me, it does not 
>> fix
>> Texmaker's build because it needs QtWebkitWidgets which is 
>> apparently a
>> different thing.
>
> I'm quite sure QtWebkitWidgets is in there (there's a 
> libqtwebkitwidgets.so or something like that if you look in the lib 
> directory. See also the 'QT+=webkitwidgets' in the example I 
> attached). I don't know how Texmaker's build system works, maybe some 
> of qtwebkit's qmake/pkg-config/libtool auxiliary files are incomplete 
> or incorrect, and this is why texmaker doesn't find qtwebkitwidgets?  
> If you can find out how texmaker looks for qtwebkitwidgets, we might 
> improve the patch.

So I thought.  I'll try to figure out why Texmaker doesn't find the
QtWebkitWidgets module and report my findings.

Kind regards,
Roel Janssen
Leo Famulari Nov. 5, 2016, 6:45 p.m. UTC | #7
On Wed, Nov 02, 2016 at 02:05:09PM +0100, Thomas Danckaert wrote:
> From: Leo Famulari <leo@famulari.name>
> Subject: Re: [PATCH] gnu: Add qtwebkit.
> Date: Sat, 29 Oct 2016 20:22:14 -0400
> 
> > Is there any official statement from Qt about these "community
> > releases"? I see that it is hosted on qt.io, so presumably they are
> > somehow blessed by Qt, but I'd like more information.
> 
> I wasn't able to find any information at all.  Maybe someone on #kde can
> tell us more.

I found this statement on the Qt mailing list:

"QtQuick1 and QtWebKit are _not_ supported anymore since Qt 5.6. 

What we have said is that we will provide QtWebKit source packages as
courtesy 
on a  best-effort basis. That is, also the QtWebKit source package under

http://download.qt.io/community_releases/5.6/5.6.0/

is not part of Qt anymore, and not supported. Use it at your own risk.
There's also no promise we can continue providing these."

source: http://lists.qt-project.org/pipermail/development/2016-May/025923.html

Well, none of this software comes with a warranty, so I think it's fine.
Can you add a code comment mentioning that this package is not
officially supported by the Qt project?
diff mbox

Patch

From ef2830cfc9342a88ce473f6a9bc55fee68991b74 Mon Sep 17 00:00:00 2001
From: Thomas Danckaert <thomas.danckaert@gmail.com>
Date: Wed, 26 Oct 2016 11:11:01 +0200
Subject: [PATCH] gnu: Add qtwebkit.

* gnu/packages/qt.scm (qtwebkit): New variable.
---
 gnu/packages/qt.scm | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 113 insertions(+)

diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index a1e5fde..8e710ab 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -4,6 +4,7 @@ 
 ;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
+;;; Copyright © 2016 Thomas Danckaert <post@thomasdanckaert.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1112,3 +1113,115 @@  contain over 620 classes.")
       "QtKeychain is a Qt library to store passwords and other secret data
 securely.  It will not store any data unencrypted unless explicitly requested.")
     (license license:bsd-3)))
+
+(define-public qtwebkit
+  (package
+    (name "qtwebkit")
+    (version "5.7.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append "http://download.qt.io/community_releases/"
+                            (version-major+minor version)
+                            "/" version "/qtwebkit-opensource-src-" version
+                            ".tar.xz"))
+        (sha256
+         (base32
+          "1prlpl3zslzpr1iv7m3irvxjxn3v8nlxh21v9k2kaq4fpwy2b8y7"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("perl" ,perl)
+       ("python" ,python-2.7)
+       ("ruby" ,ruby)
+       ("bison" ,bison)
+       ("flex" ,flex)
+       ("gperf" ,gperf)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("icu" ,icu4c)
+       ("libjpeg" ,libjpeg)
+       ("libpng" ,libpng)
+       ("libwebp" ,libwebp)
+       ("sqlite" ,sqlite)
+       ("fontconfig" ,fontconfig)
+       ("libxrender", libxrender)
+       ("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)
+       ("qtmultimedia" ,qtmultimedia)
+       ("libxml2" ,libxml2)
+       ("libxslt" ,libxslt)
+       ("libx11" ,libx11)
+       ("libxcomposite" ,libxcomposite)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+                  (lambda* (#:key outputs #:allow-other-keys)
+                    (let ((out (assoc-ref outputs "out")))
+                      (setenv "QMAKEPATH"
+                              (string-append (getcwd) "/Tools/qmake:"
+                                             (getenv "QMAKEPATH")))
+                      (system* "qmake"))))
+         ;; prevent webkit from trying to install into the qtbase store directory,
+         ;; and replace references to the build directory in linker options:
+         (add-before 'build 'patch-installpaths
+                     (lambda* (#:key outputs inputs #:allow-other-keys)
+                       (let* ((out (assoc-ref outputs "out"))
+                              (qtbase (assoc-ref inputs "qtbase"))
+                              (builddir (getcwd))
+                              (linkbuild (string-append "-L" builddir))
+                              (linkout (string-append "-L" out))
+                              (makefiles
+                               (map-in-order
+                                (lambda (i)
+                                  (let* ((in (car i))
+                                         (mf (string-append (dirname in) "/"
+                                                            (cdr i))))
+                                    ;; by default, these Makefiles are
+                                    ;; generated during install, but we need
+                                    ;; to generate them now
+                                    (system* "qmake" in "-o" mf)
+                                    mf))
+                                '(("Source/api.pri" . "Makefile.api")
+                                  ("Source/widgetsapi.pri"
+                                   . "Makefile.widgetsapi")
+                                  ("Source/WebKit2/WebProcess.pro"
+                                   . "Makefile.WebProcess")
+                                  ("Source/WebKit2/PluginProcess.pro"
+                                   . "Makefile.PluginProcess")
+                                  ("Source/WebKit/qt/declarative/public.pri"
+                                   . "Makefile.declarative.public")
+                                  ("Source/WebKit/qt/declarative/experimental/experimental.pri"
+                                   . "Makefile.declarative.experimental")
+                                  ("Source/WebKit/qt/examples/platformplugin/platformplugin.pro"
+                                   . "Makefile")))))
+                         ;; Order of qmake calls and substitutions matters here.
+                         (system* "qmake" "-prl" "Source/widgetsapi.pri"
+                                  "-o" "Source/Makefile")
+                         (substitute* (find-files "lib" "libQt5.*\\.prl")
+                           ((linkbuild) linkout))
+                         (substitute* (find-files "lib"
+                                                  "libQt5WebKit.*\\.la")
+                           (("libdir='.*'")
+                            (string-append "libdir='" out "/lib'"))
+                           ((linkbuild) linkout))
+                         (substitute* (find-files "lib/pkgconfig"
+                                                  "Qt5WebKit.*\\.pc")
+                           (((string-append "prefix=" qtbase))
+                            (string-append "prefix=" out))
+                           ((linkbuild) linkout))
+                         ;; Makefiles must be modified after .prl/.la/.pc
+                         ;; files, lest they get rebuilt:
+                         (substitute* makefiles
+                           (((string-append "\\$\\(INSTALL_ROOT\\)" qtbase))
+                            out )
+                           (((string-append "-Wl,-rpath," builddir))
+                            (string-append "-Wl,-rpath," out)))))))))
+    (home-page "https://www.webkit.org")
+    (synopsis "Web browser engine and classes to render and interact with web
+content")
+    (description "QtWebKit provides a Web browser engine that makes it easy to
+embed content from the World Wide Web into your Qt application.  At the same
+time Web content can be enhanced with native controls.")
+
+    (license license:lgpl2.1+)))
-- 
2.7.4