{"id":774,"date":"2015-09-20T21:35:58","date_gmt":"2015-09-21T04:35:58","guid":{"rendered":"http:\/\/visualgdb.com\/w\/?p=774"},"modified":"2015-11-13T11:48:07","modified_gmt":"2015-11-13T19:48:07","slug":"cross-compiling-qt-embedded-5-5-for-raspberry-pi-2","status":"publish","type":"post","link":"https:\/\/visualgdb.com\/tutorials\/raspberry\/qt\/embedded\/","title":{"rendered":"Cross-compiling Qt Embedded 5.5 for Raspberry Pi 2"},"content":{"rendered":"<p>This tutorial shows how to cross-compile the Embedded build of Qt 5.5 for Raspberry Pi 2. The Embedded build does not use the X11 server and instead displays the GUI directly using the Raspberry Pi framebuffer. We will show how to use a Raspberry Pi cross-compiler to build the Qt5 framework for Raspberry Pi on a Windows machine.<\/p>\n<ol>\n<li>Download a fresh SD card image for your Raspberry Pi. In this tutorial we will use a <a href=\"http:\/\/gnutoolchains.com\/raspberry\/jessie\/\">Debian Jessie<\/a> image. Write the image into the SD card using <a href=\"http:\/\/winflashtool.sysprogs.com\/\">WinFLASHTool<\/a> or any other similar tool.<\/li>\n<li>Download a <a href=\"http:\/\/gnutoolchains.com\/raspberry\/\">cross-toolchain<\/a> matching the image and install it:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/01-raspberry.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-775\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/01-raspberry.png\" alt=\"01-raspberry\" width=\"747\" height=\"412\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/01-raspberry.png 747w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/01-raspberry-300x165.png 300w\" sizes=\"(max-width: 747px) 100vw, 747px\" \/><\/a><\/li>\n<li>Download and install a <a href=\"http:\/\/gnutoolchains.com\/mingw32\/\">MinGW toolchain<\/a> that will be used to build Windows versions of build tools like Qmake:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/02-mingw.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-776\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/02-mingw.png\" alt=\"02-mingw\" width=\"747\" height=\"412\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/02-mingw.png 747w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/02-mingw-300x165.png 300w\" sizes=\"(max-width: 747px) 100vw, 747px\" \/><\/a><\/li>\n<li>Download and install <a href=\"https:\/\/www.python.org\/downloads\/\">Python 2.7 for Windows<\/a> and ensure that its directory is added to PATH.<\/li>\n<li>Download the Qt source package (e.g. <a href=\"http:\/\/download.qt.io\/archive\/qt\/5.5\/5.5.0\/single\/qt-everywhere-opensource-src-5.5.0.tar.xz\">qt-everywhere-opensource-src-5.5.0.tar.xz<\/a>) from the <a href=\"http:\/\/download.qt.io\/archive\/qt\/\">Qt Archive<\/a>.<\/li>\n<li>Before we can build the Qt for Raspberry Pi, we need to resynchronize the sysroot with the toolchain to ensure that the toolchain has all the headers and libraries from your Raspberry. Start the <strong>UpdateSysroot.bat<\/strong> file from the &lt;sysgcc&gt;\\Raspberry\\TOOLS folder:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/03-sync.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-777\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/03-sync.png\" alt=\"03-sync\" width=\"531\" height=\"409\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/03-sync.png 531w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/03-sync-300x231.png 300w\" sizes=\"(max-width: 531px) 100vw, 531px\" \/><\/a>You need to synchronize at least the \/opt folder, as it contains OpenGL headers that are not included in the toolchain. If you have installed additional packages on your Raspberry Pi, resynchronize other suggested directories as well. <strong>Do not resynchronize the \/etc folder. Otherwise it will overwrite the \/etc\/ld.so.conf file with a version from the device that contains &#8220;include&#8221; statements unsupported by the Windows compiler. If you did overwrite it, expand the statements manually or revert to the ld.so.conf file shipped with the original toolchain.<\/strong><\/li>\n<li>Launch the msys shell from the MinGW toolchain by running <strong>&lt;sysgcc&gt;\\MinGW32\\msys\\1.0\\msys.bat<\/strong>:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/04-shell.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-778\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/04-shell.png\" alt=\"04-shell\" width=\"677\" height=\"342\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/04-shell.png 677w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/04-shell-300x152.png 300w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a><\/li>\n<li>Go to the directory containing the archive with the Qt source and extract it by running tar xf &lt;archive name&gt;:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/05-unpack.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-779\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/05-unpack.png\" alt=\"05-unpack\" width=\"677\" height=\"342\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/05-unpack.png 677w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/05-unpack-300x152.png 300w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a><\/li>\n<li>Ensure that the directories containing the MinGW gcc compiler and the Raspberry Pi cross-compiler are added to PATH. If not, add them manually:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/05a-which.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-781\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/05a-which.png\" alt=\"05a-which\" width=\"677\" height=\"342\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/05a-which.png 677w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/05a-which-300x152.png 300w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a><\/li>\n<li>Open the\u00a0<strong>qt-everywhere-opensource-src-5.5.0\\qtbase\\mkspecs\\linux-arm-gnueabi-g++\\qmake.conf\u00a0<\/strong> file and replace all occurences of arm-linux-gnueabi- with arm-linux-gnueabihf-:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/06-hf.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-780\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/06-hf.png\" alt=\"06-hf\" width=\"626\" height=\"606\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/06-hf.png 626w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/06-hf-300x290.png 300w\" sizes=\"(max-width: 626px) 100vw, 626px\" \/><\/a><\/li>\n<li>Now we are ready to build Qt. Due to a bug in the Qmake build script, we will need to build it in 2 steps: first we will build a Qmake for Windows and then we&#8217;ll build the actual Qt binaries. First we will modify the win32-g++ platform definition to prevent MinGW from excluding some functions that Qt relies upon. Open <strong>the\u00a0qt-everywhere-opensource-src-5.5.0\\qtbase\\mkspecs\\win32-g++\\qmake.conf<\/strong> file and add <strong>-U__STRICT_ANSI__<\/strong> to CXXFLAGS:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/06a-strictansi.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-782\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/06a-strictansi.png\" alt=\"06a-strictansi\" width=\"626\" height=\"426\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/06a-strictansi.png 626w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/06a-strictansi-300x204.png 300w\" sizes=\"(max-width: 626px) 100vw, 626px\" \/><\/a><\/li>\n<li>Now we can build the Windows tools. Create a directory (e.g. qt-build) and run the configuration script from there:\n<pre class=\"\">mkdir qt-build\r\ncd qt-build\r\n..\/qt-everywhere-opensource-src-5.5.0\/configure -platform win32-g++ -xplatform linux-arm-gnueabi-g++ -release -opengl es2 -device linux-rasp-pi2-g++ -sysroot C:\/SysGCC\/Raspberry\/arm-linux-gnueabihf\/sysroot -prefix \/usr\/local\/qt5<\/pre>\n<p><a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/07-buildqmake1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-785\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/07-buildqmake1.png\" alt=\"07-buildqmake\" width=\"677\" height=\"606\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/07-buildqmake1.png 677w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/07-buildqmake1-300x269.png 300w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a>Note the &#8220;-opengl es2&#8221; option that configures Qt to use the Raspberry Pi framebuffer directly instead of the X11 system.<\/li>\n<li>Eventually the build should fail complaining about the errors to process specs for the raspberry device:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/08-fail.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-784\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/08-fail.png\" alt=\"08-fail\" width=\"677\" height=\"342\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/08-fail.png 677w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/08-fail-300x152.png 300w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a><\/li>\n<li>This is normal as long as qmake.exe got built. Check this by running &#8220;qtbase\/bin\/qmake -v&#8221;:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/09-qmake.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-786\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/09-qmake.png\" alt=\"09-qmake\" width=\"677\" height=\"246\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/09-qmake.png 677w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/09-qmake-300x109.png 300w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a><\/li>\n<li>Now we can build the rest of the Qt framework. First of all open the <strong>qtbase\\configure<\/strong> file and replace the condition before the &#8220;Creating qmake line&#8221; with this one:\n<pre class=\"\">if [ '!' -f \"$outpath\/bin\/qmake.exe\" ]; then<\/pre>\n<p><a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/10-configure.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-787\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/10-configure.png\" alt=\"10-configure\" width=\"626\" height=\"426\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/10-configure.png 626w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/10-configure-300x204.png 300w\" sizes=\"(max-width: 626px) 100vw, 626px\" \/><\/a><\/li>\n<li>Start the configure script again, this time adding the following argument to the end of the previous command line:\n<pre class=\"\">-device-option CROSS_COMPILE=C:\/SysGCC\/Raspberry\/bin\/arm-linux-gnueabihf- -qt-xcb<\/pre>\n<p><a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/11-configured.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-788\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/11-configured.png\" alt=\"11-configured\" width=\"677\" height=\"738\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/11-configured.png 677w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/11-configured-275x300.png 275w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a>The -device-option is required when using the device specification, however if you specify it while building Qmake, the Qt build system will try to use the cross-compiler to build the Windows Qmake executable that will obviously fail.<\/p>\n<p>If you get errors while configuring Qt, please check that:<\/p>\n<ul>\n<li>Your &lt;toolchain&gt;\\sysroot\\etc\\ld.so.conf file contains the following lines:\n<pre class=\"\">\/opt\/vc\/lib\r\n\/lib\/arm-linux-gnueabihf\r\n\/usr\/lib\/arm-linux-gnueabihf\r\n\/usr\/lib\/arm-linux-gnueabihf\/libfakeroot\r\n\/usr\/local\/lib<\/pre>\n<\/li>\n<li>Your toolchain sysroot directory contains the \/opt\/vc directory<\/li>\n<\/ul>\n<p>If nothing helps, run the configure script with the <strong>-verbose<\/strong> argument and direct its output to a file by appending &#8220;<strong>&gt;log.txt 2&gt;&amp;1<\/strong>&#8221; to the command line. This should provide more information on what exactly is causing the problem.<\/li>\n<li>Once the configure script reports that the configuration is complete, run the &#8220;make &amp;&amp; make install&#8221; command to build the entire Qt framework and install it into the cross-compiler directory. The framework is huge, so the build process might take several hours to complete, even on a fast machine.<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/12-builddone.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-793\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/12-builddone.png\" alt=\"12-builddone\" width=\"677\" height=\"294\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/12-builddone.png 677w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/12-builddone-300x130.png 300w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a>Warning: do not run &#8220;make install&#8221; before &#8220;make&#8221; succeeds as it would fail leaving the build directory in a partially built state failing further builds until the entire directory is deleted and re-created.<\/li>\n<li>Open SmarTTY (a portable version can be found in &lt;SysGCC&gt;\\Raspberry\\TOOLS\\PortableSmartty) and connect to your Raspberry Pi. Then run the following commands to create the \/usr\/local\/qt5 folder and make it writable to the current user:\n<pre class=\"\">cd \/usr\/local\r\nsudo mkdir qt5\r\nsudo chown pi qt5<\/pre>\n<p>Then select SCP-&gt;Upload directory:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/13-mkdir.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-796\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/13-mkdir.png\" alt=\"13-mkdir\" width=\"671\" height=\"397\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/13-mkdir.png 671w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/13-mkdir-300x177.png 300w\" sizes=\"(max-width: 671px) 100vw, 671px\" \/><\/a><\/li>\n<li>Select the &lt;sysroot&gt;\\usr\\local\\qt5 directory and upload it to \/usr\/local\/qt5:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/14-upload.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-795\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/14-upload.png\" alt=\"14-upload\" width=\"589\" height=\"181\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/14-upload.png 589w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/14-upload-300x92.png 300w\" sizes=\"(max-width: 589px) 100vw, 589px\" \/><\/a><\/li>\n<li>Wait for the upload to complete. The built Qt framework is relatively large and would take several minutes to upload:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/15-progr.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-797\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/15-progr.png\" alt=\"15-progr\" width=\"530\" height=\"181\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/15-progr.png 530w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/15-progr-300x102.png 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/a><\/li>\n<li>Once the upload is complete, you can test out the framework. Go to the <strong>\/usr\/local\/qt5\/examples\/opengl\/qopenglwidget<\/strong> directory and launch <strong>.\/qopenglwidget<\/strong>:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/16-widget.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-798\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/16-widget.png\" alt=\"16-widget\" width=\"693\" height=\"340\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/16-widget.png 693w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/16-widget-300x147.png 300w\" sizes=\"(max-width: 693px) 100vw, 693px\" \/><\/a><\/li>\n<li>Look at the screen connected to the HDMI port of the Raspberry Pi. You will see a rotating Qt logo animation: <a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/17-screenshot.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-799\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/17-screenshot.png\" alt=\"17-screenshot\" width=\"700\" height=\"438\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/17-screenshot.png 700w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/09\/17-screenshot-300x188.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a>If the screen does not show anything, shut down your Raspberry Pi and re-plug the power connector. As long as the screen is connected when the device is powered on, Raspberry Pi should recognize it.<\/li>\n<\/ol>\n<p>Now that you have cross-compiled the Qt framework for your Raspberry, follow <a href=\"http:\/\/visualgdb.com\/tutorials\/raspberry\/qt\/embedded\/app\/\">this tutorial<\/a> to create and build a basic Qt application using the same cross-compiler.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This tutorial shows how to cross-compile the Embedded build of Qt 5.5 for Raspberry Pi 2. The Embedded build does<\/p>\n","protected":false},"author":1,"featured_media":800,"comment_status":"closed","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[72,33,46,43],"_links":{"self":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/774"}],"collection":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/comments?post=774"}],"version-history":[{"count":11,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/774\/revisions"}],"predecessor-version":[{"id":1191,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/774\/revisions\/1191"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/media\/800"}],"wp:attachment":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/media?parent=774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/categories?post=774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/tags?post=774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}