summaryrefslogtreecommitdiffstats
path: root/package/qt5/qt5webengine/5.9.1/0002-Load-libEGL-and-libGLES2-symbols-implicitly.patch
diff options
context:
space:
mode:
authorGaël PORTAY <gael.portay@savoirfairelinux.com>2017-08-15 16:38:53 -0400
committerArnout Vandecappelle (Essensium/Mind) <arnout@mind.be>2017-09-23 22:00:02 +0200
commit89080bac9bc47946a09c1e74f2f872363bf6785b (patch)
tree7d39b923f5af30af9025f8a4289c8635bdba9886 /package/qt5/qt5webengine/5.9.1/0002-Load-libEGL-and-libGLES2-symbols-implicitly.patch
parentc3c66520ee37473dd6467d0253b4db15b2dfe7e9 (diff)
downloadbuildroot-89080bac9bc47946a09c1e74f2f872363bf6785b.tar.gz
buildroot-89080bac9bc47946a09c1e74f2f872363bf6785b.zip
qt5webengine: new package
This patch is based on works [1] and [2]. With this patch, one can run the Qt5 WebEngine quicknanobrowser sample with the following options. BR2_TOOLCHAIN_BUILDROOT_LIBC="glibc" and BR2_TOOLCHAIN_BUILDROOT_CXX (Qt 5 needs a toolchain w/ wchar, NPTL, C++, dynamic library; for now it builds only with glibc) BR2_PACKAGE_LIBERATION (Qt needs at least one font) BR2_PACKAGE_QT5BASE_EXAMPLES (to install quicknanobrowser sample) BR2_PACKAGE_QT5BASE_GIF (do display gif) BR2_PACKAGE_QT5BASE_JPEG (do display jpeg) BR2_PACKAGE_QT5BASE_PNG (do display png) BR2_PACKAGE_QT5QUICKCONTROLS (needed by webengine) BR2_PACKAGE_QT5QUICKCONTROLS2 (needed by webengine) BR2_PACKAGE_QT5WEBENGINE (because it is what we want) Qt WebEngine requires an Open(E)GL-capable backend. As an example, the package rpi-userland must be enabled to build for a rpi. BR2_PACKAGE_RPI_USERLAND (to enable OpenGL ES backend) To browse for HTTPS websites, please consider adding the following options as well for SSL/TLS. BR2_PACKAGE_CA_CERT (for certificates) BR2_PACKAGE_NTPD (to sync date for certificates) Since version 5.9, chromium requires udev at runtime (see note 4). BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV (input backend) To run quicknanobrowser # cd /usr/lib/qt/examples/webengine/quicknanobrowser/ # ./quicknanobrowser https://www.buildroot.org/ Note: The chromium.inc has been generated using the following command. ( echo 'CHROMIUM_LICENSE_FILES = \' && cd output/build/qt5webengine-5.9.1/ && \ find "src/3rdparty/chromium/" -type f -iname "*LICENSE*" -o -iname "*COPYING*" -o -iname "*GPL*" | \ sed -e '/\.asm$/d' \ -e '/\.h$/d' \ -e '/\.c$/d' \ -e '/\.cc$/d' \ -e '/\.cpp$/d' \ -e '/\.pyc\?$/d' \ -e '/\.pl$/d' \ -e '/\.sha1$/d' \ -e '/\.patch$/d' \ -e '/licensecheck/d' \ -e 's,^,\t,' \ -e 's,$, \\,' | \ sort && \ echo '' ) >package/qt5/qt5webengine/chromium.inc Note 2: Since 5.9.1, the chromium's copy of opus fails with neon [3]. Qt WebEngine can uses buildroot ffmpeg copy which compiles fine (using qmake flag WEBENGINE_CONFIG+=use_system_ffmpeg). It implies selecting the following options. BR2_PACKAGE_FFMPEG BR2_PACKAGE_OPUS BR2_PACKAGE_LIBVPX BR2_PACKAGE_WEBP BR2_PACKAGE_WEBP_DEMUX In file included from ../../3rdparty/chromium/third_party/opus/src/silk/arm/NSQ_neon.c:31:0: /home/gportay/src/buildroot/output-rpi3-qt5.9/host/lib/gcc/arm-buildroot-linux-gnueabihf/6.4.0/include/arm_neon.h:8997:1: error: inlining failed in call to always_inline ‘vld1q_s32’: target specific option mismatch vld1q_s32 (const int32_t * __a) ^~~~~~~~~ ../../3rdparty/chromium/third_party/opus/src/silk/arm/NSQ_neon.c:40:15: note: called from here int32x4_t coef0 = vld1q_s32(coef32); ^~~~~ ../../3rdparty/chromium/third_party/opus/src/silk/arm/NSQ_neon.c: At top level: cc1: warning: unrecognized command line option ‘-Wno-#pragma-messages’ Note 3: Version 5.6.2 causes a build issue while building chromium. The build against this version is disabled until the release 5.6.3 is out. Note 4: Here is trace when udev does not run # cd /usr/lib/qt/examples/webengine/quicknanobrowser # ./quicknanobrowser QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root' Unable to query physical screen size, defaulting to 100 dpi. To override, set QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT (in millimeters). [0101/000248.161973:WARNING:resource_bundle_qt.cpp(114)] locale_file_path.empty() for locale [0101/000248.384693:WARNING:resource_bundle_qt.cpp(114)] locale_file_path.empty() for locale [202:223:0101/000248.484954:FATAL:udev_loader.cc(38)] Check failed: false. #0 0x0000742b93de <unknown> #1 0x0000742c3c38 <unknown> #2 0x000073e1e1aa <unknown> #3 0x000073e1d96e <unknown> #4 0x000073e1defa <unknown> #5 0x000074af6364 <unknown> #6 0x000074302878 <unknown> #7 0x0000742c8fee <unknown> #8 0x0000742c9f44 <unknown> #9 0x0000742ca21e <unknown> #10 0x0000742cac4c <unknown> #11 0x0000742c87b2 <unknown> #12 0x0000742da4f6 <unknown> #13 0x000073ed9d38 <unknown> #14 0x000073eda03c <unknown> #15 0x0000742e9aec <unknown> #16 0x0000742e71dc <unknown> Aborted Note 5: On rpi and depending on what is insinde the .config, more GPU memory should be allocated to run properly qt samples. #0 0x0000742c63de <unknown> #1 0x0000742d0c38 <unknown> #2 0x0000749d7bde <unknown> #3 0x0000749e3c70 <unknown> #4 0x00007530227c <unknown> #5 0x000075302480 <unknown> #6 0x0000752fb1e4 <unknown> #7 0x00007430f878 <unknown> #8 0x0000742d5fee <unknown> #9 0x0000742d6f44 <unknown> #10 0x0000742d721e <unknown> #11 0x0000742d7ad6 <unknown> #12 0x0000742d57b2 <unknown> #13 0x0000742e74f6 <unknown> #14 0x0000742f6a74 <unknown> #15 0x0000742f41dc <unknown> Received signal 6 #0 0x0000742c63de <unknown> #1 0x0000742c66a0 <unknown> #2 0x0000725b5d10 <unknown> [end of stack trace] qml: Render process exited with code 256 (abnormal exit) # mount /dev/mmcblk0p1 /mnt # sed '/^gpu_mem_/s,=.*,=200,' -i /mnt/config.txt # umount /mnt Note 6: The first patch fixes a build issue when samples are compiled without the support of printing [4]. This patch is already merged in branch 5.9 [5] and concerns only 5.9.1. 085c2c52 Always compile QWebEnginePage::print It fixes the error below. .obj/browsermainwindow.o: In function `BrowserMainWindow::printRequested(QWebEnginePage*)': browsermainwindow.cpp:(.text+0x2cc0): undefined reference to `QWebEnginePage::print(QPrinter*, QWebEngineCallback<bool> const&)' The second patch loads both libEGL and libGLESv2 symbols implicitly instead of loading them with explicitly using hard-coded locations. It fixes a bug when providers of lib*GL does not create libraries named libEGL.so.1 and libGLESv2.s2 [6]. This patch is already merged in branch 5.9 [7]. d4c621f6 Load libEGL and libGLES2 symbols implicitly It fixes the error below. [327:347:1221/085837:ERROR:surface_factory_qt.cpp(68)] Failed to load /usr/lib/libGLESv2.so.2: /usr/lib/libGLESv2.so.2: cannot open shared object file: No such file or directory [1]: http://lists.busybox.net/pipermail/buildroot/2015-July/132010.html [2]: https://patchwork.ozlabs.org/patch/640633/ [3]: https://patchwork.ozlabs.org/patch/791332/ [4]: https://bugreports.qt.io/browse/QTBUG-61510 [5]: https://codereview.qt-project.org/#/c/198041/ [6]: https://bugreports.qt.io/browse/QTBUG-57761 [7]: https://codereview.qt-project.org/#/c/199554/ Cc: Akihiko Odaki <akihiko.odaki.4i@stu.hosei.ac.jp> Cc: Julien Corjon <corjon.j@ecagroup.com> Signed-off-by: Gaël PORTAY <gael.portay@savoirfairelinux.com> [Arnout: - move more dependencies to _ARCH_DEPENDS; - mention all toolchain dependencies in the comments] Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Diffstat (limited to 'package/qt5/qt5webengine/5.9.1/0002-Load-libEGL-and-libGLES2-symbols-implicitly.patch')
-rw-r--r--package/qt5/qt5webengine/5.9.1/0002-Load-libEGL-and-libGLES2-symbols-implicitly.patch89
1 files changed, 89 insertions, 0 deletions
diff --git a/package/qt5/qt5webengine/5.9.1/0002-Load-libEGL-and-libGLES2-symbols-implicitly.patch b/package/qt5/qt5webengine/5.9.1/0002-Load-libEGL-and-libGLES2-symbols-implicitly.patch
new file mode 100644
index 0000000000..b8ef687f99
--- /dev/null
+++ b/package/qt5/qt5webengine/5.9.1/0002-Load-libEGL-and-libGLES2-symbols-implicitly.patch
@@ -0,0 +1,89 @@
+From d4c621f6a6b87f2a86069fa393b9f7c4f9e7b9ad Mon Sep 17 00:00:00 2001
+From: Viktor Engelmann <viktor.engelmann@qt.io>
+Date: Fri, 7 Jul 2017 12:56:19 +0200
+Subject: [PATCH] Load libEGL and libGLES2 symbols implicitly
+
+Instead of explicitly loading libraries from hard-coded locations,
+we now just call dlopen(NULL, RTLD_LAZY). This returns a handle to
+the host process'es context, which already contains the symbols of
+both these libraries, because we link against them.
+It was necessary to bypass LoadLibrary, because that expects a non-NULL
+file path, so we couldn't pass NULL through that interface.
+
+Task-number: QTBUG-57761
+Change-Id: I29f037dfe542222b5188a33c7727c81a464a87bb
+Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
+Reviewed-by: Michal Klocek <michal.klocek@qt.io>
+Upstream-Status: Merged
+Signed-off-by: Gaël PORTAY <gael.portay@savoirfairelinux.com>
+---
+ src/core/surface_factory_qt.cpp | 40 ++++++++--------------------------------
+ 1 file changed, 8 insertions(+), 32 deletions(-)
+
+diff --git a/src/core/surface_factory_qt.cpp b/src/core/surface_factory_qt.cpp
+index 36c05ec5..e8be8480 100644
+--- a/src/core/surface_factory_qt.cpp
++++ b/src/core/surface_factory_qt.cpp
+@@ -51,51 +51,27 @@
+ #if defined(USE_OZONE)
+
+ #include <EGL/egl.h>
+-
+-#ifndef QT_LIBDIR_EGL
+-#define QT_LIBDIR_EGL "/usr/lib"
+-#endif
+-#ifndef QT_LIBDIR_GLES2
+-#define QT_LIBDIR_GLES2 QT_LIBDIR_EGL
+-#endif
++#include <dlfcn.h>
+
+ namespace QtWebEngineCore {
+
+-base::NativeLibrary LoadLibrary(const base::FilePath& filename) {
+- base::NativeLibraryLoadError error;
+- base::NativeLibrary library = base::LoadNativeLibrary(filename, &error);
+- if (!library) {
+- LOG(ERROR) << "Failed to load " << filename.MaybeAsASCII() << ": " << error.ToString();
+- return NULL;
+- }
+- return library;
+-}
+-
+ bool SurfaceFactoryQt::LoadEGLGLES2Bindings()
+ {
+- base::FilePath libEGLPath = QtWebEngineCore::toFilePath(QT_LIBDIR_EGL);
+- libEGLPath = libEGLPath.Append("libEGL.so.1");
+- base::NativeLibrary eglLibrary = LoadLibrary(libEGLPath);
+- if (!eglLibrary)
+- return false;
+-
+- base::FilePath libGLES2Path = QtWebEngineCore::toFilePath(QT_LIBDIR_GLES2);
+- libGLES2Path = libGLES2Path.Append("libGLESv2.so.2");
+- base::NativeLibrary gles2Library = LoadLibrary(libGLES2Path);
+- if (!gles2Library)
++ base::NativeLibrary eglgles2Library = dlopen(NULL, RTLD_LAZY);
++ if (!eglgles2Library) {
++ LOG(ERROR) << "Failed to open EGL/GLES2 context " << dlerror();
+ return false;
++ }
+
+- gl::GLGetProcAddressProc get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(base::GetFunctionPointerFromNativeLibrary(eglLibrary, "eglGetProcAddress"));
++ gl::GLGetProcAddressProc get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(base::GetFunctionPointerFromNativeLibrary(eglgles2Library, "eglGetProcAddress"));
+ if (!get_proc_address) {
+ LOG(ERROR) << "eglGetProcAddress not found.";
+- base::UnloadNativeLibrary(eglLibrary);
+- base::UnloadNativeLibrary(gles2Library);
++ base::UnloadNativeLibrary(eglgles2Library);
+ return false;
+ }
+
+ gl::SetGLGetProcAddressProc(get_proc_address);
+- gl::AddGLNativeLibrary(eglLibrary);
+- gl::AddGLNativeLibrary(gles2Library);
++ gl::AddGLNativeLibrary(eglgles2Library);
+ return true;
+ }
+
+--
+2.13.2
+
OpenPOWER on IntegriCloud