Newer
Older
+++
date = "2018-06-08"
weight = 100
title = "WebKit2"
Apertis is moving to a WebView widget and browser based on WebKit2GTK+.
The purpose of this migration is to take advantage of the new WebKit2
multi-process architecture, adopt a port that is upstream and that is
based on a more future-proof toolkit.
# Packages for testing and using the API
The engine is available in Apertis on the webkit2gtk source package. To
test it on a development or SDK image, install the
**webkit2gtk-testing** package and run **/usr/bin/GtkClutterLauncher**.
To develop programs that use the API, you'll need the
**libwebkit2gtk-4.0-dev** package.
# Where to build the code
WebKit is a very large code base and it can be very tricky to build and
debug. To give you an idea, a full debug build on a 64 bits system will
use over 23GB of disk space. If you need to build it yourself, here are
a few recommendations.
You can use any architecture, but amd64 is preferred, especially for
debug builds. We are not going to support building on any other
distribution such as Ubuntu given the eventual need for patched basic
libraries such as glib or clutter to get it to build or work.
By bind-mounting `/run` from the container to the host you can launch
\`GtkClutterLauncher\` directly from within the container, accessing
your current X session. Relying on your `$HOME` avoid incurring in the
limited disk space available on the SDK image.
Using a shared folder to export the build to a
[VirtualBox]( {{< ref "/virtualbox.md" >}} ) instance is quite likely to be more
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
efficient than building in the VM (understatement of the year).
When building on ARM you will probably need a lot of swap space, since
the board is likely to not have more than 1 or 2 gigabytes of RAM. Make
it at least 4GB large, 8GB if doing a debug build. Be sure to use an SSD
to back it or your builds will take longer than forever.
If you need to debug you'll need a debug build. Those are very hard to
do on a 32 bits system, so we advise against trying unless you need to
debug something that is specific to those architectures.
# Getting and building the code
Grab the code from here:
<https://gitlab.apertis.org/hmi/webkit-gtk-clutter>
You can install the build dependencies using APT on a development image:
`$ sudo apt-get build-dep webkit2gtk`
Remember that the port we are targetting is the GTK+ port, not the
Clutter one. In order to build using the build-webkit script run:
`$ ./Tools/Script/build-webkit --gtk --no-media-stream`
Or if you want to use cmake directly, something like this:
`$ mkdir build`
`$ cd build`
`$ cmake -DPORT=GTK ..`
`$ make`
# Passing arguments to the build
Along witht he switches available in build-webkit, it is possible to use
a lot of CMake parameters to customize the build process. To install to
a specific prefix, for example, you can provide CMake with the
`$ cmake -DPORT=GTK -DCMAKE_INSTALL_PREFIX=/my/install/path/ ..`
To pass cmake arguments to the build when using build-webkit, use the
`$ ./Tools/Script/build-webkit --gtk --no-accelerated-2d-canvas --no-media-stream --cmakeargs='-DCMAKE_INSTALL_PREFIX=/my/install/path/'`
# Developing and debugging
The simplest way of testing the engine is through the test launcher that
lives in the same repository as the rest of the codebase:
<https://gitlab.apertis.org/hmi/webkit-gtk-clutter/blob/master/Tools/GtkClutterLauncher/main.cpp>
After the build is done it will be in the build directory at
**bin/GtkClutterLauncher**. For instance, if you build using
build-webkit it will be at
**WebKitBuild/Release/bin/GtkClutterLauncher** or
**WebKitBuild/Debug/bin/GtkClutterLauncher** in case you ran a debug
build.
# How to use the port on a Clutter application
The port provides a ClutterActor wrapper that controls the GTK+ widget
behind the curtains. To do that it provides a new object in addition to
the usual WebKit2GTK+ API: **WebKitWebClutterView**. It can be created
and used like any other actor.
# How to customize gtk widgets
You can style gtk widget by using GtkCssProvider. Read
[WebKit2_CustomizableWidget]( {{< ref "/webkit2_customizablewidget.md" >}} )
# Updating the package
WebKit2 supports `make dist` to build the tarball when invoking `cmake`
with `-DDEVELOPER_MODE=ON`. That will generate a tarball named like
this: ''webkitgtk-2.14.1.tar.xz ''. When updating the package you need
`# Checkout the master branch`
`git checkout master`
`# Compute the package version`
`HASH=$(git show-ref --head HEAD --abbrev=7 --hash) # eg. cc1ecf7`
`DATE=$(date '+%Y%m%d') # eg. 20170429`
`RELEASE=$(awk '/set.PROJECT_VERSION_/ { gsub(")","", $2); print $2 }' Source/cmake/OptionsGTK.cmake | paste -sd '.') # eg. 2.14.1`
`VERSION="${RELEASE}+${DATE}+${HASH}" # eg. 2.14.1+20170429+cc1ecf7`
`DEBVERSION="${VERSION}-0co1" # eg. 2.14.1+20170429+cc1ecf7-0co1`
`# From the master branch, generate the dist tarball`
`cmake . -DPORT=GTK -DENABLE_SPELLCHECK=OFF -DENABLE_ACCELERATED_2D_CANVAS=OFF -DENABLE_GLES2=ON -DENABLE_PLUGIN_PROCESS_GTK2=OFF -DENABLE_TOOLS=ON -DENABLE_MINIBROWSER=ON -DDEVELOPER_MODE=ON`
`make -j $(getconf _NPROCESSORS_ONLN)`
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
`make dist`
`mv webkitgtk-${RELEASE}.tar.xz ../`
`# Tag the snapshot - the format is v`<upstream version>`+`<iso-date>`+abbrev-commit`
`git tag v${VERSION}`
`# Inside the git repository, switch to the apertis/master branch and import the tarball into the upstream branch:`
`git checkout apertis/master`
`gbp import-orig --upstream-branch=upstream --debian-branch=apertis/master --upstream-vcs-tag=v${VERSION} -u ${VERSION} ../webkitgtk-${RELEASE}.tar.xz `
`# Run dch -i to create the new changelog entry, commit`
`dch -v ${DEBVERSION} -D 17.06`
`git commit -a -m "Release new snapshot: ${DEBVERSION}"`
`# Build the package, exporting it to a build area and tagging it at the end`
`gbp buildpackage --git-debian-branch=apertis/master --git-export-dir=../build-area/ --git-tag -S -uc -us`
`# Push branches and tags`
`git push origin --tags`
`git push origin upstream`
`git push origin apertis/master`
# Cross-building during development
Building WebKit with full debug symbols requires a huge amount of CPU
and memory and it's simply not possible to do so in a native ARM build.
Unless you can assign at least 8GB of RAM to a VM, it's also unlikely to
work there.
The simplest solution is to use a
[bubblewrap](https://github.com/projectatomic/bubblewrap) container and
cross build from it:
<code>
CHROOT=apertis-17.03-amd64
mkdir "$CHROOT"
wget https://images.apertis.org/release/17.03/ospacks/sdk/amd64/17.03.0/ospack_17.03-amd64-sdk_17.03.0.tar.gz
tar -f ospack_17.03-amd64-sdk_17.03.0.tar.gz -C "$CHROOT" -x --exclude 'dev/*'
bwrap \
--bind "$CHROOT" / \
--proc /proc \
--dev-bind /dev /dev \
--ro-bind /sys /sys \
--bind /tmp /tmp \
--tmpfs /run \
--dir /run/user/1000 \
--bind $HOME /home/user \
--setenv debian_chroot "$(basename "$CHROOT")" \
--setenv GSETTINGS_BACKEND memory \
--setenv XDG_RUNTIME_DIR /run/user/1000 \
--setenv USER user \
--setenv HOME /home/user \
/bin/bash
# now inside the container
ade sysroot install
# to install packages you don't have to be root, but you need to pretend to be
apt update
function sudo () { PATH=/sbin:/usr/sbin:/usr/local/sbin:$PATH fakeroot "$@"; }
sudo apt install eatmydata
</code>
Using `-DCMAKE_BUILD_TYPE=Debug` will automatically produce full debug
symbols and enable assertions in the code.
To simply have working backtraces it can be enough to use
`-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_FLAGS_RELWITHDEBINFO=-g1
-DCMAKE_CXX_FLAGS_RELWITHDEBINFO=-g1 -DCMAKE_CXX_FLAGS=-g1
-DCMAKE_C_FLAGS=-g1` which reduces the amount of debug symbols and does
not enable runtime assertions.
<code>
cat > /opt/sysroot/apertis-17.03-armhf-cross-toolchain.cmake <<EOF
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR armhf)
set(CMAKE_SYSROOT "/opt/sysroot/apertis/17.03/armhf")
set(CMAKE_FIND_ROOT_PATH "/opt/sysroot/apertis/17.03/armhf")
find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
EOF
mkdir -p WebKitBuild/Debug
cd WebKitBuild/Debug
cmake ../.. \
-DPORT=GTK \
-DENABLE_SPELLCHECK=OFF \
-DENABLE_ACCELERATED_2D_CANVAS=OFF \
-DENABLE_GLES2=ON \
-DENABLE_PLUGIN_PROCESS_GTK2=OFF \
-DENABLE_TOOLS=ON \
-DENABLE_MINIBROWSER=ON \
-DDEVELOPER_MODE=ON \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_C_FLAGS_RELWITHDEBINFO=-g1 \
-DCMAKE_CXX_FLAGS_RELWITHDEBINFO=-g1 \
-DCMAKE_CXX_FLAGS=-g1 \
-DCMAKE_C_FLAGS=-g1 \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_SYSCONFDIR=/etc \
-DCMAKE_INSTALL_LOCALSTATEDIR=/var \
-DCMAKE_INSTALL_LIBEXECDIR=lib/arm-linux-gnueabihf \
-DCMAKE_TOOLCHAIN_FILE=/opt/sysroot/apertis-17.03-armhf-cross-toolchain.cmake \
-DPKG_CONFIG_EXECUTABLE=/usr/bin/arm-linux-gnueabihf-pkg-config
make -j12
</code>
Note that you may also need to manually edit
`/usr/bin/arm-linux-gnueabihf-pkg-config` to set the `SYSROOT` to
`/opt/sysroot/apertis/17.03/armhf`. See for more info.
# Fetch the WebKitGTK+ release branches
The WebKitGTK+ release branches are not available on the GIT mirror,
they are only available from SVN.
To fetch them in your git repository use
[`git-svn`](https://git-scm.com/docs/git-svn):
<code>
git clone git@gitlab.apertis.org:/hmi/webkit-gtk-clutter webkit-gtk-clutter
cd webkit-gtk-clutter
git remote add webkit git://git.webkit.org/WebKit.git
git fetch webkit
git svn init --prefix=webkit/ -T trunk http://svn.webkit.org/repository/webkit
git config --replace svn-remote.svn.fetch trunk:refs/remotes/webkit/master
# list release branches from https://svn.webkit.org/repository/webkit/releases/WebKitGTK/
git config svn-remote.svn.branches 'releases/WebKitGTK/{webkit-2.14,webkit-2.16}:refs/remotes/webkit/*'
# take a walk, it will take a while while it converts from SVN to something sensible (it took ~2h here)
git svn fetch
# check out the WebKitGTK+ 2.14.x release branch (or do whatever with it)
git checkout -b webkit-2.14 webkit/webkit-2.14