<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.webos-internals.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Herrie</id>
	<title>WebOS Internals - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.webos-internals.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Herrie"/>
	<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/wiki/Special:Contributions/Herrie"/>
	<updated>2026-04-15T07:48:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22047</id>
		<title>Packaging Standards</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22047"/>
		<updated>2015-06-10T09:43:30Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* Version 2.6 (Draft, LuneOS compatibility) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''This page will document the agreed packaging standards for webOS homebrew ipkg files and open standard ipkg feeds as well as act as a whiteboard for new revisions.'''}}&lt;br /&gt;
&lt;br /&gt;
'''Please note, ipkg/libipkg has an internal, hard coded buffer of 8k to handle parsing the feed elements for each package. This means that description fields need to get reduced in length to prevent segfaults.'''&lt;br /&gt;
&lt;br /&gt;
Note that a package record in a Packages file starts with the &amp;quot;Package:&amp;quot; field, and ends with an empty line.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTE1: New fields are in bold red''&lt;br /&gt;
&lt;br /&gt;
''NOTE2: Modified fields are in bold black''&lt;br /&gt;
&lt;br /&gt;
==Version 2.6 (Draft, LuneOS compatibility)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;) LuneOS uses version number 3.5 optionally suffixed with &amp;quot;:luneos:&amp;lt;stage number&amp;gt;&amp;quot; so it could read &amp;quot;3.5.0:luneos:35&amp;quot; for example. Stage numbers can be found in https://github.com/webOS-ports/changelog/blob/master/manifest.json and are called &amp;quot;version&amp;quot; the latest version of LuneOS can be found under &amp;quot;platformVersion&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;) LuneOS uses version number 3.5 optionally suffixed with &amp;quot;:luneos:&amp;lt;stage number&amp;gt;&amp;quot; so it could read &amp;quot;3.5.0:luneos:35&amp;quot; for example. Stage numbers can be found in https://github.com/webOS-ports/changelog/blob/master/manifest.json and are called &amp;quot;version&amp;quot; the latest version of LuneOS can be found under &amp;quot;platformVersion&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.5==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.4==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| '''Location''' || '''Download URL for the package, if it is not in the same URL path as the Packages file'''&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| '''MinWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''MaxWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''DeviceCompatibility''' || '''JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Countries''' || '''JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Languages''' || '''JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.3==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Version 2.2==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). '''Maximum size is 4096 characters.'''&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| '''Price''' || '''Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| '''PostUpdateFlags''' || '''RestartLuna, RestartJava, RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.1==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (includes html?)&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=WebOS_Internals_PDK&amp;diff=22045</id>
		<title>WebOS Internals PDK</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=WebOS_Internals_PDK&amp;diff=22045"/>
		<updated>2015-04-24T18:45:12Z</updated>

		<summary type="html">&lt;p&gt;Herrie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: SDL]]&lt;br /&gt;
Palm's binary sdk  the &amp;quot;Plugin Developer Kit&amp;quot; became available to all developers in March 2010.&lt;br /&gt;
&lt;br /&gt;
When the widk was developed, the Palm PDK didn't exist, and until Dec 2010, it was not possible to run the PDK in Linux.  If you would like to run the official Palm PDK, see [[PDK on Linux]] for directions.&lt;br /&gt;
&lt;br /&gt;
In addition to the PDK, webOS Internals has released a full &amp;quot;WIDK&amp;quot; (webOS Internals Development Kit) for you using Scratchbox2.  &lt;br /&gt;
&lt;br /&gt;
Less than 10% of developers in the webOS developer community use Linux variants. Among those 10% there are dozens of different linux distributions that people use. Palm, therefore has chosen to support only Mac and Windows platforms for their PDK.  Palm recommends that Linux based developers use the webOS-internals WIDK instead.  &lt;br /&gt;
&lt;br /&gt;
We ''strongly'' urge the open-source homebrew community to standardize on this WIDK.   It uses the same underlying technologies, and is entirely open.  &lt;br /&gt;
&lt;br /&gt;
Scratchbox 2 is a cross-compilation engine, it can be used to create a highly flexible SDK.&lt;br /&gt;
&lt;br /&gt;
As installed below, the install process uses a script which extracts the required Palm provided files from a copy of webOS doctor, and  downloads from other sources, and builds a complete compilation environment automatically which can compile SDL and openGLES apps for webOS.  &lt;br /&gt;
&lt;br /&gt;
SB2 ''itself'' is totally distribution neutral but the webOS cross-compile environment is designed and tested on Ubuntu Server 11.04 32 bit. See [[WebOS_Internals_PDK_on_Mandriva]] if you want to run it on Mandriva.  If you want to run the WIDK on other distributions and are willing to support that yourself and not ask webOS Internals any questions about it then please enjoy and if you succeed come back here and make a new article on how you did it.  Otherwise, use the recommended OS.&lt;br /&gt;
&lt;br /&gt;
The webOS Internals team ''strongly suggest'' apt-get install into the Ubuntu environment only for this purpose. The same installation of Sun Virtualbox which hosts the Palm SDK emulator can host an Ubuntu 11.04 server with very little effort on any operating system. &lt;br /&gt;
&lt;br /&gt;
Developers wanting to work in a Gentoo environment 'without' SB2 can consider using the [http://www.webos-internals.org/wiki/Gentoo_NDK PuffTheMagic NDK].&lt;br /&gt;
&lt;br /&gt;
== Installing Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
You can download VirtualBox here : https://www.virtualbox.org/wiki/Downloads &amp;lt;BR&amp;gt;&lt;br /&gt;
You can download ISO files to burn Ubuntu CD or DVD here : http://www.ubuntu.com/download/ubuntu/download &amp;lt;BR&amp;gt;&lt;br /&gt;
but if you want to spend a litle time for installing Ubuntu in VirtualBox, then use Ubunbu image available here : http://virtualboxes.org/images/ubuntu/ &amp;lt;BR&amp;gt;&lt;br /&gt;
After installing your ubuntu image, don't forget to use bridge network configuration in Virtualbox. &lt;br /&gt;
Then in the Ubuntu console, type  : &lt;br /&gt;
 sudo apt-get install telnet ssh virtualbox-ose&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get upgrade&lt;br /&gt;
In the Ubuntu desktop menu, go in System -&amp;gt; Preferences -&amp;gt; Keyboard -&amp;gt; Layouts tab to change the keyboard type.&lt;br /&gt;
Then next reboot your ubuntu.&lt;br /&gt;
&lt;br /&gt;
==SB2 Homepage==&lt;br /&gt;
[http://www.freedesktop.org/wiki/Software/sbox2 http://www.freedesktop.org/wiki/Software/sbox2]pdk&lt;br /&gt;
&lt;br /&gt;
==License==&lt;br /&gt;
Scratchbox 2 is distributed under LGPL version 2.1, portions are under GPL version 2. Some minor stuff is under MIT style license.&lt;br /&gt;
&lt;br /&gt;
== Installation on Ubuntu for webOS PDK cross compiling ==&lt;br /&gt;
&lt;br /&gt;
If setting up in a Virtual Box instance, it is recommended that you first complete the openSSH config as described in the VirtualBox tips for Windows users to the right.  This is helpful even with a Linux host, as SSH into the PDK Virtual Machine will allow copy and paste of the commands listed below and reduce errors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; clear:right; width:30%&amp;quot;&amp;gt;{{Ubuntu_VM_notes_for_Windows_users}}&amp;lt;/div&amp;gt;&lt;br /&gt;
===Toolchain===&lt;br /&gt;
&lt;br /&gt;
===Prerequisites===&lt;br /&gt;
Your Ubuntu installation will need the following installed.  If you do not have them, run the command after the package name. You can test if they are found by just typing the command name.  If it says command not found, you need to install it.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|'''git''' || sudo apt-get install git-core&lt;br /&gt;
|-&lt;br /&gt;
|'''gcc''' || sudo apt-get install build-essential&lt;br /&gt;
|-&lt;br /&gt;
|'''curl''' || sudo apt-get install curl&lt;br /&gt;
|-&lt;br /&gt;
|'''unzip'''|| sudo apt-get install unzip&lt;br /&gt;
|-&lt;br /&gt;
|'''7zip *'''|| sudo apt-get install p7zip-full&lt;br /&gt;
|-&lt;br /&gt;
|'''autoconf'''|| sudo apt-get install autoconf&lt;br /&gt;
|-&lt;br /&gt;
|'''subversion'''|| sudo apt-get install subversion&lt;br /&gt;
|-&lt;br /&gt;
|'''libtool'''|| sudo apt-get install libtool&lt;br /&gt;
|-&lt;br /&gt;
|'''wget'''|| sudo apt-get install wget&lt;br /&gt;
|-&lt;br /&gt;
|'''pkg-config'''|| sudo apt-get install pkg-config&lt;br /&gt;
|-&lt;br /&gt;
|'''gettext'''|| sudo apt-get install gettext&lt;br /&gt;
|-&lt;br /&gt;
|'''fakeroot'''|| sudo apt-get install fakeroot&lt;br /&gt;
|-&lt;br /&gt;
|'''javac *'''|| sudo apt-get install sun-java6-jdk (if this command line does not work, then do :  sudo add-apt-repository ppa:ferramroberto/java; sudo apt-get update; sudo apt-get install sun-java6-jdk )&lt;br /&gt;
|-&lt;br /&gt;
|'''ant'''|| sudo apt-get install ant&lt;br /&gt;
|-&lt;br /&gt;
|'''cmake'''|| sudo apt-get install cmake&lt;br /&gt;
|-&lt;br /&gt;
|'''xsltproc'''|| sudo apt-get install xsltproc&lt;br /&gt;
|-&lt;br /&gt;
|'''intltool'''|| sudo apt-get install intltool&lt;br /&gt;
|-&lt;br /&gt;
|'''mkimage'''|| sudo apt-get install uboot-mkimage&lt;br /&gt;
|-&lt;br /&gt;
|'''lsdiff'''|| sudo apt-get install patchutils&lt;br /&gt;
|-&lt;br /&gt;
|'''flex'''|| sudo apt-get install flex&lt;br /&gt;
|-&lt;br /&gt;
|'''bison'''|| sudo apt-get install bison&lt;br /&gt;
|-&lt;br /&gt;
|'''libssl-dev'''|| sudo apt-get install libssl-dev&lt;br /&gt;
|-&lt;br /&gt;
|'''zlib1g-dev'''|| sudo apt-get install zlib1g-dev&lt;br /&gt;
|-&lt;br /&gt;
|'''libbz2-dev'''|| sudo apt-get install libbz2-dev&lt;br /&gt;
|-&lt;br /&gt;
|'''xar *'''|| sudo apt-get install xar&lt;br /&gt;
|-&lt;br /&gt;
|'''help2man'''|| sudo apt-get install help2man&lt;br /&gt;
|-&lt;br /&gt;
|'''texinfo'''|| sudo apt-get install texinfo&lt;br /&gt;
|-&lt;br /&gt;
|'''automake 1.10'''|| sudo apt-get install automake1.10&lt;br /&gt;
|-&lt;br /&gt;
|'''autopoint'''|| sudo apt-get install autopoint&lt;br /&gt;
|-&lt;br /&gt;
|'''xutils-dev'''|| sudo apt-get install xutils-dev&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 7-Zip version 4.59 or greater is needed&lt;br /&gt;
* it has been reported that sun-java6-jdk isn't necessary&lt;br /&gt;
* On Ubuntu 11.04 xar might not install using &amp;lt;code&amp;gt;sudo apt-get install xar&amp;lt;/code&amp;gt; See Note 2 Below&lt;br /&gt;
&lt;br /&gt;
If you're uncertain at all, and you're using Ubuntu 11.04, just cut and paste the following.  If they are already installed, they'll be skipped. xar is not included in the code below.&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install git-core build-essential curl unzip p7zip-full autoconf subversion libtool wget pkg-config gettext fakeroot ant xsltproc intltool uboot-mkimage patchutils flex bison libssl-dev zlib1g-dev libbz2-dev help2man texinfo automake1.10 autopoint xutils-dev cmake&lt;br /&gt;
&lt;br /&gt;
'''Note:''' If you are a beginner with Ubuntu Linux Distribution, you should update all the packages on your system to avoid problems when you will compile.&lt;br /&gt;
&lt;br /&gt;
'''Note 2:''' If &amp;lt;code&amp;gt;xar&amp;lt;/code&amp;gt; cannot be installed with &amp;lt;code&amp;gt;sudo apt-get install xar&amp;lt;/code&amp;gt;, then you have to download two &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt;-files manually and install them (in the order they are listed):&lt;br /&gt;
* If you're using Ubuntu 11.04:&lt;br /&gt;
# [http://packages.ubuntu.com/hardy/libxar1 libxar1]&lt;br /&gt;
# [http://packages.ubuntu.com/hardy/xar xar]&lt;br /&gt;
* If you're using Ubuntu 12.04:&lt;br /&gt;
# [http://ftp.acc.umu.se/mirror/temp/ubuntu-test/ubuntu/pool/universe/x/xar/ libxar1 and xar]&lt;br /&gt;
* If you're using Debian 6.0.2 (Squeeze):&lt;br /&gt;
# [http://packages.debian.org/lenny/libxar1 libxar1]&lt;br /&gt;
# [http://packages.debian.org/lenny/xar xar]&lt;br /&gt;
&lt;br /&gt;
If you have not xar packages in your repo, then find the files in the previous links and next install manually xar files :&lt;br /&gt;
 sudo dpkg -i libxar1_1.5.1-1_i386.deb xar_1.5.1-1_i386.deb&lt;br /&gt;
&lt;br /&gt;
After that execute the above command again.&lt;br /&gt;
&lt;br /&gt;
Use these 2 command line :&amp;lt;BR&amp;gt;&lt;br /&gt;
Update repositories   :&lt;br /&gt;
 sudo aptitude update (if it doesn't work use : sudo apt-get update )&lt;br /&gt;
And next, update the packages :&lt;br /&gt;
 sudo aptitude safe-upgrade (if it doesn't work use : sudo apt-get upgrade )&lt;br /&gt;
&lt;br /&gt;
If you're on a 64-bit system, you will also need to install the ia32-libs package.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The ''make toolchain'' command and later steps will download approximately a half-gig of tools and sources from various locations.  Do not start this if you do not have time for a large download.  Additionally, if you already have downloaded a copy of the correct version of the WebOS doctor, you can reduce the download time by copying the doctor file into cross-compile/doctors/ with the correct name.  This will cause the appropriate command to skip that download.  Note that codesourcery rate limts downloads and at a minimum this process will take 10 to 15 minutes irrespective of your connection speed. &lt;br /&gt;
&lt;br /&gt;
====Start setup====&lt;br /&gt;
Create a preware folder, copy the cross-compile tools into it (if you have not installed git, apt-get install git-core), and use a make script to begin the set up of the compilation toolchain. &lt;br /&gt;
&lt;br /&gt;
 sudo mkdir -p /srv/preware&lt;br /&gt;
 cd /srv/preware&lt;br /&gt;
 sudo chmod 777 .&lt;br /&gt;
 git clone git://git.webos-internals.org/preware/cross-compile.git&lt;br /&gt;
 cd cross-compile&lt;br /&gt;
 make toolchain&lt;br /&gt;
&lt;br /&gt;
If errors occur, browse the [http://git.webos-internals.org/preware/cross-compile/ repository online] and checkout earlier commits until you get something that gets through &amp;quot;make toolchain&amp;quot; and the later &amp;quot;make stage&amp;quot; commands like so:&lt;br /&gt;
&lt;br /&gt;
 git checkout &amp;lt;commit-ish&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
 $ cd /srv/preware/cross-compile/&lt;br /&gt;
 $ ls -la&lt;br /&gt;
 drwxr-xr-x  8 ubuntu ubuntu 4096 2011-12-31 17:33 .git&lt;br /&gt;
 -rwxr-xr-x  1 ubuntu ubuntu   79 2011-12-31 17:33 .gitignore&lt;br /&gt;
 $ git branch&lt;br /&gt;
 * master&lt;br /&gt;
 $ git checkout master&lt;br /&gt;
 Already on 'master'&lt;br /&gt;
 $ git checkout&lt;br /&gt;
 $ ls -la&lt;br /&gt;
 drwxr-xr-x  8 ubuntu ubuntu 4096 2012-01-09 12:09 .git&lt;br /&gt;
 -rwxr-xr-x  1 ubuntu ubuntu   79 2011-12-31 17:33 .gitignore&lt;br /&gt;
&lt;br /&gt;
====Verify sh shell====&lt;br /&gt;
On Ubuntu /bin/sh is a symbolic link to dash.  This will cause errors with the make stage command below, as some of the scripts assume bash.  Run the following command to see what shell sh is linked to.&lt;br /&gt;
&lt;br /&gt;
  ls -l /bin/sh&lt;br /&gt;
&lt;br /&gt;
If the result is a link to dash:&lt;br /&gt;
&lt;br /&gt;
  lrwxrwxrwx 1 root root 4 2010-07-06 23:55 /bin/sh -&amp;gt; dash&lt;br /&gt;
&lt;br /&gt;
You will want to correct it with the following:&lt;br /&gt;
&lt;br /&gt;
  sudo dpkg-reconfigure dash&lt;br /&gt;
&lt;br /&gt;
You will be asked if you want to &amp;quot;Install dash as /bin/sh?&amp;quot;.  Select &amp;quot;&amp;lt;No&amp;gt;&amp;quot; and bash will be used.  Rerun the command to verify:&lt;br /&gt;
&lt;br /&gt;
  ls -l /bin/sh&lt;br /&gt;
&lt;br /&gt;
You should now see:&lt;br /&gt;
&lt;br /&gt;
  lrwxrwxrwx 1 root root 4 2010-07-09 21:12 /bin/sh -&amp;gt; bash&lt;br /&gt;
&lt;br /&gt;
====Setup Scratchbox====&lt;br /&gt;
Now, use apt-get to setup scratchbox...&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install scratchbox2 qemu-kvm-extras (in Debian install qemu-user and qemu-system instead of qemu-kvm-extras)&lt;br /&gt;
&lt;br /&gt;
...and set it up for compiling for webOS. &lt;br /&gt;
&lt;br /&gt;
 cd /srv/preware/cross-compile/toolchain/arm-2007q3/arm-none-linux-gnueabi/libc&lt;br /&gt;
 PATH=/srv/preware/cross-compile/toolchain/arm-2007q3/bin:${PATH} sb2-init -c /usr/bin/qemu-arm armv7 arm-none-linux-gnueabi-gcc&lt;br /&gt;
 PATH=/srv/preware/cross-compile/toolchain/arm-2007q3/bin:${PATH} sb2-init -c /usr/bin/qemu-arm armv6 arm-none-linux-gnueabi-gcc&lt;br /&gt;
 cd /srv/preware/cross-compile&lt;br /&gt;
&lt;br /&gt;
On some distributions such as recent Debian and Ubuntu, you'll have compiler problems with these values - use sb2-qemu-arm instead of qemu-arm in the sb2-init command lines above.&lt;br /&gt;
&lt;br /&gt;
Then:&lt;br /&gt;
&lt;br /&gt;
 make setup&lt;br /&gt;
&lt;br /&gt;
Once this setup is complete, compiling sdl apps for webOS is very simple. Note that the set up for i686 is not yet determined.&lt;br /&gt;
&lt;br /&gt;
==Verified installed clean list==&lt;br /&gt;
&lt;br /&gt;
If you have successfully built the WIDK from scratch, with NO problems, feel free to add your information to this list.  This will help us assess what distributions and versions it is fully compatible with.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''IRC name'''&lt;br /&gt;
|'''Linux Distribution'''&lt;br /&gt;
|'''Version'''&lt;br /&gt;
|'''Date'''&lt;br /&gt;
|'''Comments'''&lt;br /&gt;
|-&lt;br /&gt;
|Scoutcamper&lt;br /&gt;
|Ubuntu&lt;br /&gt;
|9.04,9.10,10.04,10.10&lt;br /&gt;
|10-18-10&lt;br /&gt;
|Works Great!&lt;br /&gt;
|-&lt;br /&gt;
|elpollodiablo1&lt;br /&gt;
|Ubuntu&lt;br /&gt;
|11.04&lt;br /&gt;
|7-13-11&lt;br /&gt;
|Works With updated Wiki Info&lt;br /&gt;
|-&lt;br /&gt;
|nebula&lt;br /&gt;
|Ubuntu&lt;br /&gt;
|11.04&lt;br /&gt;
|9-7-11&lt;br /&gt;
|It works!&lt;br /&gt;
|-&lt;br /&gt;
|yannick56&lt;br /&gt;
|Ubuntu&lt;br /&gt;
|11.04&lt;br /&gt;
|12-31-11&lt;br /&gt;
|Works With updated Wiki Info&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Errors during make stage ==&lt;br /&gt;
&lt;br /&gt;
===automake1.10===&lt;br /&gt;
&lt;br /&gt;
If you see the error below, you need the latest automake (1.10)&lt;br /&gt;
&lt;br /&gt;
 /usr/share/automake-1.9/am/depend2.am: am__fastdepOBJC does not appear in AM_CONDITIONAL&lt;br /&gt;
 configure.in:88: installing `./config.guess'&lt;br /&gt;
 configure.in:88: installing `./config.sub'&lt;br /&gt;
 Makefile.am: installing `./INSTALL'&lt;br /&gt;
 autoreconf2.50: automake failed with exit status: 1&lt;br /&gt;
&lt;br /&gt;
Install automake1.10 and it should work (according to [http://old.nabble.com/AC_PROG_OBJC-and-automake-1.9-td22434760.html this page])&lt;br /&gt;
&lt;br /&gt;
===Fix mmap errors===&lt;br /&gt;
The following commands appear redundant.  They are not.  The install this fixes your mmap config to fix an mmap: permission denied error, but we don't need the package itself. (Do each command separately with cut and paste).&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install qemu-arm-static&lt;br /&gt;
 sudo apt-get remove qemu-arm-static&lt;br /&gt;
&lt;br /&gt;
It appears that this package has been renamed qemu-kvm-extras-static in Ubuntu 11.04.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;span style=&amp;quot;font-size:150%&amp;quot;&amp;gt;OR&amp;lt;/span&amp;gt; As a workaround, if this package is not available, &lt;br /&gt;
::: the following commands can be executed in a root shell (sudo -s) to fix the mmap configuration to enable qemu-arm to work.&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;vm.mmap_min_addr = 4096&amp;quot; &amp;gt; /etc/sysctl.d/mmap_min_addr.conf&lt;br /&gt;
 /etc/init.d/procps restart&lt;br /&gt;
&lt;br /&gt;
(note that the value should not be &amp;quot;0&amp;quot;. 4096 is chosen to avoid null pointer attacks.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Libtool===&lt;br /&gt;
&lt;br /&gt;
 make[5]: Entering directory `/srv/preware/cross-compile/packages/common/libdotconf/build/armv6/src'&lt;br /&gt;
 /bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I..    -Wall -g -O2 -MT libdotconf_la-dotconf.lo -MD -MP -MF .deps/libdotconf_la-dotconf.Tpo -c -o libdotconf_la-dotconf.lo `test -f 'dotconf.c' || echo './'`dotconf.c&lt;br /&gt;
 libtool: Version mismatch error.  This is libtool 2.2.6b, but the&lt;br /&gt;
 libtool: definition of this LT_INIT comes from libtool 2.2.6.&lt;br /&gt;
 libtool: You should recreate aclocal.m4 with macros from libtool 2.2.6b&lt;br /&gt;
 libtool: and run autoconf again.&lt;br /&gt;
 make[5]: *** [libdotconf_la-dotconf.lo] Error 63&lt;br /&gt;
 make[5]: Leaving directory `/srv/preware/cross-compile/packages/common/libdotconf/build/armv6/src'&lt;br /&gt;
 make[4]: *** [install-recursive] Error 1&lt;br /&gt;
 make[4]: Leaving directory `/srv/preware/cross-compile/packages/common/libdotconf/build/armv6'&lt;br /&gt;
 make[3]: *** [build/armv6.built] Error 2&lt;br /&gt;
 make[3]: Leaving directory `/srv/preware/cross-compile/packages/common/libdotconf'&lt;br /&gt;
 make[2]: *** [build_common/libdotconf] Error 2&lt;br /&gt;
 make[2]: Leaving directory `/srv/preware/cross-compile'&lt;br /&gt;
 make[1]: *** [staging-armv6] Error 2&lt;br /&gt;
 make[1]: Leaving directory `/srv/preware/cross-compile'&lt;br /&gt;
 make: *** [stage] Error 2&lt;br /&gt;
&lt;br /&gt;
Confirmed by 3 people. Fix this by either (your choice)&lt;br /&gt;
*upgrading to Ubuntu 10.04 or newer (the WIDK now relies on a slightly newer version of libtool that's not in 9.10 or earlier)&lt;br /&gt;
*updating libtool to 2.2.6b-2 (backported to 9.10, see available downloads on http://linuxappfinder.com/package/libtool#ubuntu_karmicpartner)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you're getting an error where sb2-init gives you the following output:&lt;br /&gt;
&lt;br /&gt;
 checking for gcc... gcc&lt;br /&gt;
 checking for C compiler default output file name... a.out&lt;br /&gt;
 checking whether the C compiler works... configure: error: cannot run C compiled programs.&lt;br /&gt;
 If you meant to cross compile, use `--host'.&lt;br /&gt;
 See `config.log' for more details.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Running /usr/bin/sb2-build-libtool failed&lt;br /&gt;
 You can run this manually later, otherwise your&lt;br /&gt;
 sb2 environment is correctly setup and ready to use&lt;br /&gt;
&lt;br /&gt;
You need to upgrade qemu. Alternatively, if your sb2-init output fails with a different output, like this:&lt;br /&gt;
&lt;br /&gt;
 checking for gcc... gcc&lt;br /&gt;
 checking for C compiler default output file name... a.out&lt;br /&gt;
 checking whether the C compiler works... configure: error: cannot run C compiled programs.&lt;br /&gt;
 If you meant to cross compile, use `--host'.&lt;br /&gt;
 See `config.log' for more details.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 sb2-init completed successfully, have fun!&lt;br /&gt;
&lt;br /&gt;
Then you need to upgrade scratchbox, too (install 2.0 instead of 1.99).&lt;br /&gt;
&lt;br /&gt;
=== ecore ===&lt;br /&gt;
*TRUE and FALSE are not defined:&lt;br /&gt;
Manually add the definition:&lt;br /&gt;
&lt;br /&gt;
 #ifndef TRUE&lt;br /&gt;
 # define TRUE 1&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
 #ifndef FALSE&lt;br /&gt;
 # define FALSE 0&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;$po_makefile_in&amp;lt;/code&amp;gt; could not be found:&lt;br /&gt;
**Open the file &amp;lt;code&amp;gt;/srv/preware/cross-compile/packages/dev-e/ecore/build/src/configure.ac&amp;lt;/code&amp;gt; and search for the line with: &amp;lt;code&amp;gt;$po_makefile_in&amp;lt;/code&amp;gt; (in my case line 1437) and replace it with &amp;lt;code&amp;gt;po/Makefile.in&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== /bin/sh errors ===&lt;br /&gt;
If you are getting a &amp;quot;bad fd number&amp;quot; or other /bin/sh error, make sure your /bin/sh points to bash, not another shell (such as dash.)&lt;br /&gt;
&lt;br /&gt;
Go back through the Verify sh shell section above to correct.&lt;br /&gt;
&lt;br /&gt;
=== further download errors ===&lt;br /&gt;
&lt;br /&gt;
rwhitby's suggestion:&lt;br /&gt;
&lt;br /&gt;
If you don't need that package which is failing for you, just move it to the nonworking directory and try again.&lt;br /&gt;
&lt;br /&gt;
14 July 2011=Using Rod's approach: So far I had to move fuse, unionfs-fuse, dev-gl, voip and x (pango and pixman failed). Using Ubuntu 11.04.&lt;br /&gt;
&lt;br /&gt;
=== X--tag=CC: command not found ===&lt;br /&gt;
&lt;br /&gt;
While running '''make stage''' on Ubuntu 10.10, I got the following error during compilation of sdl-gfx:&lt;br /&gt;
&lt;br /&gt;
 /bin/sh ./libtool --tag=CC   --mode=compile gcc -DPACKAGE_NAME=\&amp;quot;\&amp;quot; -DPACKAGE_TARNAME=\&amp;quot;\&amp;quot; -DPACKAGE_VERSION=\&amp;quot;\&amp;quot; -DPACKAGE_STRING=\&amp;quot;\&amp;quot; -DPACKAGE_BUGREPORT=\&amp;quot;\&amp;quot; -DPACKAGE_URL=\&amp;quot;\&amp;quot; -DPACKAGE=\&amp;quot;SDL_gfx\&amp;quot; -DVERSION=\&amp;quot;2.0.20\&amp;quot; -DSTDC_HEADERS=1  -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1  -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\&amp;quot;.libs/\&amp;quot; -DX_DISPLAY_MISSING=1 -DBUILD_DLL -I.     -g -O2 -I/usr/local/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -MT SDL_gfxPrimitives.lo -MD -MP -MF .deps/SDL_gfxPrimitives.Tpo -c -o  SDL_gfxPrimitives.lo SDL_gfxPrimitives.c&lt;br /&gt;
 ./libtool: line 847: X--tag=CC: command not found&lt;br /&gt;
 ./libtool: line 880: libtool: ignoring unknown tag : command not found&lt;br /&gt;
 ./libtool: line 847: X--mode=compile: command not found&lt;br /&gt;
 ./libtool: line 1014: *** Warning: inferring the mode of operation is deprecated.: command not found&lt;br /&gt;
 ./libtool: line 1015: *** Future versions of Libtool will require --mode=MODE be specified.: command not found&lt;br /&gt;
 ./libtool: line 1158: Xgcc: command not found&lt;br /&gt;
 ./libtool: line 1158: X-DPACKAGE_NAME=&amp;quot;&amp;quot;: command not found&lt;br /&gt;
 ./libtool: line 1158: X-DPACKAGE_TARNAME=&amp;quot;&amp;quot;: command not found&lt;br /&gt;
&lt;br /&gt;
In order to fix this problem, I had to run this command to set &amp;lt;code&amp;gt;$echo&amp;lt;/code&amp;gt; (which gets used in line 847 of the libtool script):&lt;br /&gt;
&lt;br /&gt;
 export echo=echo&lt;br /&gt;
&lt;br /&gt;
and re-run &amp;lt;code&amp;gt;make stage&amp;lt;/code&amp;gt; in the same shell session.&lt;br /&gt;
&lt;br /&gt;
=== missing macro AM_PATH_SDL in making libsdl-gfx ===&lt;br /&gt;
In Ubuntu Server 11.04 amd64 I had to install the package libsdl1.2-dev to get past this.  I also needed the X--tag=CC fix above.&lt;br /&gt;
Also for Ubuntu 11.04 i386 install the package libsdl1.2-dev.&lt;br /&gt;
&lt;br /&gt;
=== virtualbox-ose missing ===&lt;br /&gt;
&lt;br /&gt;
I have the following error with Ubuntu 11.04 :&lt;br /&gt;
 ...&lt;br /&gt;
 Extracting  nova-cust-image-sdk1457.vmdk&lt;br /&gt;
 Everything is Ok&lt;br /&gt;
 Size:       397672448&lt;br /&gt;
 Compressed: 164460248&lt;br /&gt;
 VBoxManage clonehd rootfs/i686/extract/nova-cust-image-sdk1457.vmdk rootfs/i686/extract/nova-cust-image-sdk1457.raw --format RAW&lt;br /&gt;
 make: VBoxManage: Command not found&lt;br /&gt;
 make: *** [rootfs/i686/.unpacked] Error 127&lt;br /&gt;
&lt;br /&gt;
and I fix it by installing virtualbox-ose pakage as this :&lt;br /&gt;
 sudo apt-get install virtualbox-ose&lt;br /&gt;
&lt;br /&gt;
=== etags: command not found ===&lt;br /&gt;
&lt;br /&gt;
If staging fails during compilation of liblinphone (possibly other packages) with an error similar to the following:&lt;br /&gt;
&lt;br /&gt;
 (cd build/src; etags `find . -type f -print`)&lt;br /&gt;
 /bin/sh: etags: command not found&lt;br /&gt;
 make[2]: *** [build/.unpacked] Error 127&lt;br /&gt;
 make[2]: Leaving directory `/srv/preware/cross-compile/packages/voip/liblinphone'&lt;br /&gt;
 make[1]: *** [build_voip/liblinphone] Error 2&lt;br /&gt;
 make[1]: Leaving directory `/srv/preware/cross-compile'&lt;br /&gt;
 make: *** [stage-armv7] Error 2&lt;br /&gt;
&lt;br /&gt;
Then you need to install the emacs common package.  On Ubuntu the command you need is:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install emacs23-bin-common&lt;br /&gt;
&lt;br /&gt;
=== xorg-xserver: must install fontutil ===&lt;br /&gt;
&lt;br /&gt;
If staging fails during compilation of xorg-xserver with an error similar to the following:&lt;br /&gt;
&lt;br /&gt;
 autoreconf: Entering directory `.'&lt;br /&gt;
 autoreconf: configure.ac: not using Gettext&lt;br /&gt;
 autoreconf: running: aclocal --force -I m4&lt;br /&gt;
 configure.ac:43: error: must install fontutil 1.1 or later before running autoconf/autogen&lt;br /&gt;
 configure.ac:43: the top level&lt;br /&gt;
 autom4te: /usr/bin/m4 failed with exit status: 1&lt;br /&gt;
&lt;br /&gt;
Then you need to install the xfonts-utils package.  On Ubuntu the command you need is:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install xfonts-utils&lt;br /&gt;
&lt;br /&gt;
==Sample build of [[Application:Doom]]==&lt;br /&gt;
&lt;br /&gt;
Now, go to [[Building DOOM with scratchbox2]] and follow the simple directions.&lt;br /&gt;
&lt;br /&gt;
==In Process Enhancements==&lt;br /&gt;
[[Extracting the PDK on Linux]]&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22035</id>
		<title>Packaging Standards</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22035"/>
		<updated>2014-12-05T14:07:58Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* Version 2.6 (Draft, LuneOS compatibility) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''This page will document the agreed packaging standards for webOS homebrew ipkg files and open standard ipkg feeds as well as act as a whiteboard for new revisions.'''}}&lt;br /&gt;
&lt;br /&gt;
'''Please note, ipkg/libipkg has an internal, hard coded buffer of 8k to handle parsing the feed elements for each package. This means that description fields need to get reduced in length to prevent segfaults.'''&lt;br /&gt;
&lt;br /&gt;
Note that a package record in a Packages file starts with the &amp;quot;Package:&amp;quot; field, and ends with an empty line.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTE1: New fields are in bold red''&lt;br /&gt;
&lt;br /&gt;
''NOTE2: Modified fields are in bold black''&lt;br /&gt;
&lt;br /&gt;
==Version 2.6 (Draft, LuneOS compatibility)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|-&lt;br /&gt;
| DevelopmentFramework || Mojo, Mojo 2, Enyo, Enyo 2, PDK etc&lt;br /&gt;
|-&lt;br /&gt;
| MinLuneOSVersion || Stage number as per http://webos-ports.org/wiki/Change_Log this is linked to the release names&lt;br /&gt;
|-&lt;br /&gt;
| MaxLuneOSVersion || Stage number as per http://webos-ports.org/wiki/Change_Log this is linked to the release names&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.5==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.4==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| '''Location''' || '''Download URL for the package, if it is not in the same URL path as the Packages file'''&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| '''MinWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''MaxWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''DeviceCompatibility''' || '''JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Countries''' || '''JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Languages''' || '''JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.3==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Version 2.2==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). '''Maximum size is 4096 characters.'''&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| '''Price''' || '''Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| '''PostUpdateFlags''' || '''RestartLuna, RestartJava, RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.1==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (includes html?)&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22033</id>
		<title>Packaging Standards</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22033"/>
		<updated>2014-12-04T14:22:13Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* Version 2.6 (Draft, LuneOS compatibility) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''This page will document the agreed packaging standards for webOS homebrew ipkg files and open standard ipkg feeds as well as act as a whiteboard for new revisions.'''}}&lt;br /&gt;
&lt;br /&gt;
'''Please note, ipkg/libipkg has an internal, hard coded buffer of 8k to handle parsing the feed elements for each package. This means that description fields need to get reduced in length to prevent segfaults.'''&lt;br /&gt;
&lt;br /&gt;
Note that a package record in a Packages file starts with the &amp;quot;Package:&amp;quot; field, and ends with an empty line.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTE1: New fields are in bold red''&lt;br /&gt;
&lt;br /&gt;
''NOTE2: Modified fields are in bold black''&lt;br /&gt;
&lt;br /&gt;
==Version 2.6 (Draft, LuneOS compatibility)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|-&lt;br /&gt;
| DevelopmentFramework (draft) || Mojo, Enyo1, Enyo2, PDK&lt;br /&gt;
|-&lt;br /&gt;
| MinLuneOSVersion (draft) || Version name / stage number (tbd)&lt;br /&gt;
|-&lt;br /&gt;
| MaxLuneOSVersion (draft) || Version name / stage number (tbd)&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.5==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.4==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| '''Location''' || '''Download URL for the package, if it is not in the same URL path as the Packages file'''&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| '''MinWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''MaxWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''DeviceCompatibility''' || '''JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Countries''' || '''JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Languages''' || '''JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.3==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Version 2.2==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). '''Maximum size is 4096 characters.'''&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| '''Price''' || '''Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| '''PostUpdateFlags''' || '''RestartLuna, RestartJava, RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.1==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (includes html?)&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22031</id>
		<title>Packaging Standards</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22031"/>
		<updated>2014-12-04T14:08:04Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* Version 2.6 (Draft, LuneOS compatibility) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''This page will document the agreed packaging standards for webOS homebrew ipkg files and open standard ipkg feeds as well as act as a whiteboard for new revisions.'''}}&lt;br /&gt;
&lt;br /&gt;
'''Please note, ipkg/libipkg has an internal, hard coded buffer of 8k to handle parsing the feed elements for each package. This means that description fields need to get reduced in length to prevent segfaults.'''&lt;br /&gt;
&lt;br /&gt;
Note that a package record in a Packages file starts with the &amp;quot;Package:&amp;quot; field, and ends with an empty line.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTE1: New fields are in bold red''&lt;br /&gt;
&lt;br /&gt;
''NOTE2: Modified fields are in bold black''&lt;br /&gt;
&lt;br /&gt;
==Version 2.6 (Draft, LuneOS compatibility)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|-&lt;br /&gt;
| DevelopmentFramework (Draft) || Mojo, Enyo1, Enyo2, PDK&lt;br /&gt;
|-&lt;br /&gt;
| MinLuneOSVersion (Draft) || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxLuneOSVersion (Draft) || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.5==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.4==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| '''Location''' || '''Download URL for the package, if it is not in the same URL path as the Packages file'''&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| '''MinWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''MaxWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''DeviceCompatibility''' || '''JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Countries''' || '''JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Languages''' || '''JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.3==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Version 2.2==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). '''Maximum size is 4096 characters.'''&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| '''Price''' || '''Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| '''PostUpdateFlags''' || '''RestartLuna, RestartJava, RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.1==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (includes html?)&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22029</id>
		<title>Packaging Standards</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22029"/>
		<updated>2014-12-04T06:27:03Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* Version 2.6 (Draft, LuneOS compatibility) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''This page will document the agreed packaging standards for webOS homebrew ipkg files and open standard ipkg feeds as well as act as a whiteboard for new revisions.'''}}&lt;br /&gt;
&lt;br /&gt;
'''Please note, ipkg/libipkg has an internal, hard coded buffer of 8k to handle parsing the feed elements for each package. This means that description fields need to get reduced in length to prevent segfaults.'''&lt;br /&gt;
&lt;br /&gt;
Note that a package record in a Packages file starts with the &amp;quot;Package:&amp;quot; field, and ends with an empty line.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTE1: New fields are in bold red''&lt;br /&gt;
&lt;br /&gt;
''NOTE2: Modified fields are in bold black''&lt;br /&gt;
&lt;br /&gt;
==Version 2.6 (Draft, LuneOS compatibility)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|-&lt;br /&gt;
| DevelopmentFramework (Draft) || Mojo, Enyo1, Enyo2, PDK&lt;br /&gt;
|-&lt;br /&gt;
| MinLuneOSVersion (Draft) || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxLuneOSVersion (Draft) || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| LuneOSCompatible (Draft) || Yes, No, Partial??&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.5==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.4==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| '''Location''' || '''Download URL for the package, if it is not in the same URL path as the Packages file'''&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| '''MinWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''MaxWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''DeviceCompatibility''' || '''JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Countries''' || '''JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Languages''' || '''JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.3==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Version 2.2==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). '''Maximum size is 4096 characters.'''&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| '''Price''' || '''Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| '''PostUpdateFlags''' || '''RestartLuna, RestartJava, RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.1==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (includes html?)&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22027</id>
		<title>Packaging Standards</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22027"/>
		<updated>2014-12-03T15:11:17Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* Version 2.6 (Draft, LuneOS compatibility */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''This page will document the agreed packaging standards for webOS homebrew ipkg files and open standard ipkg feeds as well as act as a whiteboard for new revisions.'''}}&lt;br /&gt;
&lt;br /&gt;
'''Please note, ipkg/libipkg has an internal, hard coded buffer of 8k to handle parsing the feed elements for each package. This means that description fields need to get reduced in length to prevent segfaults.'''&lt;br /&gt;
&lt;br /&gt;
Note that a package record in a Packages file starts with the &amp;quot;Package:&amp;quot; field, and ends with an empty line.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTE1: New fields are in bold red''&lt;br /&gt;
&lt;br /&gt;
''NOTE2: Modified fields are in bold black''&lt;br /&gt;
&lt;br /&gt;
==Version 2.6 (Draft, LuneOS compatibility)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|-&lt;br /&gt;
| Development Framework (Draft) || Mojo, Enyo1, Enyo2, PDK&lt;br /&gt;
|-&lt;br /&gt;
| MinLuneOSVersion (Draft) || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxLuneOSVersion (Draft) || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| LuneOSCompatible (Draft) || Yes, No, Partial??&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.5==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.4==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| '''Location''' || '''Download URL for the package, if it is not in the same URL path as the Packages file'''&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| '''MinWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''MaxWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''DeviceCompatibility''' || '''JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Countries''' || '''JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Languages''' || '''JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.3==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Version 2.2==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). '''Maximum size is 4096 characters.'''&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| '''Price''' || '''Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| '''PostUpdateFlags''' || '''RestartLuna, RestartJava, RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.1==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (includes html?)&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22025</id>
		<title>Packaging Standards</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Packaging_Standards&amp;diff=22025"/>
		<updated>2014-12-03T15:10:25Z</updated>

		<summary type="html">&lt;p&gt;Herrie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''This page will document the agreed packaging standards for webOS homebrew ipkg files and open standard ipkg feeds as well as act as a whiteboard for new revisions.'''}}&lt;br /&gt;
&lt;br /&gt;
'''Please note, ipkg/libipkg has an internal, hard coded buffer of 8k to handle parsing the feed elements for each package. This means that description fields need to get reduced in length to prevent segfaults.'''&lt;br /&gt;
&lt;br /&gt;
Note that a package record in a Packages file starts with the &amp;quot;Package:&amp;quot; field, and ends with an empty line.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''NOTE1: New fields are in bold red''&lt;br /&gt;
&lt;br /&gt;
''NOTE2: Modified fields are in bold black''&lt;br /&gt;
&lt;br /&gt;
==Version 2.6 (Draft, LuneOS compatibility==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|-&lt;br /&gt;
| Development Framework (Draft) || Mojo, Enyo1, Enyo2, PDK&lt;br /&gt;
|-&lt;br /&gt;
| MinLuneOSVersion (Draft) || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxLuneOSVersion (Draft) || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| LuneOSCompatible (Draft) || Yes, No, Partial??&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.5==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| Location || Download URL for the package, if it is not in the same URL path as the Packages file&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| '''Type''' || '''Application, Patch, Service, Plugin, Linux Application, OS Application, OS Deamon etc. ...'''&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| MinWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| MaxWebOSVersion || Version number (e.g. &amp;quot;1.4.5&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| DeviceCompatibility || JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices&lt;br /&gt;
|-&lt;br /&gt;
| Countries || JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries&lt;br /&gt;
|-&lt;br /&gt;
| Languages || JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.4==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| '''Location''' || '''Download URL for the package, if it is not in the same URL path as the Packages file'''&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Changelog || A brief description of the changes made to since the last release.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| '''MinWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''MaxWebOSVersion''' || '''Version number (e.g. &amp;quot;1.4.5&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| '''DeviceCompatibility''' || '''JSON array of compatible webOS devices (ex. [&amp;quot;Pre&amp;quot;,&amp;quot;Pixi&amp;quot;,&amp;quot;Pre2&amp;quot;,&amp;quot;Veer&amp;quot;,&amp;quot;TouchPad&amp;quot;]) no value = all devices'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Countries''' || '''JSON array of countries for which this app catalog app was released (ex. [&amp;quot;US&amp;quot;,&amp;quot;DE&amp;quot;]) no value = all countries'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Languages''' || '''JSON array of languages for which this app catalog app was released (ex. [&amp;quot;en_US&amp;quot;,&amp;quot;en_AU&amp;quot;,&amp;quot;de_DE&amp;quot;]) no value = language unspecified'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.3==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6 or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). Maximum size is 4096 characters.&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| Price || Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostUpdateFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, RestartDevice&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Version 2.2==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (html is allowed). '''Maximum size is 4096 characters.'''&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| '''Price''' || '''Price in dollars and cents (e.g. &amp;quot;1.99&amp;quot;)'''&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| '''PostUpdateFlags''' || '''RestartLuna, RestartJava, RestartDevice'''&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava, '''RestartDevice'''&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Version 2.1==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; height:200px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! width=&amp;quot;140&amp;quot; | Name&lt;br /&gt;
! width=&amp;quot;350&amp;quot; | Definition&lt;br /&gt;
|-&lt;br /&gt;
| Package || Package name in reverse-dns style&lt;br /&gt;
|-&lt;br /&gt;
| Size || Package size (in KB)&lt;br /&gt;
|-&lt;br /&gt;
| Status || Installed/Not-installed (and other stuff we don't use)&lt;br /&gt;
|-&lt;br /&gt;
| Architecture || all, armv7, armv6, or i686&lt;br /&gt;
|-&lt;br /&gt;
| Section || The category when there is no source data&lt;br /&gt;
|-&lt;br /&gt;
| Filename || Actual name of .ipk file&lt;br /&gt;
|-&lt;br /&gt;
| Depends || Actual package names of dependencies (comma-space separated, ignore contents of () at the end)&lt;br /&gt;
|-&lt;br /&gt;
| Maintainer || Group or individual responsible for maintenance&lt;br /&gt;
|-&lt;br /&gt;
| Version || In N:N(.N)*(-N)? format (see ipkg source for the different version parts)&lt;br /&gt;
|-&lt;br /&gt;
| Description || Title of the package&lt;br /&gt;
|-&lt;br /&gt;
| MD5Sum || MD5 checksum of package to verify downloaded file&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Time || Timestamp of installation&lt;br /&gt;
|-&lt;br /&gt;
| Installed-Size || Size of installed package&lt;br /&gt;
|-&lt;br /&gt;
| Source ||  *See lower table*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | Source&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;200&amp;quot;; border=&amp;quot;1&amp;quot;&lt;br /&gt;
| Title || Actual title of application&lt;br /&gt;
|-&lt;br /&gt;
| Source || Where to obtain source code&lt;br /&gt;
|-&lt;br /&gt;
| LastUpdated || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| Feed || Package source feed&lt;br /&gt;
|-&lt;br /&gt;
| Type || Application, Patch, Service, Plugin, Linux Application, etc. ...&lt;br /&gt;
|-&lt;br /&gt;
| Category || Package category&lt;br /&gt;
|-&lt;br /&gt;
| Homepage || URL to package homepage&lt;br /&gt;
|-&lt;br /&gt;
| Icon || URL to icon image (assumed to be 64x64)&lt;br /&gt;
|-&lt;br /&gt;
| FullDescription || Actual description of package (includes html?)&lt;br /&gt;
|-&lt;br /&gt;
| Screenshots || Array of URLs&lt;br /&gt;
|-&lt;br /&gt;
| License || Package license conditions&lt;br /&gt;
|-&lt;br /&gt;
| PostInstallFlags || RestartLuna, RestartJava&lt;br /&gt;
|-&lt;br /&gt;
| PostRemoveFlags || RestartLuna, RestartJava&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=Memboot&amp;diff=21965</id>
		<title>Memboot</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=Memboot&amp;diff=21965"/>
		<updated>2014-02-11T21:12:54Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* Memboot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Memboot =&lt;br /&gt;
&lt;br /&gt;
Memboot is an option to boot webOS devices using a kernel supplied via usb and novacom, its quite useful as a second-last-option before doctoring, to remove a custom kernel which doesnt boot.&lt;br /&gt;
&lt;br /&gt;
Stuff you'll need:&lt;br /&gt;
&lt;br /&gt;
* Up-to-date SDK (especially novacom &amp;amp; novacomd)&lt;br /&gt;
* Up-to-date WebOS Doctor Image&lt;br /&gt;
* A little bit of knowledge and understanding of the next steps... But when you play with custom kernels, you should have that, right?&lt;br /&gt;
&lt;br /&gt;
From the WebOS Doctor Image you'll need to extract the (original) kernel, that has been installed on the device:&lt;br /&gt;
&lt;br /&gt;
* open the .jar file (rename it to .zip is a hint, if you don't know how to access the contents)&lt;br /&gt;
* inside, there is an archive /resources/webOS.tar - open/extract that one, too&lt;br /&gt;
* inside webOS.tar, there is an archive nova-cust-image-rootfs.tar.gz  - open/extract that one&lt;br /&gt;
* inside the rootfs, in /boot there'll be the uImage you're searching for. See below for some examples of uImages for various webOS versions.&lt;br /&gt;
* Copy the uImage to the novacom folder on your computer:&lt;br /&gt;
**for '''Windows''': program files\palm\sdk\bin &lt;br /&gt;
**for '''Linux''': /opt/Palm/novacom/ &lt;br /&gt;
&lt;br /&gt;
Memboot is a feature of [[bootie]], the bootloader installed on the device. To get into bootie mode you must:&lt;br /&gt;
&lt;br /&gt;
* power off the phone&lt;br /&gt;
* put in a USB cable connected to your computer&lt;br /&gt;
* hold the volume up key, while powering on the device&lt;br /&gt;
&lt;br /&gt;
Now you should have that big usb-resembling logo on the screen:&lt;br /&gt;
&lt;br /&gt;
*Start the memboot using the following command:&lt;br /&gt;
**On '''Linux''': (after opening a shell)&lt;br /&gt;
     /opt/Palm/novacom/novacom boot mem:// &amp;lt; uImage-2.6.24-palm-joplin-3430&lt;br /&gt;
**On '''Windows''' : (after running cmd.exe)&lt;br /&gt;
     cd \program files\palm\sdk\bin&lt;br /&gt;
     novacom boot mem:// &amp;lt; uImage-2.6.24-palm-joplin-3430&lt;br /&gt;
&lt;br /&gt;
(specify the name of YOUR kernel, of course)&lt;br /&gt;
&lt;br /&gt;
More Information:&lt;br /&gt;
*Membooting Pre To Recover From Faulty/beta Kernels: http://www.rimweb.in/forums/topic/26437-membooting-pre-to-recover-from-faultybeta-kernels/&lt;br /&gt;
*This will work with 2.1.0 as well -- the kernel has the same name but is a larger size. Make sure to use the correct version of the kernel to match the version of webOS installed.&lt;br /&gt;
&lt;br /&gt;
uImage kernel names:&lt;br /&gt;
* 1.4.5: uImage-2.6.24-palm-joplin-3430&lt;br /&gt;
* 2.1.0 (Pre2): uImage-2.6.24-palm-joplin-3430&lt;br /&gt;
* 2.1.x/2.2x (Veer): uImage-2.6.29-palm-shank&lt;br /&gt;
* 2.2.x (Pre3): uImage-2.6.32.9-palm-rib&lt;br /&gt;
* 3.0.x (TouchPad): uImage-2.6.35-palm-tenderloin&lt;br /&gt;
* 3.0.x (TouchPad Go): uImage-2.6.35-palm-shortloin&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21957</id>
		<title>HowtoQt</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21957"/>
		<updated>2013-08-29T04:59:44Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* 2. Optional: completing the PDK with some missing includes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to cross-compile Qt for WebOS =&lt;br /&gt;
History:&lt;br /&gt;
&lt;br /&gt;
* 08.02.2012: first version&lt;br /&gt;
&lt;br /&gt;
= Qt and QML on WebOS devices =&lt;br /&gt;
&lt;br /&gt;
This document explains how to set-up [http://qt.nokia.com Qt 4.8 (Trolltech/Nokia's cross-platform application and UI framework)] on WebOS devices, and then how to cross-compile Qt or QML apps.&lt;br /&gt;
&lt;br /&gt;
This guide assumes:&lt;br /&gt;
* a Linux development environment (here Kubuntu 11.10 running in virtualbox on a win7 host)&lt;br /&gt;
* Qt 4.8 (the process for Qt 4.7.x is mostly identical; no idea for Qt 5)&lt;br /&gt;
* OpenSSH running on the webos device to scp files to it&lt;br /&gt;
* The reasonable development tools&lt;br /&gt;
&lt;br /&gt;
The steps include:&lt;br /&gt;
# Getting and setting-up the Palm PDK&lt;br /&gt;
# Optionally: completing the PDK with some missing includes&lt;br /&gt;
# Getting Qt 4.8, setting it up for cross-compilation&lt;br /&gt;
# Cross-compilation of Qt 4.8&lt;br /&gt;
# Updated webos port of Qt&lt;br /&gt;
# Application tweaks to look for libs in the right places&lt;br /&gt;
&lt;br /&gt;
== 1. Getting and setting up the Palm PDK ==&lt;br /&gt;
&lt;br /&gt;
Qt is cross-compiled with the official Palm PDK. The PDK plays nice: it can be installed alongside the webos internals WIDK without conflicts; there is no need to modify paths or environment variables.&lt;br /&gt;
&lt;br /&gt;
Note that I haven't &amp;quot;fully&amp;quot; installed the PDK. In particular I haven't set-up the emulator. The basic stuff needed are: the arm gcc toolchain, and novacom to communicate with the device. VirtualBox can be skipped. Java may be necessary.&lt;br /&gt;
&lt;br /&gt;
# Read about the [https://developer.palm.com/content/resources/develop/sdk_pdk_download.html#linux Palm SDK 3.05] and the installation procedure. Follow the instructions on there. But essentially this boils down to:&lt;br /&gt;
# Download novacom from that page&lt;br /&gt;
# Download the SDK from that page&lt;br /&gt;
# Install novacom and the SDK following the instructions. I.e.:&lt;br /&gt;
## sudo dpkg -i palm-sdk_3.0.5-svn528736-pho676_i386.deb&lt;br /&gt;
## sudo dpkg -i palm-novacom_1.0.80_i386.deb 	&lt;br /&gt;
&lt;br /&gt;
# The SDK is now in /opt/PalmPDK&lt;br /&gt;
&lt;br /&gt;
'''When you're running 64 bits Linux please make sure to also install ia32-libs by running:''' (otherwise you'll get the error that &amp;quot;arm-none-linux-gnueabi-g++ cannot be found&amp;quot;!)&lt;br /&gt;
# sudo apt-get install ia32-libs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may check that all is fine so far (or skip this - this is simply to step-by-step see if all is ok):&lt;br /&gt;
# You can invoke gcc or g++ from the PDK arm toolchain to compile some test program. E.g. '''/opt/PalmPDK/arm-gcc/bin/arm-none-linux-gnueabi-g++ hello.cpp -o hello'''&lt;br /&gt;
# You can copy this file to the usb drive on the device: '''scp hello root@ip.address.of.device:/media/internal'''&lt;br /&gt;
# You can go log on the device with novaterm: '''novaterm'''&lt;br /&gt;
# You can run your test program: '''/media/internal/hello'''&lt;br /&gt;
&lt;br /&gt;
If that works then on to the next steps.&lt;br /&gt;
&lt;br /&gt;
== 2. Optional: completing the PDK with some missing includes ==&lt;br /&gt;
&lt;br /&gt;
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit.&lt;br /&gt;
&lt;br /&gt;
There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - '''/opt/PalmPDK/include/asm/hwcap.h''' (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. &lt;br /&gt;
&lt;br /&gt;
Without these includes, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3.&lt;br /&gt;
&lt;br /&gt;
Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain.&lt;br /&gt;
&lt;br /&gt;
# Download the arm toolchain &amp;quot;Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux&amp;quot; from [http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-gnu-linux Mentor Graphics' website]. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2&lt;br /&gt;
# Untar this file: '''tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2'''&lt;br /&gt;
# Copy the entire include/asm directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include'''&lt;br /&gt;
# Copy the files int-l64.h and int-ll64.h from include/asm-generic directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm-generic/int* /opt/PalmPDK/arm-gcc/sysroot/usr/include/asm-generic'''&lt;br /&gt;
# Various SDL include files are in the &amp;quot;wrong location&amp;quot;. Instead of editing various files to point to the SDL directory, lets just copy them all over to the regular include directory '''cp -r /opt/PalmPDK/include/SDL/* /opt/PalmPDK/include/ '''&lt;br /&gt;
&lt;br /&gt;
You're set!&lt;br /&gt;
&lt;br /&gt;
== 3. Getting Qt 4.8, setting it up for cross-compilation ==&lt;br /&gt;
&lt;br /&gt;
This step gets the Qt 4.8 sources, and sets-up Qt for cross-compilation using the Palm PDK.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Get the Qt sources ===&lt;br /&gt;
&lt;br /&gt;
# Cd to your home directory: '''cd ~'''&lt;br /&gt;
# Get the Qt 4.8 sources: '''http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
# Untar: '''tar xvfz qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Qt mkspecs for WebOS ===&lt;br /&gt;
&lt;br /&gt;
We set-up the mkspecs for WebOS (compiler parameters required for cross-compilation):&lt;br /&gt;
&lt;br /&gt;
# Cd to the qws mkspecs: '''cd ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws'''&lt;br /&gt;
# The WebOS mkspecs are mostly the same as the linux-arm-gnueabi-g++ mkspecs. So we copy them and modify them afterwards: '''cp -r linux-arm-gnueabi-g++ linux-webos'''&lt;br /&gt;
# Edit the linux-webos mkspecs to set-up the cross-compiler path and other build parameters. E.g. '''vi ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws/linux-webos/qmake.conf'''. This file must look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#&lt;br /&gt;
# qmake configuration for WebOS builds with arm-linux-g++&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#for 4.7.4:&lt;br /&gt;
#include(../../common/g++.conf)&lt;br /&gt;
#include(../../common/linux.conf)&lt;br /&gt;
#include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# for 4.8&lt;br /&gt;
include(../../common/linux.conf)&lt;br /&gt;
include(../../common/gcc-base-unix.conf)&lt;br /&gt;
include(../../common/g++-unix.conf)&lt;br /&gt;
include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# modifications to g++.conf&lt;br /&gt;
#Toolchain&lt;br /&gt;
&lt;br /&gt;
#Base directory of gcc toolchain&lt;br /&gt;
&lt;br /&gt;
GCCBASE                 = /opt/PalmPDK/arm-gcc/bin&lt;br /&gt;
TSLIB_INCDIR            = /opt/PalmPDK/include&lt;br /&gt;
TSLIB_LIBDIR            = /opt/PalmPDK/device/lib&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Compiler Flags to take advantage of the ARM architecture&lt;br /&gt;
QMAKE_CFLAGS_RELEASE    = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CFLAGS_DEBUG      = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
QMAKE_CXXFLAGS_RELEASE  = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CXXFLAGS_DEBUG    = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
# For official pdk&lt;br /&gt;
QMAKE_CC                = $$GCCBASE/arm-none-linux-gnueabi-gcc&lt;br /&gt;
QMAKE_CXX               = $$GCCBASE/arm-none-linux-gnueabi-g++&lt;br /&gt;
QMAKE_LINK              = $$QMAKE_CXX&lt;br /&gt;
QMAKE_LINK_SHLIB        = $$QMAKE_CXX&lt;br /&gt;
QMAKE_RANLIB            = $$GCCBASE/arm-none-linux-gnueabi-ranlib&lt;br /&gt;
&lt;br /&gt;
# modifications to linux.conf&lt;br /&gt;
QMAKE_AR                = $$GCCBASE/arm-none-linux-gnueabi-ar cqs&lt;br /&gt;
QMAKE_OBJCOPY           = $$GCCBASE/arm-none-linux-gnueabi-objcopy&lt;br /&gt;
QMAKE_STRIP             = $$GCCBASE/arm-none-linux-gnueabi-strip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
QMAKE_INCDIR = $$TSLIB_INCDIR &lt;br /&gt;
QMAKE_LIBDIR = $$TSLIB_LIBDIR &lt;br /&gt;
QMAKE_LIBS   += -lrt -lz &lt;br /&gt;
&lt;br /&gt;
QMAKE_LFLAGS += -Wl,--allow-shlib-undefined &lt;br /&gt;
&lt;br /&gt;
load(qt_config)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.3 gfxdrivers plugin for WebOS ===&lt;br /&gt;
&lt;br /&gt;
Qt embedded needs a gfxdrivers plugin which allows Qt to show things on a screen, get keyboard input and mouse events. This step gets the WebOS Qt gfxdrivers plugin. &lt;br /&gt;
&lt;br /&gt;
The initial plugin version was written by Darron Black [1,2] and it uses SDL for graphics. With the changes in WebOS 2.x, that plugin doesn't work anymore: it uses root access to read the keyboard, but recent PDK apps are not running as root anymore but in jails. Therefore an extended version is required that handles keyboard input for &amp;quot;non-root&amp;quot; users. That version is available from [http://code.google.com/p/qt-webos Qt gfxdrivers plugin for WebOS on Google Code]. It has also tentative support for screen rotation.&lt;br /&gt;
&lt;br /&gt;
# Cd to the Qt gfxdrivers directory: '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers'''&lt;br /&gt;
# Get the WebOS gfxdrivers plugin from the svn repository: '''svn checkout http://qt-webos.googlecode.com/svn/trunk/ webos'''&lt;br /&gt;
# Edit ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/gfxdrivers.pro to add the line: '''contains(gfx-plugins, webos)        :SUBDIRS += webos'''&lt;br /&gt;
# In order to support screen rotation we need to patch the &amp;quot;transformed&amp;quot; screen driver. This driver is provided by Qt to do screen rotation or offsetting and it uses as back-end the driver doing the actual access to the pixels (that would be our webos qgfxdrivers). Unfortunately the transformed driver doesn't allow to &amp;quot;notify&amp;quot; SDL when pixels are changed. A quick hack is to patch ~/qt-everywhere-opensource-src-4.8.0t/src/gui/embedded/qscreentransformed_qws.cpp. In this patch we hijack the functionality of the &amp;quot;blank&amp;quot; method (which is supposed to blank the screen) to notify the WebOS gfxdrivers before and after pixels are modified. So edit qscreentransformed_qws.cpp around lines 430 and add the two lines marked with the comments below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
    screen()-&amp;gt;blank(true);                        // ADD THIS FOR WEBOS&lt;br /&gt;
    QWSDisplay::grab();&lt;br /&gt;
    for (int i = 0; i &amp;lt; rects.size(); ++i) {&lt;br /&gt;
        const QRect r = rects.at(i) &amp;amp; bound;&lt;br /&gt;
&lt;br /&gt;
        QPoint dst;&lt;br /&gt;
        switch (trans) {&lt;br /&gt;
        case Rot90:&lt;br /&gt;
            dst = mapToDevice(r.topRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot180:&lt;br /&gt;
            dst = mapToDevice(r.bottomRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot270:&lt;br /&gt;
            dst = mapToDevice(r.bottomLeft(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        func(this, image, r.translated(-topLeft), dst);&lt;br /&gt;
    }&lt;br /&gt;
    QWSDisplay::ungrab();&lt;br /&gt;
    screen()-&amp;gt;blank(false);                       // ADD THIS FOR WEBOS&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Cross-compile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we can configure and cross-compile Qt. The lines below configure Qt to install in ~/qte-48:&lt;br /&gt;
&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0'''&lt;br /&gt;
# '''./configure -v -prefix ~/qte-48 -embedded arm -platform qws/linux-x86-g++ -xplatform qws/linux-webos -depths 16,24,32 -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-nis -no-iconv -no-dbus -no-cups -no-largefile -no-accessibility -no-gtkstyle -no-qt3support -qt-gfx-vnc -plugin-gfx-vnc -no-glib -qtlibinfix 48 -xmlpatterns -exceptions -opensource -make libs -nomake tools -nomake demo -nomake examples -nomake docs -webkit -javascript-jit -script -scripttools -declarative -openssl -qt-gfx-transformed'''&lt;br /&gt;
# '''make -j4'''&lt;br /&gt;
# '''make install'''&lt;br /&gt;
&lt;br /&gt;
The WebOS gfxdrivers plugin must be compiled manually:&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/webos'''&lt;br /&gt;
# '''make'''&lt;br /&gt;
&lt;br /&gt;
This builds and copies the plugin into ~/qte-48/plugins/gfxdrivers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hopefully you've made it so far without problems! You now have Qt in ~/qte-48.&lt;br /&gt;
&lt;br /&gt;
== 4. Compiling Qt apps ==&lt;br /&gt;
&lt;br /&gt;
We see here how to compile a Qt app for Qt on WebOS. We look at two examples that are directly taken from the Qt distribution.  &lt;br /&gt;
# fancybrowser: this is a Qt-widget-based example browser. It is available in QTSDKDIR/Examples/4.8/webkit/fancybrowser. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qt.zip here]&lt;br /&gt;
# webbrowser: this is a Qt-QML-based example browser. It is available in QTSDKDRIR/Demos/4.8/declarative/webbrowser. Since this is a QML app, a QmlApplicationViewer must be used to run the QML files. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qml.zip here]&lt;br /&gt;
&lt;br /&gt;
The binaries are available on the WebOS homebrew app repository [www.webosnation.com/a-browser-qt-test here] and [www.webosnation.com/a-browser-qml-test here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The way compilation of the apps is mostly identical, but the QML-based project has a few extra complexities so we'll see first the widget-based project.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Qt-widget app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Examples/4.8/webkit/fancybrowser in your working directory, e.g. ~/fancybrowser&lt;br /&gt;
&lt;br /&gt;
Two things must be modified in the project: &lt;br /&gt;
* fancybrowser.pro: this is the project file, it must be modified to include the proper libraries&lt;br /&gt;
* main.cpp: this is the file in which the QApplication object is instanciated. We must do some setup to indicate to the application:&lt;br /&gt;
** where to find system fonts, &lt;br /&gt;
** to start the application as a GUI server application&lt;br /&gt;
** to use the WebOS gfxdrivers plugin, or to use the transformed gfxdrivers plugin in combination with the WebOS gfxdrivers plugin to support screen rotation.&lt;br /&gt;
&lt;br /&gt;
Note that one could avoid modifying main.cpp altogether because the same results can be achieved by environment variables and by command line arguments. Therefore a script could set the environment variables and call the executable with the appropriate parameters. However we go through the self-contained solution, which is a bit more complex but may seen as more clean.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
The pro file must be modified to link the PDL and SDL libs, and also to look for the Qt libraries at the right location at runtime. Here we assume that the Qt libs are in a subdirectory called 'qt' below the directory where the application is deployed. &lt;br /&gt;
&lt;br /&gt;
Modify fancybrowser.pro and add this at the end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
!win32: {&lt;br /&gt;
message(assume qws)&lt;br /&gt;
# Set the runtime path to a relative directory w.r.t. the location of the executable&lt;br /&gt;
LIBS += -Wl,-rpath,&amp;quot;'\$$ORIGIN/qt'&amp;quot; -L/opt/PalmPDK/device/lib -lpdl -lSDL&lt;br /&gt;
INCLUDEPATH += /opt/PalmPDK/include/SDL&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that '''!win32:{...}''' sets these parameters for any &amp;quot;non windows build&amp;quot; (I happen to build the desktop app on Windows and the WebOS app on Linux). Ideally we would rather have something for webos ('''webos:{...}''') but I did not investigate how to do enable that - if somebody knows, feel free to share.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
There are modifications to main.cpp in three categories.&lt;br /&gt;
&lt;br /&gt;
When instanciating a QApplication object the fonts are search in the directory specified by the QT_QWS_FONTDIR environment variable. To my knowledge this cannot be specified to QApplication in another way. Therefore we set programmatically QT_QWS_FONTDIR to where we have our fonts. There are two possibilities: we can deploy the fonts of Qt, or we can use the fonts already available on the WebOS device. Using the fonts of the WebOS device is fine so we use this. See the commented-out line for the alternative approach.&lt;br /&gt;
&lt;br /&gt;
When instanciating the QApplication object we want to start the application as a GUI server application. This is achieved by passing QApplication::GuiServer in the QApplication constructor. The alternative approach is to call the program with '''-qws''' on the command line.&lt;br /&gt;
&lt;br /&gt;
The gfxdrivers plugin must be specified. This can be done with the '''-display''' command line argument. Here we programmatically set this command line argument.&lt;br /&gt;
We have two alternatives. We can use directly the WebOS gfxdrivers plugin. This does not allow for screen rotation. The command line would then be ''''-display PalmPreSDLFb:nnn'''. &lt;br /&gt;
Alternatively, we can use the transformed gfxdrivers in combination with the WebOS gfxdrivers plugin. This allows for screen rotation. The command line would then be '''-display Transformed:PalmPreSDLFb:nnn'''.&lt;br /&gt;
&lt;br /&gt;
'''nnn''' is a number which you must set to identify the display driver. In a normal embedded system only a single GUI server application would run at any time, and this number can be the same for all applications (or even left out, QApplication assumes number 0 then). This number is used by Qt to create a temporary directory ('''/tmp/qtembedded-nnn''') that contains, among others, a font cache.&lt;br /&gt;
&lt;br /&gt;
However, on WebOS each running Qt applications is a GUI server. Each application will thus create a '''/tmp/qtembedded-nnn''' directory. Therefore '''nnn''' must be unique for each Qt application. (maybe we need a convention to avoid conflicts - might be enough to use some randomly generated number for each app).&lt;br /&gt;
&lt;br /&gt;
main.cpp can be modified as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Generate the makefile and compile:&lt;br /&gt;
# ~/qte-48/bin/qmake fancybrowser.pro&lt;br /&gt;
# make&lt;br /&gt;
&lt;br /&gt;
Now the app is compiled. The Qt libs must also be deployed on the device. See the deployment section below for how to lay-out the files.&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Qt-QML app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Demos/4.8/declarative/webbrowser in your working directory, e.g. ~/webbrowser&lt;br /&gt;
&lt;br /&gt;
Essentially the same modifications must be made to the Qt-QML project as for the Qt-widget project, with some additions to the main file.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app, and in addition we must set the path where the QML imports can be found. This can be specified with the QML_IMPORT_PATH environment variable. We set-it up programmatically here.&lt;br /&gt;
&lt;br /&gt;
The file main.cpp looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP&lt;br /&gt;
    QString qmlpath = QString(pathexe)+&amp;quot;/imports&amp;quot;;&lt;br /&gt;
    if(!qputenv(&amp;quot;QML_IMPORT_PATH&amp;quot;,qmlpath.toAscii()))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set qml path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Same as for Qt-widget apps.&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Deployment ===&lt;br /&gt;
&lt;br /&gt;
We can now test the application, and create an IPK which can be uploaded to the HP or homebrew app repository.&lt;br /&gt;
&lt;br /&gt;
In order to test the app, it must be copied to the device together with Qt libs. The device directory structure, assuming the app is in APPDIR, must be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APPDIR:                  the application is here&lt;br /&gt;
APPDIR/qt:               qt libs. Copy ~/qte-48/lib/*.so.4 here)&lt;br /&gt;
APPDIR/fonts:            fonts (not needed if the WebOS fonts are used). Copy ~/qte-48/lib/fonts/* here&lt;br /&gt;
APPDIR/gfxdrivers:       gfxdrivers plugins. Copy ~/qte-48/plugins/gfxdrivers/* here&lt;br /&gt;
APPDIR/imageformats:     imageformats plugins. Copy ~/qte-48/plugins/imageformats/* here&lt;br /&gt;
APPDIR/imports:          QML stuff (not needed for Qt-widget). Copy ~/qte-48/imports/* here&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can deploy these files in /media/internal/APPDIR for testing and run the application from the command line.&lt;br /&gt;
&lt;br /&gt;
To create an IPK file you need in addition an appinfo.json file. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;A-Browser Qml (test)&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;pdk&amp;quot;,&lt;br /&gt;
	&amp;quot;main&amp;quot;: &amp;quot;abrowse-qml&amp;quot;,&lt;br /&gt;
	&amp;quot;id&amp;quot;: &amp;quot;net.danielroggen.abrowseqml&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
	&amp;quot;vendor&amp;quot;: &amp;quot;danielroggen&amp;quot;,&lt;br /&gt;
	&amp;quot;icon&amp;quot;:     &amp;quot;icon.png&amp;quot; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a STAGING directory which contains:&lt;br /&gt;
* the application&lt;br /&gt;
* the Qt stuff (keeping the directory structure mentionned above)&lt;br /&gt;
* the icon&lt;br /&gt;
* the appinfo.json&lt;br /&gt;
* any other required file&lt;br /&gt;
&lt;br /&gt;
And run '''palm-package STAGING'''. This will create an .ipk ready for distribution. Before distributing, try to install it on the device with Preware: copy the ipk to the device, run Preware and select the option to install ipk packages from the menu, and check that your app works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No virtual keyboard so far&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. Links ==&lt;br /&gt;
[1] [http://www.griffin.net/2010/02/qt-on-the-palm-pre.html Qt on the Palm Pre]&lt;br /&gt;
&lt;br /&gt;
[2] [https://gitorious.org/~darronb/qt/qt-palm-pre Qt port to webOS by Darron Black on gitorious]&lt;br /&gt;
&lt;br /&gt;
[3] A-Browser QML [http://danielroggen.net/sw/abrowse-qml.zip source] and [http://www.webosnation.com/a-browser-qml-test binary]&lt;br /&gt;
&lt;br /&gt;
[4] A-Browser Qt [http://danielroggen.net/sw/abrowse-qt.zip source] and [http://www.webosnation.com/a-browser-qt-test binary]&lt;br /&gt;
&lt;br /&gt;
[5] Updated [http://code.google.com/p/qt-webos/ WebOS gfxdrivers plugin]&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21955</id>
		<title>HowtoQt</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21955"/>
		<updated>2013-08-29T04:59:26Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* 2. Optional: completing the PDK with some missing includes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to cross-compile Qt for WebOS =&lt;br /&gt;
History:&lt;br /&gt;
&lt;br /&gt;
* 08.02.2012: first version&lt;br /&gt;
&lt;br /&gt;
= Qt and QML on WebOS devices =&lt;br /&gt;
&lt;br /&gt;
This document explains how to set-up [http://qt.nokia.com Qt 4.8 (Trolltech/Nokia's cross-platform application and UI framework)] on WebOS devices, and then how to cross-compile Qt or QML apps.&lt;br /&gt;
&lt;br /&gt;
This guide assumes:&lt;br /&gt;
* a Linux development environment (here Kubuntu 11.10 running in virtualbox on a win7 host)&lt;br /&gt;
* Qt 4.8 (the process for Qt 4.7.x is mostly identical; no idea for Qt 5)&lt;br /&gt;
* OpenSSH running on the webos device to scp files to it&lt;br /&gt;
* The reasonable development tools&lt;br /&gt;
&lt;br /&gt;
The steps include:&lt;br /&gt;
# Getting and setting-up the Palm PDK&lt;br /&gt;
# Optionally: completing the PDK with some missing includes&lt;br /&gt;
# Getting Qt 4.8, setting it up for cross-compilation&lt;br /&gt;
# Cross-compilation of Qt 4.8&lt;br /&gt;
# Updated webos port of Qt&lt;br /&gt;
# Application tweaks to look for libs in the right places&lt;br /&gt;
&lt;br /&gt;
== 1. Getting and setting up the Palm PDK ==&lt;br /&gt;
&lt;br /&gt;
Qt is cross-compiled with the official Palm PDK. The PDK plays nice: it can be installed alongside the webos internals WIDK without conflicts; there is no need to modify paths or environment variables.&lt;br /&gt;
&lt;br /&gt;
Note that I haven't &amp;quot;fully&amp;quot; installed the PDK. In particular I haven't set-up the emulator. The basic stuff needed are: the arm gcc toolchain, and novacom to communicate with the device. VirtualBox can be skipped. Java may be necessary.&lt;br /&gt;
&lt;br /&gt;
# Read about the [https://developer.palm.com/content/resources/develop/sdk_pdk_download.html#linux Palm SDK 3.05] and the installation procedure. Follow the instructions on there. But essentially this boils down to:&lt;br /&gt;
# Download novacom from that page&lt;br /&gt;
# Download the SDK from that page&lt;br /&gt;
# Install novacom and the SDK following the instructions. I.e.:&lt;br /&gt;
## sudo dpkg -i palm-sdk_3.0.5-svn528736-pho676_i386.deb&lt;br /&gt;
## sudo dpkg -i palm-novacom_1.0.80_i386.deb 	&lt;br /&gt;
&lt;br /&gt;
# The SDK is now in /opt/PalmPDK&lt;br /&gt;
&lt;br /&gt;
'''When you're running 64 bits Linux please make sure to also install ia32-libs by running:''' (otherwise you'll get the error that &amp;quot;arm-none-linux-gnueabi-g++ cannot be found&amp;quot;!)&lt;br /&gt;
# sudo apt-get install ia32-libs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may check that all is fine so far (or skip this - this is simply to step-by-step see if all is ok):&lt;br /&gt;
# You can invoke gcc or g++ from the PDK arm toolchain to compile some test program. E.g. '''/opt/PalmPDK/arm-gcc/bin/arm-none-linux-gnueabi-g++ hello.cpp -o hello'''&lt;br /&gt;
# You can copy this file to the usb drive on the device: '''scp hello root@ip.address.of.device:/media/internal'''&lt;br /&gt;
# You can go log on the device with novaterm: '''novaterm'''&lt;br /&gt;
# You can run your test program: '''/media/internal/hello'''&lt;br /&gt;
&lt;br /&gt;
If that works then on to the next steps.&lt;br /&gt;
&lt;br /&gt;
== 2. Optional: completing the PDK with some missing includes ==&lt;br /&gt;
&lt;br /&gt;
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit.&lt;br /&gt;
&lt;br /&gt;
There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - '''/opt/PalmPDK/include/asm/hwcap.h''' (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. &lt;br /&gt;
&lt;br /&gt;
Without these includes, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3.&lt;br /&gt;
&lt;br /&gt;
Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain.&lt;br /&gt;
&lt;br /&gt;
# Download the arm toolchain &amp;quot;Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux&amp;quot; from [http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-gnu-linux Mentor Graphics' website]. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2&lt;br /&gt;
# Untar this file: '''tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2'''&lt;br /&gt;
# Copy the entire include/asm directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include'''&lt;br /&gt;
# Copy the files int-l64.h and int-ll64.h from include/asm-generic directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm-generic/int* /opt/PalmPDK/arm-gcc/sysroot/usr/include/asm-generic'''&lt;br /&gt;
# Various SDL include files are in the &amp;quot;wrong location&amp;quot;. Instead of editing various files to point to the SDL directory, lets just copy them all over to the regular include directory '''cp -r /opt/PalmPDK/include/SDL/* /opt/PalmPDK/include/ '''.&lt;br /&gt;
&lt;br /&gt;
You're set!&lt;br /&gt;
&lt;br /&gt;
== 3. Getting Qt 4.8, setting it up for cross-compilation ==&lt;br /&gt;
&lt;br /&gt;
This step gets the Qt 4.8 sources, and sets-up Qt for cross-compilation using the Palm PDK.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Get the Qt sources ===&lt;br /&gt;
&lt;br /&gt;
# Cd to your home directory: '''cd ~'''&lt;br /&gt;
# Get the Qt 4.8 sources: '''http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
# Untar: '''tar xvfz qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Qt mkspecs for WebOS ===&lt;br /&gt;
&lt;br /&gt;
We set-up the mkspecs for WebOS (compiler parameters required for cross-compilation):&lt;br /&gt;
&lt;br /&gt;
# Cd to the qws mkspecs: '''cd ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws'''&lt;br /&gt;
# The WebOS mkspecs are mostly the same as the linux-arm-gnueabi-g++ mkspecs. So we copy them and modify them afterwards: '''cp -r linux-arm-gnueabi-g++ linux-webos'''&lt;br /&gt;
# Edit the linux-webos mkspecs to set-up the cross-compiler path and other build parameters. E.g. '''vi ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws/linux-webos/qmake.conf'''. This file must look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#&lt;br /&gt;
# qmake configuration for WebOS builds with arm-linux-g++&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#for 4.7.4:&lt;br /&gt;
#include(../../common/g++.conf)&lt;br /&gt;
#include(../../common/linux.conf)&lt;br /&gt;
#include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# for 4.8&lt;br /&gt;
include(../../common/linux.conf)&lt;br /&gt;
include(../../common/gcc-base-unix.conf)&lt;br /&gt;
include(../../common/g++-unix.conf)&lt;br /&gt;
include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# modifications to g++.conf&lt;br /&gt;
#Toolchain&lt;br /&gt;
&lt;br /&gt;
#Base directory of gcc toolchain&lt;br /&gt;
&lt;br /&gt;
GCCBASE                 = /opt/PalmPDK/arm-gcc/bin&lt;br /&gt;
TSLIB_INCDIR            = /opt/PalmPDK/include&lt;br /&gt;
TSLIB_LIBDIR            = /opt/PalmPDK/device/lib&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Compiler Flags to take advantage of the ARM architecture&lt;br /&gt;
QMAKE_CFLAGS_RELEASE    = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CFLAGS_DEBUG      = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
QMAKE_CXXFLAGS_RELEASE  = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CXXFLAGS_DEBUG    = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
# For official pdk&lt;br /&gt;
QMAKE_CC                = $$GCCBASE/arm-none-linux-gnueabi-gcc&lt;br /&gt;
QMAKE_CXX               = $$GCCBASE/arm-none-linux-gnueabi-g++&lt;br /&gt;
QMAKE_LINK              = $$QMAKE_CXX&lt;br /&gt;
QMAKE_LINK_SHLIB        = $$QMAKE_CXX&lt;br /&gt;
QMAKE_RANLIB            = $$GCCBASE/arm-none-linux-gnueabi-ranlib&lt;br /&gt;
&lt;br /&gt;
# modifications to linux.conf&lt;br /&gt;
QMAKE_AR                = $$GCCBASE/arm-none-linux-gnueabi-ar cqs&lt;br /&gt;
QMAKE_OBJCOPY           = $$GCCBASE/arm-none-linux-gnueabi-objcopy&lt;br /&gt;
QMAKE_STRIP             = $$GCCBASE/arm-none-linux-gnueabi-strip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
QMAKE_INCDIR = $$TSLIB_INCDIR &lt;br /&gt;
QMAKE_LIBDIR = $$TSLIB_LIBDIR &lt;br /&gt;
QMAKE_LIBS   += -lrt -lz &lt;br /&gt;
&lt;br /&gt;
QMAKE_LFLAGS += -Wl,--allow-shlib-undefined &lt;br /&gt;
&lt;br /&gt;
load(qt_config)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.3 gfxdrivers plugin for WebOS ===&lt;br /&gt;
&lt;br /&gt;
Qt embedded needs a gfxdrivers plugin which allows Qt to show things on a screen, get keyboard input and mouse events. This step gets the WebOS Qt gfxdrivers plugin. &lt;br /&gt;
&lt;br /&gt;
The initial plugin version was written by Darron Black [1,2] and it uses SDL for graphics. With the changes in WebOS 2.x, that plugin doesn't work anymore: it uses root access to read the keyboard, but recent PDK apps are not running as root anymore but in jails. Therefore an extended version is required that handles keyboard input for &amp;quot;non-root&amp;quot; users. That version is available from [http://code.google.com/p/qt-webos Qt gfxdrivers plugin for WebOS on Google Code]. It has also tentative support for screen rotation.&lt;br /&gt;
&lt;br /&gt;
# Cd to the Qt gfxdrivers directory: '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers'''&lt;br /&gt;
# Get the WebOS gfxdrivers plugin from the svn repository: '''svn checkout http://qt-webos.googlecode.com/svn/trunk/ webos'''&lt;br /&gt;
# Edit ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/gfxdrivers.pro to add the line: '''contains(gfx-plugins, webos)        :SUBDIRS += webos'''&lt;br /&gt;
# In order to support screen rotation we need to patch the &amp;quot;transformed&amp;quot; screen driver. This driver is provided by Qt to do screen rotation or offsetting and it uses as back-end the driver doing the actual access to the pixels (that would be our webos qgfxdrivers). Unfortunately the transformed driver doesn't allow to &amp;quot;notify&amp;quot; SDL when pixels are changed. A quick hack is to patch ~/qt-everywhere-opensource-src-4.8.0t/src/gui/embedded/qscreentransformed_qws.cpp. In this patch we hijack the functionality of the &amp;quot;blank&amp;quot; method (which is supposed to blank the screen) to notify the WebOS gfxdrivers before and after pixels are modified. So edit qscreentransformed_qws.cpp around lines 430 and add the two lines marked with the comments below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
    screen()-&amp;gt;blank(true);                        // ADD THIS FOR WEBOS&lt;br /&gt;
    QWSDisplay::grab();&lt;br /&gt;
    for (int i = 0; i &amp;lt; rects.size(); ++i) {&lt;br /&gt;
        const QRect r = rects.at(i) &amp;amp; bound;&lt;br /&gt;
&lt;br /&gt;
        QPoint dst;&lt;br /&gt;
        switch (trans) {&lt;br /&gt;
        case Rot90:&lt;br /&gt;
            dst = mapToDevice(r.topRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot180:&lt;br /&gt;
            dst = mapToDevice(r.bottomRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot270:&lt;br /&gt;
            dst = mapToDevice(r.bottomLeft(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        func(this, image, r.translated(-topLeft), dst);&lt;br /&gt;
    }&lt;br /&gt;
    QWSDisplay::ungrab();&lt;br /&gt;
    screen()-&amp;gt;blank(false);                       // ADD THIS FOR WEBOS&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Cross-compile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we can configure and cross-compile Qt. The lines below configure Qt to install in ~/qte-48:&lt;br /&gt;
&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0'''&lt;br /&gt;
# '''./configure -v -prefix ~/qte-48 -embedded arm -platform qws/linux-x86-g++ -xplatform qws/linux-webos -depths 16,24,32 -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-nis -no-iconv -no-dbus -no-cups -no-largefile -no-accessibility -no-gtkstyle -no-qt3support -qt-gfx-vnc -plugin-gfx-vnc -no-glib -qtlibinfix 48 -xmlpatterns -exceptions -opensource -make libs -nomake tools -nomake demo -nomake examples -nomake docs -webkit -javascript-jit -script -scripttools -declarative -openssl -qt-gfx-transformed'''&lt;br /&gt;
# '''make -j4'''&lt;br /&gt;
# '''make install'''&lt;br /&gt;
&lt;br /&gt;
The WebOS gfxdrivers plugin must be compiled manually:&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/webos'''&lt;br /&gt;
# '''make'''&lt;br /&gt;
&lt;br /&gt;
This builds and copies the plugin into ~/qte-48/plugins/gfxdrivers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hopefully you've made it so far without problems! You now have Qt in ~/qte-48.&lt;br /&gt;
&lt;br /&gt;
== 4. Compiling Qt apps ==&lt;br /&gt;
&lt;br /&gt;
We see here how to compile a Qt app for Qt on WebOS. We look at two examples that are directly taken from the Qt distribution.  &lt;br /&gt;
# fancybrowser: this is a Qt-widget-based example browser. It is available in QTSDKDIR/Examples/4.8/webkit/fancybrowser. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qt.zip here]&lt;br /&gt;
# webbrowser: this is a Qt-QML-based example browser. It is available in QTSDKDRIR/Demos/4.8/declarative/webbrowser. Since this is a QML app, a QmlApplicationViewer must be used to run the QML files. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qml.zip here]&lt;br /&gt;
&lt;br /&gt;
The binaries are available on the WebOS homebrew app repository [www.webosnation.com/a-browser-qt-test here] and [www.webosnation.com/a-browser-qml-test here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The way compilation of the apps is mostly identical, but the QML-based project has a few extra complexities so we'll see first the widget-based project.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Qt-widget app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Examples/4.8/webkit/fancybrowser in your working directory, e.g. ~/fancybrowser&lt;br /&gt;
&lt;br /&gt;
Two things must be modified in the project: &lt;br /&gt;
* fancybrowser.pro: this is the project file, it must be modified to include the proper libraries&lt;br /&gt;
* main.cpp: this is the file in which the QApplication object is instanciated. We must do some setup to indicate to the application:&lt;br /&gt;
** where to find system fonts, &lt;br /&gt;
** to start the application as a GUI server application&lt;br /&gt;
** to use the WebOS gfxdrivers plugin, or to use the transformed gfxdrivers plugin in combination with the WebOS gfxdrivers plugin to support screen rotation.&lt;br /&gt;
&lt;br /&gt;
Note that one could avoid modifying main.cpp altogether because the same results can be achieved by environment variables and by command line arguments. Therefore a script could set the environment variables and call the executable with the appropriate parameters. However we go through the self-contained solution, which is a bit more complex but may seen as more clean.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
The pro file must be modified to link the PDL and SDL libs, and also to look for the Qt libraries at the right location at runtime. Here we assume that the Qt libs are in a subdirectory called 'qt' below the directory where the application is deployed. &lt;br /&gt;
&lt;br /&gt;
Modify fancybrowser.pro and add this at the end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
!win32: {&lt;br /&gt;
message(assume qws)&lt;br /&gt;
# Set the runtime path to a relative directory w.r.t. the location of the executable&lt;br /&gt;
LIBS += -Wl,-rpath,&amp;quot;'\$$ORIGIN/qt'&amp;quot; -L/opt/PalmPDK/device/lib -lpdl -lSDL&lt;br /&gt;
INCLUDEPATH += /opt/PalmPDK/include/SDL&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that '''!win32:{...}''' sets these parameters for any &amp;quot;non windows build&amp;quot; (I happen to build the desktop app on Windows and the WebOS app on Linux). Ideally we would rather have something for webos ('''webos:{...}''') but I did not investigate how to do enable that - if somebody knows, feel free to share.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
There are modifications to main.cpp in three categories.&lt;br /&gt;
&lt;br /&gt;
When instanciating a QApplication object the fonts are search in the directory specified by the QT_QWS_FONTDIR environment variable. To my knowledge this cannot be specified to QApplication in another way. Therefore we set programmatically QT_QWS_FONTDIR to where we have our fonts. There are two possibilities: we can deploy the fonts of Qt, or we can use the fonts already available on the WebOS device. Using the fonts of the WebOS device is fine so we use this. See the commented-out line for the alternative approach.&lt;br /&gt;
&lt;br /&gt;
When instanciating the QApplication object we want to start the application as a GUI server application. This is achieved by passing QApplication::GuiServer in the QApplication constructor. The alternative approach is to call the program with '''-qws''' on the command line.&lt;br /&gt;
&lt;br /&gt;
The gfxdrivers plugin must be specified. This can be done with the '''-display''' command line argument. Here we programmatically set this command line argument.&lt;br /&gt;
We have two alternatives. We can use directly the WebOS gfxdrivers plugin. This does not allow for screen rotation. The command line would then be ''''-display PalmPreSDLFb:nnn'''. &lt;br /&gt;
Alternatively, we can use the transformed gfxdrivers in combination with the WebOS gfxdrivers plugin. This allows for screen rotation. The command line would then be '''-display Transformed:PalmPreSDLFb:nnn'''.&lt;br /&gt;
&lt;br /&gt;
'''nnn''' is a number which you must set to identify the display driver. In a normal embedded system only a single GUI server application would run at any time, and this number can be the same for all applications (or even left out, QApplication assumes number 0 then). This number is used by Qt to create a temporary directory ('''/tmp/qtembedded-nnn''') that contains, among others, a font cache.&lt;br /&gt;
&lt;br /&gt;
However, on WebOS each running Qt applications is a GUI server. Each application will thus create a '''/tmp/qtembedded-nnn''' directory. Therefore '''nnn''' must be unique for each Qt application. (maybe we need a convention to avoid conflicts - might be enough to use some randomly generated number for each app).&lt;br /&gt;
&lt;br /&gt;
main.cpp can be modified as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Generate the makefile and compile:&lt;br /&gt;
# ~/qte-48/bin/qmake fancybrowser.pro&lt;br /&gt;
# make&lt;br /&gt;
&lt;br /&gt;
Now the app is compiled. The Qt libs must also be deployed on the device. See the deployment section below for how to lay-out the files.&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Qt-QML app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Demos/4.8/declarative/webbrowser in your working directory, e.g. ~/webbrowser&lt;br /&gt;
&lt;br /&gt;
Essentially the same modifications must be made to the Qt-QML project as for the Qt-widget project, with some additions to the main file.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app, and in addition we must set the path where the QML imports can be found. This can be specified with the QML_IMPORT_PATH environment variable. We set-it up programmatically here.&lt;br /&gt;
&lt;br /&gt;
The file main.cpp looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP&lt;br /&gt;
    QString qmlpath = QString(pathexe)+&amp;quot;/imports&amp;quot;;&lt;br /&gt;
    if(!qputenv(&amp;quot;QML_IMPORT_PATH&amp;quot;,qmlpath.toAscii()))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set qml path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Same as for Qt-widget apps.&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Deployment ===&lt;br /&gt;
&lt;br /&gt;
We can now test the application, and create an IPK which can be uploaded to the HP or homebrew app repository.&lt;br /&gt;
&lt;br /&gt;
In order to test the app, it must be copied to the device together with Qt libs. The device directory structure, assuming the app is in APPDIR, must be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APPDIR:                  the application is here&lt;br /&gt;
APPDIR/qt:               qt libs. Copy ~/qte-48/lib/*.so.4 here)&lt;br /&gt;
APPDIR/fonts:            fonts (not needed if the WebOS fonts are used). Copy ~/qte-48/lib/fonts/* here&lt;br /&gt;
APPDIR/gfxdrivers:       gfxdrivers plugins. Copy ~/qte-48/plugins/gfxdrivers/* here&lt;br /&gt;
APPDIR/imageformats:     imageformats plugins. Copy ~/qte-48/plugins/imageformats/* here&lt;br /&gt;
APPDIR/imports:          QML stuff (not needed for Qt-widget). Copy ~/qte-48/imports/* here&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can deploy these files in /media/internal/APPDIR for testing and run the application from the command line.&lt;br /&gt;
&lt;br /&gt;
To create an IPK file you need in addition an appinfo.json file. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;A-Browser Qml (test)&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;pdk&amp;quot;,&lt;br /&gt;
	&amp;quot;main&amp;quot;: &amp;quot;abrowse-qml&amp;quot;,&lt;br /&gt;
	&amp;quot;id&amp;quot;: &amp;quot;net.danielroggen.abrowseqml&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
	&amp;quot;vendor&amp;quot;: &amp;quot;danielroggen&amp;quot;,&lt;br /&gt;
	&amp;quot;icon&amp;quot;:     &amp;quot;icon.png&amp;quot; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a STAGING directory which contains:&lt;br /&gt;
* the application&lt;br /&gt;
* the Qt stuff (keeping the directory structure mentionned above)&lt;br /&gt;
* the icon&lt;br /&gt;
* the appinfo.json&lt;br /&gt;
* any other required file&lt;br /&gt;
&lt;br /&gt;
And run '''palm-package STAGING'''. This will create an .ipk ready for distribution. Before distributing, try to install it on the device with Preware: copy the ipk to the device, run Preware and select the option to install ipk packages from the menu, and check that your app works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No virtual keyboard so far&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. Links ==&lt;br /&gt;
[1] [http://www.griffin.net/2010/02/qt-on-the-palm-pre.html Qt on the Palm Pre]&lt;br /&gt;
&lt;br /&gt;
[2] [https://gitorious.org/~darronb/qt/qt-palm-pre Qt port to webOS by Darron Black on gitorious]&lt;br /&gt;
&lt;br /&gt;
[3] A-Browser QML [http://danielroggen.net/sw/abrowse-qml.zip source] and [http://www.webosnation.com/a-browser-qml-test binary]&lt;br /&gt;
&lt;br /&gt;
[4] A-Browser Qt [http://danielroggen.net/sw/abrowse-qt.zip source] and [http://www.webosnation.com/a-browser-qt-test binary]&lt;br /&gt;
&lt;br /&gt;
[5] Updated [http://code.google.com/p/qt-webos/ WebOS gfxdrivers plugin]&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21953</id>
		<title>HowtoQt</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21953"/>
		<updated>2013-08-29T04:49:52Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* 2. Optional: completing the PDK with some missing includes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to cross-compile Qt for WebOS =&lt;br /&gt;
History:&lt;br /&gt;
&lt;br /&gt;
* 08.02.2012: first version&lt;br /&gt;
&lt;br /&gt;
= Qt and QML on WebOS devices =&lt;br /&gt;
&lt;br /&gt;
This document explains how to set-up [http://qt.nokia.com Qt 4.8 (Trolltech/Nokia's cross-platform application and UI framework)] on WebOS devices, and then how to cross-compile Qt or QML apps.&lt;br /&gt;
&lt;br /&gt;
This guide assumes:&lt;br /&gt;
* a Linux development environment (here Kubuntu 11.10 running in virtualbox on a win7 host)&lt;br /&gt;
* Qt 4.8 (the process for Qt 4.7.x is mostly identical; no idea for Qt 5)&lt;br /&gt;
* OpenSSH running on the webos device to scp files to it&lt;br /&gt;
* The reasonable development tools&lt;br /&gt;
&lt;br /&gt;
The steps include:&lt;br /&gt;
# Getting and setting-up the Palm PDK&lt;br /&gt;
# Optionally: completing the PDK with some missing includes&lt;br /&gt;
# Getting Qt 4.8, setting it up for cross-compilation&lt;br /&gt;
# Cross-compilation of Qt 4.8&lt;br /&gt;
# Updated webos port of Qt&lt;br /&gt;
# Application tweaks to look for libs in the right places&lt;br /&gt;
&lt;br /&gt;
== 1. Getting and setting up the Palm PDK ==&lt;br /&gt;
&lt;br /&gt;
Qt is cross-compiled with the official Palm PDK. The PDK plays nice: it can be installed alongside the webos internals WIDK without conflicts; there is no need to modify paths or environment variables.&lt;br /&gt;
&lt;br /&gt;
Note that I haven't &amp;quot;fully&amp;quot; installed the PDK. In particular I haven't set-up the emulator. The basic stuff needed are: the arm gcc toolchain, and novacom to communicate with the device. VirtualBox can be skipped. Java may be necessary.&lt;br /&gt;
&lt;br /&gt;
# Read about the [https://developer.palm.com/content/resources/develop/sdk_pdk_download.html#linux Palm SDK 3.05] and the installation procedure. Follow the instructions on there. But essentially this boils down to:&lt;br /&gt;
# Download novacom from that page&lt;br /&gt;
# Download the SDK from that page&lt;br /&gt;
# Install novacom and the SDK following the instructions. I.e.:&lt;br /&gt;
## sudo dpkg -i palm-sdk_3.0.5-svn528736-pho676_i386.deb&lt;br /&gt;
## sudo dpkg -i palm-novacom_1.0.80_i386.deb 	&lt;br /&gt;
&lt;br /&gt;
# The SDK is now in /opt/PalmPDK&lt;br /&gt;
&lt;br /&gt;
'''When you're running 64 bits Linux please make sure to also install ia32-libs by running:''' (otherwise you'll get the error that &amp;quot;arm-none-linux-gnueabi-g++ cannot be found&amp;quot;!)&lt;br /&gt;
# sudo apt-get install ia32-libs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may check that all is fine so far (or skip this - this is simply to step-by-step see if all is ok):&lt;br /&gt;
# You can invoke gcc or g++ from the PDK arm toolchain to compile some test program. E.g. '''/opt/PalmPDK/arm-gcc/bin/arm-none-linux-gnueabi-g++ hello.cpp -o hello'''&lt;br /&gt;
# You can copy this file to the usb drive on the device: '''scp hello root@ip.address.of.device:/media/internal'''&lt;br /&gt;
# You can go log on the device with novaterm: '''novaterm'''&lt;br /&gt;
# You can run your test program: '''/media/internal/hello'''&lt;br /&gt;
&lt;br /&gt;
If that works then on to the next steps.&lt;br /&gt;
&lt;br /&gt;
== 2. Optional: completing the PDK with some missing includes ==&lt;br /&gt;
&lt;br /&gt;
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit.&lt;br /&gt;
&lt;br /&gt;
There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - '''/opt/PalmPDK/include/asm/hwcap.h''' (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. &lt;br /&gt;
&lt;br /&gt;
Without these includes, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3.&lt;br /&gt;
&lt;br /&gt;
Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain.&lt;br /&gt;
&lt;br /&gt;
# Download the arm toolchain &amp;quot;Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux&amp;quot; from [http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-gnu-linux Mentor Graphics' website]. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2&lt;br /&gt;
# Untar this file: '''tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2'''&lt;br /&gt;
# Copy the entire include/asm directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include'''&lt;br /&gt;
# Copy the files int-l64.h and int-ll64.h from include/asm-generic directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm-generic/int* /opt/PalmPDK/arm-gcc/sysroot/usr/include/asm-generic'''&lt;br /&gt;
# Edit the /opt/PalmPDK/include/PDL_types.h to correct the path to SDL_keysym.h and SDL_stdinc.h. SDL_keysym.h are in /opt/PalmPDK/include/SDL and not in /opt/PalmPDK/include/ so we need to update the location of the includes. E.g. '''vi /opt/PalmPDK/include/PDL_types.h'''. The includes in file must look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#include &amp;lt;SDL/SDL_keysym.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SDL/SDL_stdinc.h&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You're set!&lt;br /&gt;
&lt;br /&gt;
== 3. Getting Qt 4.8, setting it up for cross-compilation ==&lt;br /&gt;
&lt;br /&gt;
This step gets the Qt 4.8 sources, and sets-up Qt for cross-compilation using the Palm PDK.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Get the Qt sources ===&lt;br /&gt;
&lt;br /&gt;
# Cd to your home directory: '''cd ~'''&lt;br /&gt;
# Get the Qt 4.8 sources: '''http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
# Untar: '''tar xvfz qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Qt mkspecs for WebOS ===&lt;br /&gt;
&lt;br /&gt;
We set-up the mkspecs for WebOS (compiler parameters required for cross-compilation):&lt;br /&gt;
&lt;br /&gt;
# Cd to the qws mkspecs: '''cd ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws'''&lt;br /&gt;
# The WebOS mkspecs are mostly the same as the linux-arm-gnueabi-g++ mkspecs. So we copy them and modify them afterwards: '''cp -r linux-arm-gnueabi-g++ linux-webos'''&lt;br /&gt;
# Edit the linux-webos mkspecs to set-up the cross-compiler path and other build parameters. E.g. '''vi ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws/linux-webos/qmake.conf'''. This file must look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#&lt;br /&gt;
# qmake configuration for WebOS builds with arm-linux-g++&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#for 4.7.4:&lt;br /&gt;
#include(../../common/g++.conf)&lt;br /&gt;
#include(../../common/linux.conf)&lt;br /&gt;
#include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# for 4.8&lt;br /&gt;
include(../../common/linux.conf)&lt;br /&gt;
include(../../common/gcc-base-unix.conf)&lt;br /&gt;
include(../../common/g++-unix.conf)&lt;br /&gt;
include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# modifications to g++.conf&lt;br /&gt;
#Toolchain&lt;br /&gt;
&lt;br /&gt;
#Base directory of gcc toolchain&lt;br /&gt;
&lt;br /&gt;
GCCBASE                 = /opt/PalmPDK/arm-gcc/bin&lt;br /&gt;
TSLIB_INCDIR            = /opt/PalmPDK/include&lt;br /&gt;
TSLIB_LIBDIR            = /opt/PalmPDK/device/lib&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Compiler Flags to take advantage of the ARM architecture&lt;br /&gt;
QMAKE_CFLAGS_RELEASE    = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CFLAGS_DEBUG      = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
QMAKE_CXXFLAGS_RELEASE  = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CXXFLAGS_DEBUG    = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
# For official pdk&lt;br /&gt;
QMAKE_CC                = $$GCCBASE/arm-none-linux-gnueabi-gcc&lt;br /&gt;
QMAKE_CXX               = $$GCCBASE/arm-none-linux-gnueabi-g++&lt;br /&gt;
QMAKE_LINK              = $$QMAKE_CXX&lt;br /&gt;
QMAKE_LINK_SHLIB        = $$QMAKE_CXX&lt;br /&gt;
QMAKE_RANLIB            = $$GCCBASE/arm-none-linux-gnueabi-ranlib&lt;br /&gt;
&lt;br /&gt;
# modifications to linux.conf&lt;br /&gt;
QMAKE_AR                = $$GCCBASE/arm-none-linux-gnueabi-ar cqs&lt;br /&gt;
QMAKE_OBJCOPY           = $$GCCBASE/arm-none-linux-gnueabi-objcopy&lt;br /&gt;
QMAKE_STRIP             = $$GCCBASE/arm-none-linux-gnueabi-strip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
QMAKE_INCDIR = $$TSLIB_INCDIR &lt;br /&gt;
QMAKE_LIBDIR = $$TSLIB_LIBDIR &lt;br /&gt;
QMAKE_LIBS   += -lrt -lz &lt;br /&gt;
&lt;br /&gt;
QMAKE_LFLAGS += -Wl,--allow-shlib-undefined &lt;br /&gt;
&lt;br /&gt;
load(qt_config)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.3 gfxdrivers plugin for WebOS ===&lt;br /&gt;
&lt;br /&gt;
Qt embedded needs a gfxdrivers plugin which allows Qt to show things on a screen, get keyboard input and mouse events. This step gets the WebOS Qt gfxdrivers plugin. &lt;br /&gt;
&lt;br /&gt;
The initial plugin version was written by Darron Black [1,2] and it uses SDL for graphics. With the changes in WebOS 2.x, that plugin doesn't work anymore: it uses root access to read the keyboard, but recent PDK apps are not running as root anymore but in jails. Therefore an extended version is required that handles keyboard input for &amp;quot;non-root&amp;quot; users. That version is available from [http://code.google.com/p/qt-webos Qt gfxdrivers plugin for WebOS on Google Code]. It has also tentative support for screen rotation.&lt;br /&gt;
&lt;br /&gt;
# Cd to the Qt gfxdrivers directory: '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers'''&lt;br /&gt;
# Get the WebOS gfxdrivers plugin from the svn repository: '''svn checkout http://qt-webos.googlecode.com/svn/trunk/ webos'''&lt;br /&gt;
# Edit ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/gfxdrivers.pro to add the line: '''contains(gfx-plugins, webos)        :SUBDIRS += webos'''&lt;br /&gt;
# In order to support screen rotation we need to patch the &amp;quot;transformed&amp;quot; screen driver. This driver is provided by Qt to do screen rotation or offsetting and it uses as back-end the driver doing the actual access to the pixels (that would be our webos qgfxdrivers). Unfortunately the transformed driver doesn't allow to &amp;quot;notify&amp;quot; SDL when pixels are changed. A quick hack is to patch ~/qt-everywhere-opensource-src-4.8.0t/src/gui/embedded/qscreentransformed_qws.cpp. In this patch we hijack the functionality of the &amp;quot;blank&amp;quot; method (which is supposed to blank the screen) to notify the WebOS gfxdrivers before and after pixels are modified. So edit qscreentransformed_qws.cpp around lines 430 and add the two lines marked with the comments below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
    screen()-&amp;gt;blank(true);                        // ADD THIS FOR WEBOS&lt;br /&gt;
    QWSDisplay::grab();&lt;br /&gt;
    for (int i = 0; i &amp;lt; rects.size(); ++i) {&lt;br /&gt;
        const QRect r = rects.at(i) &amp;amp; bound;&lt;br /&gt;
&lt;br /&gt;
        QPoint dst;&lt;br /&gt;
        switch (trans) {&lt;br /&gt;
        case Rot90:&lt;br /&gt;
            dst = mapToDevice(r.topRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot180:&lt;br /&gt;
            dst = mapToDevice(r.bottomRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot270:&lt;br /&gt;
            dst = mapToDevice(r.bottomLeft(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        func(this, image, r.translated(-topLeft), dst);&lt;br /&gt;
    }&lt;br /&gt;
    QWSDisplay::ungrab();&lt;br /&gt;
    screen()-&amp;gt;blank(false);                       // ADD THIS FOR WEBOS&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Cross-compile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we can configure and cross-compile Qt. The lines below configure Qt to install in ~/qte-48:&lt;br /&gt;
&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0'''&lt;br /&gt;
# '''./configure -v -prefix ~/qte-48 -embedded arm -platform qws/linux-x86-g++ -xplatform qws/linux-webos -depths 16,24,32 -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-nis -no-iconv -no-dbus -no-cups -no-largefile -no-accessibility -no-gtkstyle -no-qt3support -qt-gfx-vnc -plugin-gfx-vnc -no-glib -qtlibinfix 48 -xmlpatterns -exceptions -opensource -make libs -nomake tools -nomake demo -nomake examples -nomake docs -webkit -javascript-jit -script -scripttools -declarative -openssl -qt-gfx-transformed'''&lt;br /&gt;
# '''make -j4'''&lt;br /&gt;
# '''make install'''&lt;br /&gt;
&lt;br /&gt;
The WebOS gfxdrivers plugin must be compiled manually:&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/webos'''&lt;br /&gt;
# '''make'''&lt;br /&gt;
&lt;br /&gt;
This builds and copies the plugin into ~/qte-48/plugins/gfxdrivers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hopefully you've made it so far without problems! You now have Qt in ~/qte-48.&lt;br /&gt;
&lt;br /&gt;
== 4. Compiling Qt apps ==&lt;br /&gt;
&lt;br /&gt;
We see here how to compile a Qt app for Qt on WebOS. We look at two examples that are directly taken from the Qt distribution.  &lt;br /&gt;
# fancybrowser: this is a Qt-widget-based example browser. It is available in QTSDKDIR/Examples/4.8/webkit/fancybrowser. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qt.zip here]&lt;br /&gt;
# webbrowser: this is a Qt-QML-based example browser. It is available in QTSDKDRIR/Demos/4.8/declarative/webbrowser. Since this is a QML app, a QmlApplicationViewer must be used to run the QML files. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qml.zip here]&lt;br /&gt;
&lt;br /&gt;
The binaries are available on the WebOS homebrew app repository [www.webosnation.com/a-browser-qt-test here] and [www.webosnation.com/a-browser-qml-test here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The way compilation of the apps is mostly identical, but the QML-based project has a few extra complexities so we'll see first the widget-based project.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Qt-widget app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Examples/4.8/webkit/fancybrowser in your working directory, e.g. ~/fancybrowser&lt;br /&gt;
&lt;br /&gt;
Two things must be modified in the project: &lt;br /&gt;
* fancybrowser.pro: this is the project file, it must be modified to include the proper libraries&lt;br /&gt;
* main.cpp: this is the file in which the QApplication object is instanciated. We must do some setup to indicate to the application:&lt;br /&gt;
** where to find system fonts, &lt;br /&gt;
** to start the application as a GUI server application&lt;br /&gt;
** to use the WebOS gfxdrivers plugin, or to use the transformed gfxdrivers plugin in combination with the WebOS gfxdrivers plugin to support screen rotation.&lt;br /&gt;
&lt;br /&gt;
Note that one could avoid modifying main.cpp altogether because the same results can be achieved by environment variables and by command line arguments. Therefore a script could set the environment variables and call the executable with the appropriate parameters. However we go through the self-contained solution, which is a bit more complex but may seen as more clean.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
The pro file must be modified to link the PDL and SDL libs, and also to look for the Qt libraries at the right location at runtime. Here we assume that the Qt libs are in a subdirectory called 'qt' below the directory where the application is deployed. &lt;br /&gt;
&lt;br /&gt;
Modify fancybrowser.pro and add this at the end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
!win32: {&lt;br /&gt;
message(assume qws)&lt;br /&gt;
# Set the runtime path to a relative directory w.r.t. the location of the executable&lt;br /&gt;
LIBS += -Wl,-rpath,&amp;quot;'\$$ORIGIN/qt'&amp;quot; -L/opt/PalmPDK/device/lib -lpdl -lSDL&lt;br /&gt;
INCLUDEPATH += /opt/PalmPDK/include/SDL&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that '''!win32:{...}''' sets these parameters for any &amp;quot;non windows build&amp;quot; (I happen to build the desktop app on Windows and the WebOS app on Linux). Ideally we would rather have something for webos ('''webos:{...}''') but I did not investigate how to do enable that - if somebody knows, feel free to share.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
There are modifications to main.cpp in three categories.&lt;br /&gt;
&lt;br /&gt;
When instanciating a QApplication object the fonts are search in the directory specified by the QT_QWS_FONTDIR environment variable. To my knowledge this cannot be specified to QApplication in another way. Therefore we set programmatically QT_QWS_FONTDIR to where we have our fonts. There are two possibilities: we can deploy the fonts of Qt, or we can use the fonts already available on the WebOS device. Using the fonts of the WebOS device is fine so we use this. See the commented-out line for the alternative approach.&lt;br /&gt;
&lt;br /&gt;
When instanciating the QApplication object we want to start the application as a GUI server application. This is achieved by passing QApplication::GuiServer in the QApplication constructor. The alternative approach is to call the program with '''-qws''' on the command line.&lt;br /&gt;
&lt;br /&gt;
The gfxdrivers plugin must be specified. This can be done with the '''-display''' command line argument. Here we programmatically set this command line argument.&lt;br /&gt;
We have two alternatives. We can use directly the WebOS gfxdrivers plugin. This does not allow for screen rotation. The command line would then be ''''-display PalmPreSDLFb:nnn'''. &lt;br /&gt;
Alternatively, we can use the transformed gfxdrivers in combination with the WebOS gfxdrivers plugin. This allows for screen rotation. The command line would then be '''-display Transformed:PalmPreSDLFb:nnn'''.&lt;br /&gt;
&lt;br /&gt;
'''nnn''' is a number which you must set to identify the display driver. In a normal embedded system only a single GUI server application would run at any time, and this number can be the same for all applications (or even left out, QApplication assumes number 0 then). This number is used by Qt to create a temporary directory ('''/tmp/qtembedded-nnn''') that contains, among others, a font cache.&lt;br /&gt;
&lt;br /&gt;
However, on WebOS each running Qt applications is a GUI server. Each application will thus create a '''/tmp/qtembedded-nnn''' directory. Therefore '''nnn''' must be unique for each Qt application. (maybe we need a convention to avoid conflicts - might be enough to use some randomly generated number for each app).&lt;br /&gt;
&lt;br /&gt;
main.cpp can be modified as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Generate the makefile and compile:&lt;br /&gt;
# ~/qte-48/bin/qmake fancybrowser.pro&lt;br /&gt;
# make&lt;br /&gt;
&lt;br /&gt;
Now the app is compiled. The Qt libs must also be deployed on the device. See the deployment section below for how to lay-out the files.&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Qt-QML app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Demos/4.8/declarative/webbrowser in your working directory, e.g. ~/webbrowser&lt;br /&gt;
&lt;br /&gt;
Essentially the same modifications must be made to the Qt-QML project as for the Qt-widget project, with some additions to the main file.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app, and in addition we must set the path where the QML imports can be found. This can be specified with the QML_IMPORT_PATH environment variable. We set-it up programmatically here.&lt;br /&gt;
&lt;br /&gt;
The file main.cpp looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP&lt;br /&gt;
    QString qmlpath = QString(pathexe)+&amp;quot;/imports&amp;quot;;&lt;br /&gt;
    if(!qputenv(&amp;quot;QML_IMPORT_PATH&amp;quot;,qmlpath.toAscii()))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set qml path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Same as for Qt-widget apps.&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Deployment ===&lt;br /&gt;
&lt;br /&gt;
We can now test the application, and create an IPK which can be uploaded to the HP or homebrew app repository.&lt;br /&gt;
&lt;br /&gt;
In order to test the app, it must be copied to the device together with Qt libs. The device directory structure, assuming the app is in APPDIR, must be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APPDIR:                  the application is here&lt;br /&gt;
APPDIR/qt:               qt libs. Copy ~/qte-48/lib/*.so.4 here)&lt;br /&gt;
APPDIR/fonts:            fonts (not needed if the WebOS fonts are used). Copy ~/qte-48/lib/fonts/* here&lt;br /&gt;
APPDIR/gfxdrivers:       gfxdrivers plugins. Copy ~/qte-48/plugins/gfxdrivers/* here&lt;br /&gt;
APPDIR/imageformats:     imageformats plugins. Copy ~/qte-48/plugins/imageformats/* here&lt;br /&gt;
APPDIR/imports:          QML stuff (not needed for Qt-widget). Copy ~/qte-48/imports/* here&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can deploy these files in /media/internal/APPDIR for testing and run the application from the command line.&lt;br /&gt;
&lt;br /&gt;
To create an IPK file you need in addition an appinfo.json file. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;A-Browser Qml (test)&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;pdk&amp;quot;,&lt;br /&gt;
	&amp;quot;main&amp;quot;: &amp;quot;abrowse-qml&amp;quot;,&lt;br /&gt;
	&amp;quot;id&amp;quot;: &amp;quot;net.danielroggen.abrowseqml&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
	&amp;quot;vendor&amp;quot;: &amp;quot;danielroggen&amp;quot;,&lt;br /&gt;
	&amp;quot;icon&amp;quot;:     &amp;quot;icon.png&amp;quot; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a STAGING directory which contains:&lt;br /&gt;
* the application&lt;br /&gt;
* the Qt stuff (keeping the directory structure mentionned above)&lt;br /&gt;
* the icon&lt;br /&gt;
* the appinfo.json&lt;br /&gt;
* any other required file&lt;br /&gt;
&lt;br /&gt;
And run '''palm-package STAGING'''. This will create an .ipk ready for distribution. Before distributing, try to install it on the device with Preware: copy the ipk to the device, run Preware and select the option to install ipk packages from the menu, and check that your app works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No virtual keyboard so far&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. Links ==&lt;br /&gt;
[1] [http://www.griffin.net/2010/02/qt-on-the-palm-pre.html Qt on the Palm Pre]&lt;br /&gt;
&lt;br /&gt;
[2] [https://gitorious.org/~darronb/qt/qt-palm-pre Qt port to webOS by Darron Black on gitorious]&lt;br /&gt;
&lt;br /&gt;
[3] A-Browser QML [http://danielroggen.net/sw/abrowse-qml.zip source] and [http://www.webosnation.com/a-browser-qml-test binary]&lt;br /&gt;
&lt;br /&gt;
[4] A-Browser Qt [http://danielroggen.net/sw/abrowse-qt.zip source] and [http://www.webosnation.com/a-browser-qt-test binary]&lt;br /&gt;
&lt;br /&gt;
[5] Updated [http://code.google.com/p/qt-webos/ WebOS gfxdrivers plugin]&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21951</id>
		<title>HowtoQt</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21951"/>
		<updated>2013-08-29T04:43:43Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* 2. Optional: completing the PDK with some missing includes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to cross-compile Qt for WebOS =&lt;br /&gt;
History:&lt;br /&gt;
&lt;br /&gt;
* 08.02.2012: first version&lt;br /&gt;
&lt;br /&gt;
= Qt and QML on WebOS devices =&lt;br /&gt;
&lt;br /&gt;
This document explains how to set-up [http://qt.nokia.com Qt 4.8 (Trolltech/Nokia's cross-platform application and UI framework)] on WebOS devices, and then how to cross-compile Qt or QML apps.&lt;br /&gt;
&lt;br /&gt;
This guide assumes:&lt;br /&gt;
* a Linux development environment (here Kubuntu 11.10 running in virtualbox on a win7 host)&lt;br /&gt;
* Qt 4.8 (the process for Qt 4.7.x is mostly identical; no idea for Qt 5)&lt;br /&gt;
* OpenSSH running on the webos device to scp files to it&lt;br /&gt;
* The reasonable development tools&lt;br /&gt;
&lt;br /&gt;
The steps include:&lt;br /&gt;
# Getting and setting-up the Palm PDK&lt;br /&gt;
# Optionally: completing the PDK with some missing includes&lt;br /&gt;
# Getting Qt 4.8, setting it up for cross-compilation&lt;br /&gt;
# Cross-compilation of Qt 4.8&lt;br /&gt;
# Updated webos port of Qt&lt;br /&gt;
# Application tweaks to look for libs in the right places&lt;br /&gt;
&lt;br /&gt;
== 1. Getting and setting up the Palm PDK ==&lt;br /&gt;
&lt;br /&gt;
Qt is cross-compiled with the official Palm PDK. The PDK plays nice: it can be installed alongside the webos internals WIDK without conflicts; there is no need to modify paths or environment variables.&lt;br /&gt;
&lt;br /&gt;
Note that I haven't &amp;quot;fully&amp;quot; installed the PDK. In particular I haven't set-up the emulator. The basic stuff needed are: the arm gcc toolchain, and novacom to communicate with the device. VirtualBox can be skipped. Java may be necessary.&lt;br /&gt;
&lt;br /&gt;
# Read about the [https://developer.palm.com/content/resources/develop/sdk_pdk_download.html#linux Palm SDK 3.05] and the installation procedure. Follow the instructions on there. But essentially this boils down to:&lt;br /&gt;
# Download novacom from that page&lt;br /&gt;
# Download the SDK from that page&lt;br /&gt;
# Install novacom and the SDK following the instructions. I.e.:&lt;br /&gt;
## sudo dpkg -i palm-sdk_3.0.5-svn528736-pho676_i386.deb&lt;br /&gt;
## sudo dpkg -i palm-novacom_1.0.80_i386.deb 	&lt;br /&gt;
&lt;br /&gt;
# The SDK is now in /opt/PalmPDK&lt;br /&gt;
&lt;br /&gt;
'''When you're running 64 bits Linux please make sure to also install ia32-libs by running:''' (otherwise you'll get the error that &amp;quot;arm-none-linux-gnueabi-g++ cannot be found&amp;quot;!)&lt;br /&gt;
# sudo apt-get install ia32-libs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may check that all is fine so far (or skip this - this is simply to step-by-step see if all is ok):&lt;br /&gt;
# You can invoke gcc or g++ from the PDK arm toolchain to compile some test program. E.g. '''/opt/PalmPDK/arm-gcc/bin/arm-none-linux-gnueabi-g++ hello.cpp -o hello'''&lt;br /&gt;
# You can copy this file to the usb drive on the device: '''scp hello root@ip.address.of.device:/media/internal'''&lt;br /&gt;
# You can go log on the device with novaterm: '''novaterm'''&lt;br /&gt;
# You can run your test program: '''/media/internal/hello'''&lt;br /&gt;
&lt;br /&gt;
If that works then on to the next steps.&lt;br /&gt;
&lt;br /&gt;
== 2. Optional: completing the PDK with some missing includes ==&lt;br /&gt;
&lt;br /&gt;
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit.&lt;br /&gt;
&lt;br /&gt;
There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - '''/opt/PalmPDK/include/asm/hwcap.h''' (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. &lt;br /&gt;
&lt;br /&gt;
Without these includes, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3.&lt;br /&gt;
&lt;br /&gt;
Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain.&lt;br /&gt;
&lt;br /&gt;
# Download the arm toolchain &amp;quot;Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux&amp;quot; from [http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-gnu-linux Mentor Graphics' website]. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2&lt;br /&gt;
# Untar this file: '''tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2'''&lt;br /&gt;
# Copy the entire include/asm directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include'''&lt;br /&gt;
# Copy the files int-l64.h and int-ll64.h from include/asm-generic directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm-generic/int* /opt/PalmPDK/arm-gcc/sysroot/usr/include/asm-generic'''&lt;br /&gt;
&lt;br /&gt;
# Edit the /opt/PalmPDK/include/PDL_types.h to correct the path to SDL_keysym.h and SDL_stdinc.h. SDL_keysym.h are in /opt/PalmPDK/include/SDL and not in /opt/PalmPDK/include/ so we need to update the location of the includes. E.g. '''vi /opt/PalmPDK/include/PDL_types.h'''. The includes in file must look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#include &amp;lt;SDL/SDL_keysym.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SDL/SDL_stdinc.h&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You're set!&lt;br /&gt;
&lt;br /&gt;
== 3. Getting Qt 4.8, setting it up for cross-compilation ==&lt;br /&gt;
&lt;br /&gt;
This step gets the Qt 4.8 sources, and sets-up Qt for cross-compilation using the Palm PDK.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Get the Qt sources ===&lt;br /&gt;
&lt;br /&gt;
# Cd to your home directory: '''cd ~'''&lt;br /&gt;
# Get the Qt 4.8 sources: '''http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
# Untar: '''tar xvfz qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Qt mkspecs for WebOS ===&lt;br /&gt;
&lt;br /&gt;
We set-up the mkspecs for WebOS (compiler parameters required for cross-compilation):&lt;br /&gt;
&lt;br /&gt;
# Cd to the qws mkspecs: '''cd ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws'''&lt;br /&gt;
# The WebOS mkspecs are mostly the same as the linux-arm-gnueabi-g++ mkspecs. So we copy them and modify them afterwards: '''cp -r linux-arm-gnueabi-g++ linux-webos'''&lt;br /&gt;
# Edit the linux-webos mkspecs to set-up the cross-compiler path and other build parameters. E.g. '''vi ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws/linux-webos/qmake.conf'''. This file must look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#&lt;br /&gt;
# qmake configuration for WebOS builds with arm-linux-g++&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#for 4.7.4:&lt;br /&gt;
#include(../../common/g++.conf)&lt;br /&gt;
#include(../../common/linux.conf)&lt;br /&gt;
#include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# for 4.8&lt;br /&gt;
include(../../common/linux.conf)&lt;br /&gt;
include(../../common/gcc-base-unix.conf)&lt;br /&gt;
include(../../common/g++-unix.conf)&lt;br /&gt;
include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# modifications to g++.conf&lt;br /&gt;
#Toolchain&lt;br /&gt;
&lt;br /&gt;
#Base directory of gcc toolchain&lt;br /&gt;
&lt;br /&gt;
GCCBASE                 = /opt/PalmPDK/arm-gcc/bin&lt;br /&gt;
TSLIB_INCDIR            = /opt/PalmPDK/include&lt;br /&gt;
TSLIB_LIBDIR            = /opt/PalmPDK/device/lib&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Compiler Flags to take advantage of the ARM architecture&lt;br /&gt;
QMAKE_CFLAGS_RELEASE    = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CFLAGS_DEBUG      = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
QMAKE_CXXFLAGS_RELEASE  = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CXXFLAGS_DEBUG    = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
# For official pdk&lt;br /&gt;
QMAKE_CC                = $$GCCBASE/arm-none-linux-gnueabi-gcc&lt;br /&gt;
QMAKE_CXX               = $$GCCBASE/arm-none-linux-gnueabi-g++&lt;br /&gt;
QMAKE_LINK              = $$QMAKE_CXX&lt;br /&gt;
QMAKE_LINK_SHLIB        = $$QMAKE_CXX&lt;br /&gt;
QMAKE_RANLIB            = $$GCCBASE/arm-none-linux-gnueabi-ranlib&lt;br /&gt;
&lt;br /&gt;
# modifications to linux.conf&lt;br /&gt;
QMAKE_AR                = $$GCCBASE/arm-none-linux-gnueabi-ar cqs&lt;br /&gt;
QMAKE_OBJCOPY           = $$GCCBASE/arm-none-linux-gnueabi-objcopy&lt;br /&gt;
QMAKE_STRIP             = $$GCCBASE/arm-none-linux-gnueabi-strip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
QMAKE_INCDIR = $$TSLIB_INCDIR &lt;br /&gt;
QMAKE_LIBDIR = $$TSLIB_LIBDIR &lt;br /&gt;
QMAKE_LIBS   += -lrt -lz &lt;br /&gt;
&lt;br /&gt;
QMAKE_LFLAGS += -Wl,--allow-shlib-undefined &lt;br /&gt;
&lt;br /&gt;
load(qt_config)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.3 gfxdrivers plugin for WebOS ===&lt;br /&gt;
&lt;br /&gt;
Qt embedded needs a gfxdrivers plugin which allows Qt to show things on a screen, get keyboard input and mouse events. This step gets the WebOS Qt gfxdrivers plugin. &lt;br /&gt;
&lt;br /&gt;
The initial plugin version was written by Darron Black [1,2] and it uses SDL for graphics. With the changes in WebOS 2.x, that plugin doesn't work anymore: it uses root access to read the keyboard, but recent PDK apps are not running as root anymore but in jails. Therefore an extended version is required that handles keyboard input for &amp;quot;non-root&amp;quot; users. That version is available from [http://code.google.com/p/qt-webos Qt gfxdrivers plugin for WebOS on Google Code]. It has also tentative support for screen rotation.&lt;br /&gt;
&lt;br /&gt;
# Cd to the Qt gfxdrivers directory: '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers'''&lt;br /&gt;
# Get the WebOS gfxdrivers plugin from the svn repository: '''svn checkout http://qt-webos.googlecode.com/svn/trunk/ webos'''&lt;br /&gt;
# Edit ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/gfxdrivers.pro to add the line: '''contains(gfx-plugins, webos)        :SUBDIRS += webos'''&lt;br /&gt;
# In order to support screen rotation we need to patch the &amp;quot;transformed&amp;quot; screen driver. This driver is provided by Qt to do screen rotation or offsetting and it uses as back-end the driver doing the actual access to the pixels (that would be our webos qgfxdrivers). Unfortunately the transformed driver doesn't allow to &amp;quot;notify&amp;quot; SDL when pixels are changed. A quick hack is to patch ~/qt-everywhere-opensource-src-4.8.0t/src/gui/embedded/qscreentransformed_qws.cpp. In this patch we hijack the functionality of the &amp;quot;blank&amp;quot; method (which is supposed to blank the screen) to notify the WebOS gfxdrivers before and after pixels are modified. So edit qscreentransformed_qws.cpp around lines 430 and add the two lines marked with the comments below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
    screen()-&amp;gt;blank(true);                        // ADD THIS FOR WEBOS&lt;br /&gt;
    QWSDisplay::grab();&lt;br /&gt;
    for (int i = 0; i &amp;lt; rects.size(); ++i) {&lt;br /&gt;
        const QRect r = rects.at(i) &amp;amp; bound;&lt;br /&gt;
&lt;br /&gt;
        QPoint dst;&lt;br /&gt;
        switch (trans) {&lt;br /&gt;
        case Rot90:&lt;br /&gt;
            dst = mapToDevice(r.topRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot180:&lt;br /&gt;
            dst = mapToDevice(r.bottomRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot270:&lt;br /&gt;
            dst = mapToDevice(r.bottomLeft(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        func(this, image, r.translated(-topLeft), dst);&lt;br /&gt;
    }&lt;br /&gt;
    QWSDisplay::ungrab();&lt;br /&gt;
    screen()-&amp;gt;blank(false);                       // ADD THIS FOR WEBOS&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Cross-compile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we can configure and cross-compile Qt. The lines below configure Qt to install in ~/qte-48:&lt;br /&gt;
&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0'''&lt;br /&gt;
# '''./configure -v -prefix ~/qte-48 -embedded arm -platform qws/linux-x86-g++ -xplatform qws/linux-webos -depths 16,24,32 -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-nis -no-iconv -no-dbus -no-cups -no-largefile -no-accessibility -no-gtkstyle -no-qt3support -qt-gfx-vnc -plugin-gfx-vnc -no-glib -qtlibinfix 48 -xmlpatterns -exceptions -opensource -make libs -nomake tools -nomake demo -nomake examples -nomake docs -webkit -javascript-jit -script -scripttools -declarative -openssl -qt-gfx-transformed'''&lt;br /&gt;
# '''make -j4'''&lt;br /&gt;
# '''make install'''&lt;br /&gt;
&lt;br /&gt;
The WebOS gfxdrivers plugin must be compiled manually:&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/webos'''&lt;br /&gt;
# '''make'''&lt;br /&gt;
&lt;br /&gt;
This builds and copies the plugin into ~/qte-48/plugins/gfxdrivers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hopefully you've made it so far without problems! You now have Qt in ~/qte-48.&lt;br /&gt;
&lt;br /&gt;
== 4. Compiling Qt apps ==&lt;br /&gt;
&lt;br /&gt;
We see here how to compile a Qt app for Qt on WebOS. We look at two examples that are directly taken from the Qt distribution.  &lt;br /&gt;
# fancybrowser: this is a Qt-widget-based example browser. It is available in QTSDKDIR/Examples/4.8/webkit/fancybrowser. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qt.zip here]&lt;br /&gt;
# webbrowser: this is a Qt-QML-based example browser. It is available in QTSDKDRIR/Demos/4.8/declarative/webbrowser. Since this is a QML app, a QmlApplicationViewer must be used to run the QML files. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qml.zip here]&lt;br /&gt;
&lt;br /&gt;
The binaries are available on the WebOS homebrew app repository [www.webosnation.com/a-browser-qt-test here] and [www.webosnation.com/a-browser-qml-test here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The way compilation of the apps is mostly identical, but the QML-based project has a few extra complexities so we'll see first the widget-based project.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Qt-widget app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Examples/4.8/webkit/fancybrowser in your working directory, e.g. ~/fancybrowser&lt;br /&gt;
&lt;br /&gt;
Two things must be modified in the project: &lt;br /&gt;
* fancybrowser.pro: this is the project file, it must be modified to include the proper libraries&lt;br /&gt;
* main.cpp: this is the file in which the QApplication object is instanciated. We must do some setup to indicate to the application:&lt;br /&gt;
** where to find system fonts, &lt;br /&gt;
** to start the application as a GUI server application&lt;br /&gt;
** to use the WebOS gfxdrivers plugin, or to use the transformed gfxdrivers plugin in combination with the WebOS gfxdrivers plugin to support screen rotation.&lt;br /&gt;
&lt;br /&gt;
Note that one could avoid modifying main.cpp altogether because the same results can be achieved by environment variables and by command line arguments. Therefore a script could set the environment variables and call the executable with the appropriate parameters. However we go through the self-contained solution, which is a bit more complex but may seen as more clean.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
The pro file must be modified to link the PDL and SDL libs, and also to look for the Qt libraries at the right location at runtime. Here we assume that the Qt libs are in a subdirectory called 'qt' below the directory where the application is deployed. &lt;br /&gt;
&lt;br /&gt;
Modify fancybrowser.pro and add this at the end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
!win32: {&lt;br /&gt;
message(assume qws)&lt;br /&gt;
# Set the runtime path to a relative directory w.r.t. the location of the executable&lt;br /&gt;
LIBS += -Wl,-rpath,&amp;quot;'\$$ORIGIN/qt'&amp;quot; -L/opt/PalmPDK/device/lib -lpdl -lSDL&lt;br /&gt;
INCLUDEPATH += /opt/PalmPDK/include/SDL&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that '''!win32:{...}''' sets these parameters for any &amp;quot;non windows build&amp;quot; (I happen to build the desktop app on Windows and the WebOS app on Linux). Ideally we would rather have something for webos ('''webos:{...}''') but I did not investigate how to do enable that - if somebody knows, feel free to share.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
There are modifications to main.cpp in three categories.&lt;br /&gt;
&lt;br /&gt;
When instanciating a QApplication object the fonts are search in the directory specified by the QT_QWS_FONTDIR environment variable. To my knowledge this cannot be specified to QApplication in another way. Therefore we set programmatically QT_QWS_FONTDIR to where we have our fonts. There are two possibilities: we can deploy the fonts of Qt, or we can use the fonts already available on the WebOS device. Using the fonts of the WebOS device is fine so we use this. See the commented-out line for the alternative approach.&lt;br /&gt;
&lt;br /&gt;
When instanciating the QApplication object we want to start the application as a GUI server application. This is achieved by passing QApplication::GuiServer in the QApplication constructor. The alternative approach is to call the program with '''-qws''' on the command line.&lt;br /&gt;
&lt;br /&gt;
The gfxdrivers plugin must be specified. This can be done with the '''-display''' command line argument. Here we programmatically set this command line argument.&lt;br /&gt;
We have two alternatives. We can use directly the WebOS gfxdrivers plugin. This does not allow for screen rotation. The command line would then be ''''-display PalmPreSDLFb:nnn'''. &lt;br /&gt;
Alternatively, we can use the transformed gfxdrivers in combination with the WebOS gfxdrivers plugin. This allows for screen rotation. The command line would then be '''-display Transformed:PalmPreSDLFb:nnn'''.&lt;br /&gt;
&lt;br /&gt;
'''nnn''' is a number which you must set to identify the display driver. In a normal embedded system only a single GUI server application would run at any time, and this number can be the same for all applications (or even left out, QApplication assumes number 0 then). This number is used by Qt to create a temporary directory ('''/tmp/qtembedded-nnn''') that contains, among others, a font cache.&lt;br /&gt;
&lt;br /&gt;
However, on WebOS each running Qt applications is a GUI server. Each application will thus create a '''/tmp/qtembedded-nnn''' directory. Therefore '''nnn''' must be unique for each Qt application. (maybe we need a convention to avoid conflicts - might be enough to use some randomly generated number for each app).&lt;br /&gt;
&lt;br /&gt;
main.cpp can be modified as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Generate the makefile and compile:&lt;br /&gt;
# ~/qte-48/bin/qmake fancybrowser.pro&lt;br /&gt;
# make&lt;br /&gt;
&lt;br /&gt;
Now the app is compiled. The Qt libs must also be deployed on the device. See the deployment section below for how to lay-out the files.&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Qt-QML app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Demos/4.8/declarative/webbrowser in your working directory, e.g. ~/webbrowser&lt;br /&gt;
&lt;br /&gt;
Essentially the same modifications must be made to the Qt-QML project as for the Qt-widget project, with some additions to the main file.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app, and in addition we must set the path where the QML imports can be found. This can be specified with the QML_IMPORT_PATH environment variable. We set-it up programmatically here.&lt;br /&gt;
&lt;br /&gt;
The file main.cpp looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP&lt;br /&gt;
    QString qmlpath = QString(pathexe)+&amp;quot;/imports&amp;quot;;&lt;br /&gt;
    if(!qputenv(&amp;quot;QML_IMPORT_PATH&amp;quot;,qmlpath.toAscii()))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set qml path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Same as for Qt-widget apps.&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Deployment ===&lt;br /&gt;
&lt;br /&gt;
We can now test the application, and create an IPK which can be uploaded to the HP or homebrew app repository.&lt;br /&gt;
&lt;br /&gt;
In order to test the app, it must be copied to the device together with Qt libs. The device directory structure, assuming the app is in APPDIR, must be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APPDIR:                  the application is here&lt;br /&gt;
APPDIR/qt:               qt libs. Copy ~/qte-48/lib/*.so.4 here)&lt;br /&gt;
APPDIR/fonts:            fonts (not needed if the WebOS fonts are used). Copy ~/qte-48/lib/fonts/* here&lt;br /&gt;
APPDIR/gfxdrivers:       gfxdrivers plugins. Copy ~/qte-48/plugins/gfxdrivers/* here&lt;br /&gt;
APPDIR/imageformats:     imageformats plugins. Copy ~/qte-48/plugins/imageformats/* here&lt;br /&gt;
APPDIR/imports:          QML stuff (not needed for Qt-widget). Copy ~/qte-48/imports/* here&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can deploy these files in /media/internal/APPDIR for testing and run the application from the command line.&lt;br /&gt;
&lt;br /&gt;
To create an IPK file you need in addition an appinfo.json file. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;A-Browser Qml (test)&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;pdk&amp;quot;,&lt;br /&gt;
	&amp;quot;main&amp;quot;: &amp;quot;abrowse-qml&amp;quot;,&lt;br /&gt;
	&amp;quot;id&amp;quot;: &amp;quot;net.danielroggen.abrowseqml&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
	&amp;quot;vendor&amp;quot;: &amp;quot;danielroggen&amp;quot;,&lt;br /&gt;
	&amp;quot;icon&amp;quot;:     &amp;quot;icon.png&amp;quot; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a STAGING directory which contains:&lt;br /&gt;
* the application&lt;br /&gt;
* the Qt stuff (keeping the directory structure mentionned above)&lt;br /&gt;
* the icon&lt;br /&gt;
* the appinfo.json&lt;br /&gt;
* any other required file&lt;br /&gt;
&lt;br /&gt;
And run '''palm-package STAGING'''. This will create an .ipk ready for distribution. Before distributing, try to install it on the device with Preware: copy the ipk to the device, run Preware and select the option to install ipk packages from the menu, and check that your app works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No virtual keyboard so far&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. Links ==&lt;br /&gt;
[1] [http://www.griffin.net/2010/02/qt-on-the-palm-pre.html Qt on the Palm Pre]&lt;br /&gt;
&lt;br /&gt;
[2] [https://gitorious.org/~darronb/qt/qt-palm-pre Qt port to webOS by Darron Black on gitorious]&lt;br /&gt;
&lt;br /&gt;
[3] A-Browser QML [http://danielroggen.net/sw/abrowse-qml.zip source] and [http://www.webosnation.com/a-browser-qml-test binary]&lt;br /&gt;
&lt;br /&gt;
[4] A-Browser Qt [http://danielroggen.net/sw/abrowse-qt.zip source] and [http://www.webosnation.com/a-browser-qt-test binary]&lt;br /&gt;
&lt;br /&gt;
[5] Updated [http://code.google.com/p/qt-webos/ WebOS gfxdrivers plugin]&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21949</id>
		<title>HowtoQt</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21949"/>
		<updated>2013-08-29T04:42:35Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* 2. Optional: completing the PDK with some missing includes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to cross-compile Qt for WebOS =&lt;br /&gt;
History:&lt;br /&gt;
&lt;br /&gt;
* 08.02.2012: first version&lt;br /&gt;
&lt;br /&gt;
= Qt and QML on WebOS devices =&lt;br /&gt;
&lt;br /&gt;
This document explains how to set-up [http://qt.nokia.com Qt 4.8 (Trolltech/Nokia's cross-platform application and UI framework)] on WebOS devices, and then how to cross-compile Qt or QML apps.&lt;br /&gt;
&lt;br /&gt;
This guide assumes:&lt;br /&gt;
* a Linux development environment (here Kubuntu 11.10 running in virtualbox on a win7 host)&lt;br /&gt;
* Qt 4.8 (the process for Qt 4.7.x is mostly identical; no idea for Qt 5)&lt;br /&gt;
* OpenSSH running on the webos device to scp files to it&lt;br /&gt;
* The reasonable development tools&lt;br /&gt;
&lt;br /&gt;
The steps include:&lt;br /&gt;
# Getting and setting-up the Palm PDK&lt;br /&gt;
# Optionally: completing the PDK with some missing includes&lt;br /&gt;
# Getting Qt 4.8, setting it up for cross-compilation&lt;br /&gt;
# Cross-compilation of Qt 4.8&lt;br /&gt;
# Updated webos port of Qt&lt;br /&gt;
# Application tweaks to look for libs in the right places&lt;br /&gt;
&lt;br /&gt;
== 1. Getting and setting up the Palm PDK ==&lt;br /&gt;
&lt;br /&gt;
Qt is cross-compiled with the official Palm PDK. The PDK plays nice: it can be installed alongside the webos internals WIDK without conflicts; there is no need to modify paths or environment variables.&lt;br /&gt;
&lt;br /&gt;
Note that I haven't &amp;quot;fully&amp;quot; installed the PDK. In particular I haven't set-up the emulator. The basic stuff needed are: the arm gcc toolchain, and novacom to communicate with the device. VirtualBox can be skipped. Java may be necessary.&lt;br /&gt;
&lt;br /&gt;
# Read about the [https://developer.palm.com/content/resources/develop/sdk_pdk_download.html#linux Palm SDK 3.05] and the installation procedure. Follow the instructions on there. But essentially this boils down to:&lt;br /&gt;
# Download novacom from that page&lt;br /&gt;
# Download the SDK from that page&lt;br /&gt;
# Install novacom and the SDK following the instructions. I.e.:&lt;br /&gt;
## sudo dpkg -i palm-sdk_3.0.5-svn528736-pho676_i386.deb&lt;br /&gt;
## sudo dpkg -i palm-novacom_1.0.80_i386.deb 	&lt;br /&gt;
&lt;br /&gt;
# The SDK is now in /opt/PalmPDK&lt;br /&gt;
&lt;br /&gt;
'''When you're running 64 bits Linux please make sure to also install ia32-libs by running:''' (otherwise you'll get the error that &amp;quot;arm-none-linux-gnueabi-g++ cannot be found&amp;quot;!)&lt;br /&gt;
# sudo apt-get install ia32-libs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may check that all is fine so far (or skip this - this is simply to step-by-step see if all is ok):&lt;br /&gt;
# You can invoke gcc or g++ from the PDK arm toolchain to compile some test program. E.g. '''/opt/PalmPDK/arm-gcc/bin/arm-none-linux-gnueabi-g++ hello.cpp -o hello'''&lt;br /&gt;
# You can copy this file to the usb drive on the device: '''scp hello root@ip.address.of.device:/media/internal'''&lt;br /&gt;
# You can go log on the device with novaterm: '''novaterm'''&lt;br /&gt;
# You can run your test program: '''/media/internal/hello'''&lt;br /&gt;
&lt;br /&gt;
If that works then on to the next steps.&lt;br /&gt;
&lt;br /&gt;
== 2. Optional: completing the PDK with some missing includes ==&lt;br /&gt;
&lt;br /&gt;
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit.&lt;br /&gt;
&lt;br /&gt;
There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - '''/opt/PalmPDK/include/asm/hwcap.h''' (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. &lt;br /&gt;
&lt;br /&gt;
Without these includes, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3.&lt;br /&gt;
&lt;br /&gt;
Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain.&lt;br /&gt;
&lt;br /&gt;
# Download the arm toolchain &amp;quot;Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux&amp;quot; from [http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-gnu-linux Mentor Graphics' website]. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2&lt;br /&gt;
# Untar this file: '''tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2'''&lt;br /&gt;
# Copy the entire include/asm directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include'''&lt;br /&gt;
# Copy the files int-l64.h and int-ll64.h from include/asm-generic directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm-generic/int* /opt/PalmPDK/arm-gcc/sysroot/usr/include/asm-generic'''&lt;br /&gt;
&lt;br /&gt;
# Edit the /opt/PalmPDK/include/PDL_types.h to correct the path to SDL_keysym.h and SDL_stdinc.h E.g. '''vi /opt/PalmPDK/include/PDL_types.h'''. The includes in file must look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#include &amp;lt;SDL/SDL_keysym.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SDL/SDL_stdinc.h&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You're set!&lt;br /&gt;
&lt;br /&gt;
== 3. Getting Qt 4.8, setting it up for cross-compilation ==&lt;br /&gt;
&lt;br /&gt;
This step gets the Qt 4.8 sources, and sets-up Qt for cross-compilation using the Palm PDK.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Get the Qt sources ===&lt;br /&gt;
&lt;br /&gt;
# Cd to your home directory: '''cd ~'''&lt;br /&gt;
# Get the Qt 4.8 sources: '''http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
# Untar: '''tar xvfz qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Qt mkspecs for WebOS ===&lt;br /&gt;
&lt;br /&gt;
We set-up the mkspecs for WebOS (compiler parameters required for cross-compilation):&lt;br /&gt;
&lt;br /&gt;
# Cd to the qws mkspecs: '''cd ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws'''&lt;br /&gt;
# The WebOS mkspecs are mostly the same as the linux-arm-gnueabi-g++ mkspecs. So we copy them and modify them afterwards: '''cp -r linux-arm-gnueabi-g++ linux-webos'''&lt;br /&gt;
# Edit the linux-webos mkspecs to set-up the cross-compiler path and other build parameters. E.g. '''vi ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws/linux-webos/qmake.conf'''. This file must look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#&lt;br /&gt;
# qmake configuration for WebOS builds with arm-linux-g++&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#for 4.7.4:&lt;br /&gt;
#include(../../common/g++.conf)&lt;br /&gt;
#include(../../common/linux.conf)&lt;br /&gt;
#include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# for 4.8&lt;br /&gt;
include(../../common/linux.conf)&lt;br /&gt;
include(../../common/gcc-base-unix.conf)&lt;br /&gt;
include(../../common/g++-unix.conf)&lt;br /&gt;
include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# modifications to g++.conf&lt;br /&gt;
#Toolchain&lt;br /&gt;
&lt;br /&gt;
#Base directory of gcc toolchain&lt;br /&gt;
&lt;br /&gt;
GCCBASE                 = /opt/PalmPDK/arm-gcc/bin&lt;br /&gt;
TSLIB_INCDIR            = /opt/PalmPDK/include&lt;br /&gt;
TSLIB_LIBDIR            = /opt/PalmPDK/device/lib&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Compiler Flags to take advantage of the ARM architecture&lt;br /&gt;
QMAKE_CFLAGS_RELEASE    = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CFLAGS_DEBUG      = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
QMAKE_CXXFLAGS_RELEASE  = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CXXFLAGS_DEBUG    = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
# For official pdk&lt;br /&gt;
QMAKE_CC                = $$GCCBASE/arm-none-linux-gnueabi-gcc&lt;br /&gt;
QMAKE_CXX               = $$GCCBASE/arm-none-linux-gnueabi-g++&lt;br /&gt;
QMAKE_LINK              = $$QMAKE_CXX&lt;br /&gt;
QMAKE_LINK_SHLIB        = $$QMAKE_CXX&lt;br /&gt;
QMAKE_RANLIB            = $$GCCBASE/arm-none-linux-gnueabi-ranlib&lt;br /&gt;
&lt;br /&gt;
# modifications to linux.conf&lt;br /&gt;
QMAKE_AR                = $$GCCBASE/arm-none-linux-gnueabi-ar cqs&lt;br /&gt;
QMAKE_OBJCOPY           = $$GCCBASE/arm-none-linux-gnueabi-objcopy&lt;br /&gt;
QMAKE_STRIP             = $$GCCBASE/arm-none-linux-gnueabi-strip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
QMAKE_INCDIR = $$TSLIB_INCDIR &lt;br /&gt;
QMAKE_LIBDIR = $$TSLIB_LIBDIR &lt;br /&gt;
QMAKE_LIBS   += -lrt -lz &lt;br /&gt;
&lt;br /&gt;
QMAKE_LFLAGS += -Wl,--allow-shlib-undefined &lt;br /&gt;
&lt;br /&gt;
load(qt_config)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.3 gfxdrivers plugin for WebOS ===&lt;br /&gt;
&lt;br /&gt;
Qt embedded needs a gfxdrivers plugin which allows Qt to show things on a screen, get keyboard input and mouse events. This step gets the WebOS Qt gfxdrivers plugin. &lt;br /&gt;
&lt;br /&gt;
The initial plugin version was written by Darron Black [1,2] and it uses SDL for graphics. With the changes in WebOS 2.x, that plugin doesn't work anymore: it uses root access to read the keyboard, but recent PDK apps are not running as root anymore but in jails. Therefore an extended version is required that handles keyboard input for &amp;quot;non-root&amp;quot; users. That version is available from [http://code.google.com/p/qt-webos Qt gfxdrivers plugin for WebOS on Google Code]. It has also tentative support for screen rotation.&lt;br /&gt;
&lt;br /&gt;
# Cd to the Qt gfxdrivers directory: '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers'''&lt;br /&gt;
# Get the WebOS gfxdrivers plugin from the svn repository: '''svn checkout http://qt-webos.googlecode.com/svn/trunk/ webos'''&lt;br /&gt;
# Edit ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/gfxdrivers.pro to add the line: '''contains(gfx-plugins, webos)        :SUBDIRS += webos'''&lt;br /&gt;
# In order to support screen rotation we need to patch the &amp;quot;transformed&amp;quot; screen driver. This driver is provided by Qt to do screen rotation or offsetting and it uses as back-end the driver doing the actual access to the pixels (that would be our webos qgfxdrivers). Unfortunately the transformed driver doesn't allow to &amp;quot;notify&amp;quot; SDL when pixels are changed. A quick hack is to patch ~/qt-everywhere-opensource-src-4.8.0t/src/gui/embedded/qscreentransformed_qws.cpp. In this patch we hijack the functionality of the &amp;quot;blank&amp;quot; method (which is supposed to blank the screen) to notify the WebOS gfxdrivers before and after pixels are modified. So edit qscreentransformed_qws.cpp around lines 430 and add the two lines marked with the comments below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
    screen()-&amp;gt;blank(true);                        // ADD THIS FOR WEBOS&lt;br /&gt;
    QWSDisplay::grab();&lt;br /&gt;
    for (int i = 0; i &amp;lt; rects.size(); ++i) {&lt;br /&gt;
        const QRect r = rects.at(i) &amp;amp; bound;&lt;br /&gt;
&lt;br /&gt;
        QPoint dst;&lt;br /&gt;
        switch (trans) {&lt;br /&gt;
        case Rot90:&lt;br /&gt;
            dst = mapToDevice(r.topRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot180:&lt;br /&gt;
            dst = mapToDevice(r.bottomRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot270:&lt;br /&gt;
            dst = mapToDevice(r.bottomLeft(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        func(this, image, r.translated(-topLeft), dst);&lt;br /&gt;
    }&lt;br /&gt;
    QWSDisplay::ungrab();&lt;br /&gt;
    screen()-&amp;gt;blank(false);                       // ADD THIS FOR WEBOS&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Cross-compile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we can configure and cross-compile Qt. The lines below configure Qt to install in ~/qte-48:&lt;br /&gt;
&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0'''&lt;br /&gt;
# '''./configure -v -prefix ~/qte-48 -embedded arm -platform qws/linux-x86-g++ -xplatform qws/linux-webos -depths 16,24,32 -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-nis -no-iconv -no-dbus -no-cups -no-largefile -no-accessibility -no-gtkstyle -no-qt3support -qt-gfx-vnc -plugin-gfx-vnc -no-glib -qtlibinfix 48 -xmlpatterns -exceptions -opensource -make libs -nomake tools -nomake demo -nomake examples -nomake docs -webkit -javascript-jit -script -scripttools -declarative -openssl -qt-gfx-transformed'''&lt;br /&gt;
# '''make -j4'''&lt;br /&gt;
# '''make install'''&lt;br /&gt;
&lt;br /&gt;
The WebOS gfxdrivers plugin must be compiled manually:&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/webos'''&lt;br /&gt;
# '''make'''&lt;br /&gt;
&lt;br /&gt;
This builds and copies the plugin into ~/qte-48/plugins/gfxdrivers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hopefully you've made it so far without problems! You now have Qt in ~/qte-48.&lt;br /&gt;
&lt;br /&gt;
== 4. Compiling Qt apps ==&lt;br /&gt;
&lt;br /&gt;
We see here how to compile a Qt app for Qt on WebOS. We look at two examples that are directly taken from the Qt distribution.  &lt;br /&gt;
# fancybrowser: this is a Qt-widget-based example browser. It is available in QTSDKDIR/Examples/4.8/webkit/fancybrowser. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qt.zip here]&lt;br /&gt;
# webbrowser: this is a Qt-QML-based example browser. It is available in QTSDKDRIR/Demos/4.8/declarative/webbrowser. Since this is a QML app, a QmlApplicationViewer must be used to run the QML files. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qml.zip here]&lt;br /&gt;
&lt;br /&gt;
The binaries are available on the WebOS homebrew app repository [www.webosnation.com/a-browser-qt-test here] and [www.webosnation.com/a-browser-qml-test here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The way compilation of the apps is mostly identical, but the QML-based project has a few extra complexities so we'll see first the widget-based project.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Qt-widget app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Examples/4.8/webkit/fancybrowser in your working directory, e.g. ~/fancybrowser&lt;br /&gt;
&lt;br /&gt;
Two things must be modified in the project: &lt;br /&gt;
* fancybrowser.pro: this is the project file, it must be modified to include the proper libraries&lt;br /&gt;
* main.cpp: this is the file in which the QApplication object is instanciated. We must do some setup to indicate to the application:&lt;br /&gt;
** where to find system fonts, &lt;br /&gt;
** to start the application as a GUI server application&lt;br /&gt;
** to use the WebOS gfxdrivers plugin, or to use the transformed gfxdrivers plugin in combination with the WebOS gfxdrivers plugin to support screen rotation.&lt;br /&gt;
&lt;br /&gt;
Note that one could avoid modifying main.cpp altogether because the same results can be achieved by environment variables and by command line arguments. Therefore a script could set the environment variables and call the executable with the appropriate parameters. However we go through the self-contained solution, which is a bit more complex but may seen as more clean.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
The pro file must be modified to link the PDL and SDL libs, and also to look for the Qt libraries at the right location at runtime. Here we assume that the Qt libs are in a subdirectory called 'qt' below the directory where the application is deployed. &lt;br /&gt;
&lt;br /&gt;
Modify fancybrowser.pro and add this at the end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
!win32: {&lt;br /&gt;
message(assume qws)&lt;br /&gt;
# Set the runtime path to a relative directory w.r.t. the location of the executable&lt;br /&gt;
LIBS += -Wl,-rpath,&amp;quot;'\$$ORIGIN/qt'&amp;quot; -L/opt/PalmPDK/device/lib -lpdl -lSDL&lt;br /&gt;
INCLUDEPATH += /opt/PalmPDK/include/SDL&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that '''!win32:{...}''' sets these parameters for any &amp;quot;non windows build&amp;quot; (I happen to build the desktop app on Windows and the WebOS app on Linux). Ideally we would rather have something for webos ('''webos:{...}''') but I did not investigate how to do enable that - if somebody knows, feel free to share.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
There are modifications to main.cpp in three categories.&lt;br /&gt;
&lt;br /&gt;
When instanciating a QApplication object the fonts are search in the directory specified by the QT_QWS_FONTDIR environment variable. To my knowledge this cannot be specified to QApplication in another way. Therefore we set programmatically QT_QWS_FONTDIR to where we have our fonts. There are two possibilities: we can deploy the fonts of Qt, or we can use the fonts already available on the WebOS device. Using the fonts of the WebOS device is fine so we use this. See the commented-out line for the alternative approach.&lt;br /&gt;
&lt;br /&gt;
When instanciating the QApplication object we want to start the application as a GUI server application. This is achieved by passing QApplication::GuiServer in the QApplication constructor. The alternative approach is to call the program with '''-qws''' on the command line.&lt;br /&gt;
&lt;br /&gt;
The gfxdrivers plugin must be specified. This can be done with the '''-display''' command line argument. Here we programmatically set this command line argument.&lt;br /&gt;
We have two alternatives. We can use directly the WebOS gfxdrivers plugin. This does not allow for screen rotation. The command line would then be ''''-display PalmPreSDLFb:nnn'''. &lt;br /&gt;
Alternatively, we can use the transformed gfxdrivers in combination with the WebOS gfxdrivers plugin. This allows for screen rotation. The command line would then be '''-display Transformed:PalmPreSDLFb:nnn'''.&lt;br /&gt;
&lt;br /&gt;
'''nnn''' is a number which you must set to identify the display driver. In a normal embedded system only a single GUI server application would run at any time, and this number can be the same for all applications (or even left out, QApplication assumes number 0 then). This number is used by Qt to create a temporary directory ('''/tmp/qtembedded-nnn''') that contains, among others, a font cache.&lt;br /&gt;
&lt;br /&gt;
However, on WebOS each running Qt applications is a GUI server. Each application will thus create a '''/tmp/qtembedded-nnn''' directory. Therefore '''nnn''' must be unique for each Qt application. (maybe we need a convention to avoid conflicts - might be enough to use some randomly generated number for each app).&lt;br /&gt;
&lt;br /&gt;
main.cpp can be modified as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Generate the makefile and compile:&lt;br /&gt;
# ~/qte-48/bin/qmake fancybrowser.pro&lt;br /&gt;
# make&lt;br /&gt;
&lt;br /&gt;
Now the app is compiled. The Qt libs must also be deployed on the device. See the deployment section below for how to lay-out the files.&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Qt-QML app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Demos/4.8/declarative/webbrowser in your working directory, e.g. ~/webbrowser&lt;br /&gt;
&lt;br /&gt;
Essentially the same modifications must be made to the Qt-QML project as for the Qt-widget project, with some additions to the main file.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app, and in addition we must set the path where the QML imports can be found. This can be specified with the QML_IMPORT_PATH environment variable. We set-it up programmatically here.&lt;br /&gt;
&lt;br /&gt;
The file main.cpp looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP&lt;br /&gt;
    QString qmlpath = QString(pathexe)+&amp;quot;/imports&amp;quot;;&lt;br /&gt;
    if(!qputenv(&amp;quot;QML_IMPORT_PATH&amp;quot;,qmlpath.toAscii()))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set qml path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Same as for Qt-widget apps.&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Deployment ===&lt;br /&gt;
&lt;br /&gt;
We can now test the application, and create an IPK which can be uploaded to the HP or homebrew app repository.&lt;br /&gt;
&lt;br /&gt;
In order to test the app, it must be copied to the device together with Qt libs. The device directory structure, assuming the app is in APPDIR, must be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APPDIR:                  the application is here&lt;br /&gt;
APPDIR/qt:               qt libs. Copy ~/qte-48/lib/*.so.4 here)&lt;br /&gt;
APPDIR/fonts:            fonts (not needed if the WebOS fonts are used). Copy ~/qte-48/lib/fonts/* here&lt;br /&gt;
APPDIR/gfxdrivers:       gfxdrivers plugins. Copy ~/qte-48/plugins/gfxdrivers/* here&lt;br /&gt;
APPDIR/imageformats:     imageformats plugins. Copy ~/qte-48/plugins/imageformats/* here&lt;br /&gt;
APPDIR/imports:          QML stuff (not needed for Qt-widget). Copy ~/qte-48/imports/* here&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can deploy these files in /media/internal/APPDIR for testing and run the application from the command line.&lt;br /&gt;
&lt;br /&gt;
To create an IPK file you need in addition an appinfo.json file. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;A-Browser Qml (test)&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;pdk&amp;quot;,&lt;br /&gt;
	&amp;quot;main&amp;quot;: &amp;quot;abrowse-qml&amp;quot;,&lt;br /&gt;
	&amp;quot;id&amp;quot;: &amp;quot;net.danielroggen.abrowseqml&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
	&amp;quot;vendor&amp;quot;: &amp;quot;danielroggen&amp;quot;,&lt;br /&gt;
	&amp;quot;icon&amp;quot;:     &amp;quot;icon.png&amp;quot; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a STAGING directory which contains:&lt;br /&gt;
* the application&lt;br /&gt;
* the Qt stuff (keeping the directory structure mentionned above)&lt;br /&gt;
* the icon&lt;br /&gt;
* the appinfo.json&lt;br /&gt;
* any other required file&lt;br /&gt;
&lt;br /&gt;
And run '''palm-package STAGING'''. This will create an .ipk ready for distribution. Before distributing, try to install it on the device with Preware: copy the ipk to the device, run Preware and select the option to install ipk packages from the menu, and check that your app works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No virtual keyboard so far&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. Links ==&lt;br /&gt;
[1] [http://www.griffin.net/2010/02/qt-on-the-palm-pre.html Qt on the Palm Pre]&lt;br /&gt;
&lt;br /&gt;
[2] [https://gitorious.org/~darronb/qt/qt-palm-pre Qt port to webOS by Darron Black on gitorious]&lt;br /&gt;
&lt;br /&gt;
[3] A-Browser QML [http://danielroggen.net/sw/abrowse-qml.zip source] and [http://www.webosnation.com/a-browser-qml-test binary]&lt;br /&gt;
&lt;br /&gt;
[4] A-Browser Qt [http://danielroggen.net/sw/abrowse-qt.zip source] and [http://www.webosnation.com/a-browser-qt-test binary]&lt;br /&gt;
&lt;br /&gt;
[5] Updated [http://code.google.com/p/qt-webos/ WebOS gfxdrivers plugin]&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21947</id>
		<title>HowtoQt</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21947"/>
		<updated>2013-08-28T22:37:58Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* 2. Optional: completing the PDK with some missing includes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to cross-compile Qt for WebOS =&lt;br /&gt;
History:&lt;br /&gt;
&lt;br /&gt;
* 08.02.2012: first version&lt;br /&gt;
&lt;br /&gt;
= Qt and QML on WebOS devices =&lt;br /&gt;
&lt;br /&gt;
This document explains how to set-up [http://qt.nokia.com Qt 4.8 (Trolltech/Nokia's cross-platform application and UI framework)] on WebOS devices, and then how to cross-compile Qt or QML apps.&lt;br /&gt;
&lt;br /&gt;
This guide assumes:&lt;br /&gt;
* a Linux development environment (here Kubuntu 11.10 running in virtualbox on a win7 host)&lt;br /&gt;
* Qt 4.8 (the process for Qt 4.7.x is mostly identical; no idea for Qt 5)&lt;br /&gt;
* OpenSSH running on the webos device to scp files to it&lt;br /&gt;
* The reasonable development tools&lt;br /&gt;
&lt;br /&gt;
The steps include:&lt;br /&gt;
# Getting and setting-up the Palm PDK&lt;br /&gt;
# Optionally: completing the PDK with some missing includes&lt;br /&gt;
# Getting Qt 4.8, setting it up for cross-compilation&lt;br /&gt;
# Cross-compilation of Qt 4.8&lt;br /&gt;
# Updated webos port of Qt&lt;br /&gt;
# Application tweaks to look for libs in the right places&lt;br /&gt;
&lt;br /&gt;
== 1. Getting and setting up the Palm PDK ==&lt;br /&gt;
&lt;br /&gt;
Qt is cross-compiled with the official Palm PDK. The PDK plays nice: it can be installed alongside the webos internals WIDK without conflicts; there is no need to modify paths or environment variables.&lt;br /&gt;
&lt;br /&gt;
Note that I haven't &amp;quot;fully&amp;quot; installed the PDK. In particular I haven't set-up the emulator. The basic stuff needed are: the arm gcc toolchain, and novacom to communicate with the device. VirtualBox can be skipped. Java may be necessary.&lt;br /&gt;
&lt;br /&gt;
# Read about the [https://developer.palm.com/content/resources/develop/sdk_pdk_download.html#linux Palm SDK 3.05] and the installation procedure. Follow the instructions on there. But essentially this boils down to:&lt;br /&gt;
# Download novacom from that page&lt;br /&gt;
# Download the SDK from that page&lt;br /&gt;
# Install novacom and the SDK following the instructions. I.e.:&lt;br /&gt;
## sudo dpkg -i palm-sdk_3.0.5-svn528736-pho676_i386.deb&lt;br /&gt;
## sudo dpkg -i palm-novacom_1.0.80_i386.deb 	&lt;br /&gt;
&lt;br /&gt;
# The SDK is now in /opt/PalmPDK&lt;br /&gt;
&lt;br /&gt;
'''When you're running 64 bits Linux please make sure to also install ia32-libs by running:''' (otherwise you'll get the error that &amp;quot;arm-none-linux-gnueabi-g++ cannot be found&amp;quot;!)&lt;br /&gt;
# sudo apt-get install ia32-libs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may check that all is fine so far (or skip this - this is simply to step-by-step see if all is ok):&lt;br /&gt;
# You can invoke gcc or g++ from the PDK arm toolchain to compile some test program. E.g. '''/opt/PalmPDK/arm-gcc/bin/arm-none-linux-gnueabi-g++ hello.cpp -o hello'''&lt;br /&gt;
# You can copy this file to the usb drive on the device: '''scp hello root@ip.address.of.device:/media/internal'''&lt;br /&gt;
# You can go log on the device with novaterm: '''novaterm'''&lt;br /&gt;
# You can run your test program: '''/media/internal/hello'''&lt;br /&gt;
&lt;br /&gt;
If that works then on to the next steps.&lt;br /&gt;
&lt;br /&gt;
== 2. Optional: completing the PDK with some missing includes ==&lt;br /&gt;
&lt;br /&gt;
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit.&lt;br /&gt;
&lt;br /&gt;
There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - '''/opt/PalmPDK/include/asm/hwcap.h''' (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. &lt;br /&gt;
&lt;br /&gt;
Without these includes, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3.&lt;br /&gt;
&lt;br /&gt;
Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain.&lt;br /&gt;
&lt;br /&gt;
# Download the arm toolchain &amp;quot;Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux&amp;quot; from [http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-gnu-linux Mentor Graphics' website]. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2&lt;br /&gt;
# Untar this file: '''tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2'''&lt;br /&gt;
# Copy the entire include/asm directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include'''&lt;br /&gt;
# Copy the files int-l64.h and int-ll64.h from include/asm-generic directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm-generic/int* /opt/PalmPDK/arm-gcc/sysroot/usr/include/asm-generic'''&lt;br /&gt;
&lt;br /&gt;
You're set!&lt;br /&gt;
&lt;br /&gt;
== 3. Getting Qt 4.8, setting it up for cross-compilation ==&lt;br /&gt;
&lt;br /&gt;
This step gets the Qt 4.8 sources, and sets-up Qt for cross-compilation using the Palm PDK.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Get the Qt sources ===&lt;br /&gt;
&lt;br /&gt;
# Cd to your home directory: '''cd ~'''&lt;br /&gt;
# Get the Qt 4.8 sources: '''http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
# Untar: '''tar xvfz qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Qt mkspecs for WebOS ===&lt;br /&gt;
&lt;br /&gt;
We set-up the mkspecs for WebOS (compiler parameters required for cross-compilation):&lt;br /&gt;
&lt;br /&gt;
# Cd to the qws mkspecs: '''cd ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws'''&lt;br /&gt;
# The WebOS mkspecs are mostly the same as the linux-arm-gnueabi-g++ mkspecs. So we copy them and modify them afterwards: '''cp -r linux-arm-gnueabi-g++ linux-webos'''&lt;br /&gt;
# Edit the linux-webos mkspecs to set-up the cross-compiler path and other build parameters. E.g. '''vi ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws/linux-webos/qmake.conf'''. This file must look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#&lt;br /&gt;
# qmake configuration for WebOS builds with arm-linux-g++&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#for 4.7.4:&lt;br /&gt;
#include(../../common/g++.conf)&lt;br /&gt;
#include(../../common/linux.conf)&lt;br /&gt;
#include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# for 4.8&lt;br /&gt;
include(../../common/linux.conf)&lt;br /&gt;
include(../../common/gcc-base-unix.conf)&lt;br /&gt;
include(../../common/g++-unix.conf)&lt;br /&gt;
include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# modifications to g++.conf&lt;br /&gt;
#Toolchain&lt;br /&gt;
&lt;br /&gt;
#Base directory of gcc toolchain&lt;br /&gt;
&lt;br /&gt;
GCCBASE                 = /opt/PalmPDK/arm-gcc/bin&lt;br /&gt;
TSLIB_INCDIR            = /opt/PalmPDK/include&lt;br /&gt;
TSLIB_LIBDIR            = /opt/PalmPDK/device/lib&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Compiler Flags to take advantage of the ARM architecture&lt;br /&gt;
QMAKE_CFLAGS_RELEASE    = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CFLAGS_DEBUG      = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
QMAKE_CXXFLAGS_RELEASE  = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CXXFLAGS_DEBUG    = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
# For official pdk&lt;br /&gt;
QMAKE_CC                = $$GCCBASE/arm-none-linux-gnueabi-gcc&lt;br /&gt;
QMAKE_CXX               = $$GCCBASE/arm-none-linux-gnueabi-g++&lt;br /&gt;
QMAKE_LINK              = $$QMAKE_CXX&lt;br /&gt;
QMAKE_LINK_SHLIB        = $$QMAKE_CXX&lt;br /&gt;
QMAKE_RANLIB            = $$GCCBASE/arm-none-linux-gnueabi-ranlib&lt;br /&gt;
&lt;br /&gt;
# modifications to linux.conf&lt;br /&gt;
QMAKE_AR                = $$GCCBASE/arm-none-linux-gnueabi-ar cqs&lt;br /&gt;
QMAKE_OBJCOPY           = $$GCCBASE/arm-none-linux-gnueabi-objcopy&lt;br /&gt;
QMAKE_STRIP             = $$GCCBASE/arm-none-linux-gnueabi-strip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
QMAKE_INCDIR = $$TSLIB_INCDIR &lt;br /&gt;
QMAKE_LIBDIR = $$TSLIB_LIBDIR &lt;br /&gt;
QMAKE_LIBS   += -lrt -lz &lt;br /&gt;
&lt;br /&gt;
QMAKE_LFLAGS += -Wl,--allow-shlib-undefined &lt;br /&gt;
&lt;br /&gt;
load(qt_config)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.3 gfxdrivers plugin for WebOS ===&lt;br /&gt;
&lt;br /&gt;
Qt embedded needs a gfxdrivers plugin which allows Qt to show things on a screen, get keyboard input and mouse events. This step gets the WebOS Qt gfxdrivers plugin. &lt;br /&gt;
&lt;br /&gt;
The initial plugin version was written by Darron Black [1,2] and it uses SDL for graphics. With the changes in WebOS 2.x, that plugin doesn't work anymore: it uses root access to read the keyboard, but recent PDK apps are not running as root anymore but in jails. Therefore an extended version is required that handles keyboard input for &amp;quot;non-root&amp;quot; users. That version is available from [http://code.google.com/p/qt-webos Qt gfxdrivers plugin for WebOS on Google Code]. It has also tentative support for screen rotation.&lt;br /&gt;
&lt;br /&gt;
# Cd to the Qt gfxdrivers directory: '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers'''&lt;br /&gt;
# Get the WebOS gfxdrivers plugin from the svn repository: '''svn checkout http://qt-webos.googlecode.com/svn/trunk/ webos'''&lt;br /&gt;
# Edit ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/gfxdrivers.pro to add the line: '''contains(gfx-plugins, webos)        :SUBDIRS += webos'''&lt;br /&gt;
# In order to support screen rotation we need to patch the &amp;quot;transformed&amp;quot; screen driver. This driver is provided by Qt to do screen rotation or offsetting and it uses as back-end the driver doing the actual access to the pixels (that would be our webos qgfxdrivers). Unfortunately the transformed driver doesn't allow to &amp;quot;notify&amp;quot; SDL when pixels are changed. A quick hack is to patch ~/qt-everywhere-opensource-src-4.8.0t/src/gui/embedded/qscreentransformed_qws.cpp. In this patch we hijack the functionality of the &amp;quot;blank&amp;quot; method (which is supposed to blank the screen) to notify the WebOS gfxdrivers before and after pixels are modified. So edit qscreentransformed_qws.cpp around lines 430 and add the two lines marked with the comments below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
    screen()-&amp;gt;blank(true);                        // ADD THIS FOR WEBOS&lt;br /&gt;
    QWSDisplay::grab();&lt;br /&gt;
    for (int i = 0; i &amp;lt; rects.size(); ++i) {&lt;br /&gt;
        const QRect r = rects.at(i) &amp;amp; bound;&lt;br /&gt;
&lt;br /&gt;
        QPoint dst;&lt;br /&gt;
        switch (trans) {&lt;br /&gt;
        case Rot90:&lt;br /&gt;
            dst = mapToDevice(r.topRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot180:&lt;br /&gt;
            dst = mapToDevice(r.bottomRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot270:&lt;br /&gt;
            dst = mapToDevice(r.bottomLeft(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        func(this, image, r.translated(-topLeft), dst);&lt;br /&gt;
    }&lt;br /&gt;
    QWSDisplay::ungrab();&lt;br /&gt;
    screen()-&amp;gt;blank(false);                       // ADD THIS FOR WEBOS&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Cross-compile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we can configure and cross-compile Qt. The lines below configure Qt to install in ~/qte-48:&lt;br /&gt;
&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0'''&lt;br /&gt;
# '''./configure -v -prefix ~/qte-48 -embedded arm -platform qws/linux-x86-g++ -xplatform qws/linux-webos -depths 16,24,32 -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-nis -no-iconv -no-dbus -no-cups -no-largefile -no-accessibility -no-gtkstyle -no-qt3support -qt-gfx-vnc -plugin-gfx-vnc -no-glib -qtlibinfix 48 -xmlpatterns -exceptions -opensource -make libs -nomake tools -nomake demo -nomake examples -nomake docs -webkit -javascript-jit -script -scripttools -declarative -openssl -qt-gfx-transformed'''&lt;br /&gt;
# '''make -j4'''&lt;br /&gt;
# '''make install'''&lt;br /&gt;
&lt;br /&gt;
The WebOS gfxdrivers plugin must be compiled manually:&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/webos'''&lt;br /&gt;
# '''make'''&lt;br /&gt;
&lt;br /&gt;
This builds and copies the plugin into ~/qte-48/plugins/gfxdrivers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hopefully you've made it so far without problems! You now have Qt in ~/qte-48.&lt;br /&gt;
&lt;br /&gt;
== 4. Compiling Qt apps ==&lt;br /&gt;
&lt;br /&gt;
We see here how to compile a Qt app for Qt on WebOS. We look at two examples that are directly taken from the Qt distribution.  &lt;br /&gt;
# fancybrowser: this is a Qt-widget-based example browser. It is available in QTSDKDIR/Examples/4.8/webkit/fancybrowser. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qt.zip here]&lt;br /&gt;
# webbrowser: this is a Qt-QML-based example browser. It is available in QTSDKDRIR/Demos/4.8/declarative/webbrowser. Since this is a QML app, a QmlApplicationViewer must be used to run the QML files. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qml.zip here]&lt;br /&gt;
&lt;br /&gt;
The binaries are available on the WebOS homebrew app repository [www.webosnation.com/a-browser-qt-test here] and [www.webosnation.com/a-browser-qml-test here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The way compilation of the apps is mostly identical, but the QML-based project has a few extra complexities so we'll see first the widget-based project.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Qt-widget app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Examples/4.8/webkit/fancybrowser in your working directory, e.g. ~/fancybrowser&lt;br /&gt;
&lt;br /&gt;
Two things must be modified in the project: &lt;br /&gt;
* fancybrowser.pro: this is the project file, it must be modified to include the proper libraries&lt;br /&gt;
* main.cpp: this is the file in which the QApplication object is instanciated. We must do some setup to indicate to the application:&lt;br /&gt;
** where to find system fonts, &lt;br /&gt;
** to start the application as a GUI server application&lt;br /&gt;
** to use the WebOS gfxdrivers plugin, or to use the transformed gfxdrivers plugin in combination with the WebOS gfxdrivers plugin to support screen rotation.&lt;br /&gt;
&lt;br /&gt;
Note that one could avoid modifying main.cpp altogether because the same results can be achieved by environment variables and by command line arguments. Therefore a script could set the environment variables and call the executable with the appropriate parameters. However we go through the self-contained solution, which is a bit more complex but may seen as more clean.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
The pro file must be modified to link the PDL and SDL libs, and also to look for the Qt libraries at the right location at runtime. Here we assume that the Qt libs are in a subdirectory called 'qt' below the directory where the application is deployed. &lt;br /&gt;
&lt;br /&gt;
Modify fancybrowser.pro and add this at the end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
!win32: {&lt;br /&gt;
message(assume qws)&lt;br /&gt;
# Set the runtime path to a relative directory w.r.t. the location of the executable&lt;br /&gt;
LIBS += -Wl,-rpath,&amp;quot;'\$$ORIGIN/qt'&amp;quot; -L/opt/PalmPDK/device/lib -lpdl -lSDL&lt;br /&gt;
INCLUDEPATH += /opt/PalmPDK/include/SDL&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that '''!win32:{...}''' sets these parameters for any &amp;quot;non windows build&amp;quot; (I happen to build the desktop app on Windows and the WebOS app on Linux). Ideally we would rather have something for webos ('''webos:{...}''') but I did not investigate how to do enable that - if somebody knows, feel free to share.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
There are modifications to main.cpp in three categories.&lt;br /&gt;
&lt;br /&gt;
When instanciating a QApplication object the fonts are search in the directory specified by the QT_QWS_FONTDIR environment variable. To my knowledge this cannot be specified to QApplication in another way. Therefore we set programmatically QT_QWS_FONTDIR to where we have our fonts. There are two possibilities: we can deploy the fonts of Qt, or we can use the fonts already available on the WebOS device. Using the fonts of the WebOS device is fine so we use this. See the commented-out line for the alternative approach.&lt;br /&gt;
&lt;br /&gt;
When instanciating the QApplication object we want to start the application as a GUI server application. This is achieved by passing QApplication::GuiServer in the QApplication constructor. The alternative approach is to call the program with '''-qws''' on the command line.&lt;br /&gt;
&lt;br /&gt;
The gfxdrivers plugin must be specified. This can be done with the '''-display''' command line argument. Here we programmatically set this command line argument.&lt;br /&gt;
We have two alternatives. We can use directly the WebOS gfxdrivers plugin. This does not allow for screen rotation. The command line would then be ''''-display PalmPreSDLFb:nnn'''. &lt;br /&gt;
Alternatively, we can use the transformed gfxdrivers in combination with the WebOS gfxdrivers plugin. This allows for screen rotation. The command line would then be '''-display Transformed:PalmPreSDLFb:nnn'''.&lt;br /&gt;
&lt;br /&gt;
'''nnn''' is a number which you must set to identify the display driver. In a normal embedded system only a single GUI server application would run at any time, and this number can be the same for all applications (or even left out, QApplication assumes number 0 then). This number is used by Qt to create a temporary directory ('''/tmp/qtembedded-nnn''') that contains, among others, a font cache.&lt;br /&gt;
&lt;br /&gt;
However, on WebOS each running Qt applications is a GUI server. Each application will thus create a '''/tmp/qtembedded-nnn''' directory. Therefore '''nnn''' must be unique for each Qt application. (maybe we need a convention to avoid conflicts - might be enough to use some randomly generated number for each app).&lt;br /&gt;
&lt;br /&gt;
main.cpp can be modified as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Generate the makefile and compile:&lt;br /&gt;
# ~/qte-48/bin/qmake fancybrowser.pro&lt;br /&gt;
# make&lt;br /&gt;
&lt;br /&gt;
Now the app is compiled. The Qt libs must also be deployed on the device. See the deployment section below for how to lay-out the files.&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Qt-QML app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Demos/4.8/declarative/webbrowser in your working directory, e.g. ~/webbrowser&lt;br /&gt;
&lt;br /&gt;
Essentially the same modifications must be made to the Qt-QML project as for the Qt-widget project, with some additions to the main file.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app, and in addition we must set the path where the QML imports can be found. This can be specified with the QML_IMPORT_PATH environment variable. We set-it up programmatically here.&lt;br /&gt;
&lt;br /&gt;
The file main.cpp looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP&lt;br /&gt;
    QString qmlpath = QString(pathexe)+&amp;quot;/imports&amp;quot;;&lt;br /&gt;
    if(!qputenv(&amp;quot;QML_IMPORT_PATH&amp;quot;,qmlpath.toAscii()))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set qml path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Same as for Qt-widget apps.&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Deployment ===&lt;br /&gt;
&lt;br /&gt;
We can now test the application, and create an IPK which can be uploaded to the HP or homebrew app repository.&lt;br /&gt;
&lt;br /&gt;
In order to test the app, it must be copied to the device together with Qt libs. The device directory structure, assuming the app is in APPDIR, must be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APPDIR:                  the application is here&lt;br /&gt;
APPDIR/qt:               qt libs. Copy ~/qte-48/lib/*.so.4 here)&lt;br /&gt;
APPDIR/fonts:            fonts (not needed if the WebOS fonts are used). Copy ~/qte-48/lib/fonts/* here&lt;br /&gt;
APPDIR/gfxdrivers:       gfxdrivers plugins. Copy ~/qte-48/plugins/gfxdrivers/* here&lt;br /&gt;
APPDIR/imageformats:     imageformats plugins. Copy ~/qte-48/plugins/imageformats/* here&lt;br /&gt;
APPDIR/imports:          QML stuff (not needed for Qt-widget). Copy ~/qte-48/imports/* here&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can deploy these files in /media/internal/APPDIR for testing and run the application from the command line.&lt;br /&gt;
&lt;br /&gt;
To create an IPK file you need in addition an appinfo.json file. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;A-Browser Qml (test)&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;pdk&amp;quot;,&lt;br /&gt;
	&amp;quot;main&amp;quot;: &amp;quot;abrowse-qml&amp;quot;,&lt;br /&gt;
	&amp;quot;id&amp;quot;: &amp;quot;net.danielroggen.abrowseqml&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
	&amp;quot;vendor&amp;quot;: &amp;quot;danielroggen&amp;quot;,&lt;br /&gt;
	&amp;quot;icon&amp;quot;:     &amp;quot;icon.png&amp;quot; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a STAGING directory which contains:&lt;br /&gt;
* the application&lt;br /&gt;
* the Qt stuff (keeping the directory structure mentionned above)&lt;br /&gt;
* the icon&lt;br /&gt;
* the appinfo.json&lt;br /&gt;
* any other required file&lt;br /&gt;
&lt;br /&gt;
And run '''palm-package STAGING'''. This will create an .ipk ready for distribution. Before distributing, try to install it on the device with Preware: copy the ipk to the device, run Preware and select the option to install ipk packages from the menu, and check that your app works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No virtual keyboard so far&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. Links ==&lt;br /&gt;
[1] [http://www.griffin.net/2010/02/qt-on-the-palm-pre.html Qt on the Palm Pre]&lt;br /&gt;
&lt;br /&gt;
[2] [https://gitorious.org/~darronb/qt/qt-palm-pre Qt port to webOS by Darron Black on gitorious]&lt;br /&gt;
&lt;br /&gt;
[3] A-Browser QML [http://danielroggen.net/sw/abrowse-qml.zip source] and [http://www.webosnation.com/a-browser-qml-test binary]&lt;br /&gt;
&lt;br /&gt;
[4] A-Browser Qt [http://danielroggen.net/sw/abrowse-qt.zip source] and [http://www.webosnation.com/a-browser-qt-test binary]&lt;br /&gt;
&lt;br /&gt;
[5] Updated [http://code.google.com/p/qt-webos/ WebOS gfxdrivers plugin]&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21945</id>
		<title>HowtoQt</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21945"/>
		<updated>2013-08-28T07:02:52Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* 1. Getting and setting up the Palm PDK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to cross-compile Qt for WebOS =&lt;br /&gt;
History:&lt;br /&gt;
&lt;br /&gt;
* 08.02.2012: first version&lt;br /&gt;
&lt;br /&gt;
= Qt and QML on WebOS devices =&lt;br /&gt;
&lt;br /&gt;
This document explains how to set-up [http://qt.nokia.com Qt 4.8 (Trolltech/Nokia's cross-platform application and UI framework)] on WebOS devices, and then how to cross-compile Qt or QML apps.&lt;br /&gt;
&lt;br /&gt;
This guide assumes:&lt;br /&gt;
* a Linux development environment (here Kubuntu 11.10 running in virtualbox on a win7 host)&lt;br /&gt;
* Qt 4.8 (the process for Qt 4.7.x is mostly identical; no idea for Qt 5)&lt;br /&gt;
* OpenSSH running on the webos device to scp files to it&lt;br /&gt;
* The reasonable development tools&lt;br /&gt;
&lt;br /&gt;
The steps include:&lt;br /&gt;
# Getting and setting-up the Palm PDK&lt;br /&gt;
# Optionally: completing the PDK with some missing includes&lt;br /&gt;
# Getting Qt 4.8, setting it up for cross-compilation&lt;br /&gt;
# Cross-compilation of Qt 4.8&lt;br /&gt;
# Updated webos port of Qt&lt;br /&gt;
# Application tweaks to look for libs in the right places&lt;br /&gt;
&lt;br /&gt;
== 1. Getting and setting up the Palm PDK ==&lt;br /&gt;
&lt;br /&gt;
Qt is cross-compiled with the official Palm PDK. The PDK plays nice: it can be installed alongside the webos internals WIDK without conflicts; there is no need to modify paths or environment variables.&lt;br /&gt;
&lt;br /&gt;
Note that I haven't &amp;quot;fully&amp;quot; installed the PDK. In particular I haven't set-up the emulator. The basic stuff needed are: the arm gcc toolchain, and novacom to communicate with the device. VirtualBox can be skipped. Java may be necessary.&lt;br /&gt;
&lt;br /&gt;
# Read about the [https://developer.palm.com/content/resources/develop/sdk_pdk_download.html#linux Palm SDK 3.05] and the installation procedure. Follow the instructions on there. But essentially this boils down to:&lt;br /&gt;
# Download novacom from that page&lt;br /&gt;
# Download the SDK from that page&lt;br /&gt;
# Install novacom and the SDK following the instructions. I.e.:&lt;br /&gt;
## sudo dpkg -i palm-sdk_3.0.5-svn528736-pho676_i386.deb&lt;br /&gt;
## sudo dpkg -i palm-novacom_1.0.80_i386.deb 	&lt;br /&gt;
&lt;br /&gt;
# The SDK is now in /opt/PalmPDK&lt;br /&gt;
&lt;br /&gt;
'''When you're running 64 bits Linux please make sure to also install ia32-libs by running:''' (otherwise you'll get the error that &amp;quot;arm-none-linux-gnueabi-g++ cannot be found&amp;quot;!)&lt;br /&gt;
# sudo apt-get install ia32-libs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may check that all is fine so far (or skip this - this is simply to step-by-step see if all is ok):&lt;br /&gt;
# You can invoke gcc or g++ from the PDK arm toolchain to compile some test program. E.g. '''/opt/PalmPDK/arm-gcc/bin/arm-none-linux-gnueabi-g++ hello.cpp -o hello'''&lt;br /&gt;
# You can copy this file to the usb drive on the device: '''scp hello root@ip.address.of.device:/media/internal'''&lt;br /&gt;
# You can go log on the device with novaterm: '''novaterm'''&lt;br /&gt;
# You can run your test program: '''/media/internal/hello'''&lt;br /&gt;
&lt;br /&gt;
If that works then on to the next steps.&lt;br /&gt;
&lt;br /&gt;
== 2. Optional: completing the PDK with some missing includes ==&lt;br /&gt;
&lt;br /&gt;
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit.&lt;br /&gt;
&lt;br /&gt;
There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - '''/opt/PalmPDK/include/asm/hwcap.h''' (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. &lt;br /&gt;
&lt;br /&gt;
Without these includes, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3.&lt;br /&gt;
&lt;br /&gt;
Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain.&lt;br /&gt;
&lt;br /&gt;
# Download the arm toolchain &amp;quot;Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux&amp;quot; from [http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-gnu-linux Mentor Graphics' website]. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2&lt;br /&gt;
# Untar this file: '''tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2'''&lt;br /&gt;
# Copy the entire include/asm directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include'''&lt;br /&gt;
&lt;br /&gt;
You're set!&lt;br /&gt;
&lt;br /&gt;
== 3. Getting Qt 4.8, setting it up for cross-compilation ==&lt;br /&gt;
&lt;br /&gt;
This step gets the Qt 4.8 sources, and sets-up Qt for cross-compilation using the Palm PDK.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Get the Qt sources ===&lt;br /&gt;
&lt;br /&gt;
# Cd to your home directory: '''cd ~'''&lt;br /&gt;
# Get the Qt 4.8 sources: '''http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
# Untar: '''tar xvfz qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Qt mkspecs for WebOS ===&lt;br /&gt;
&lt;br /&gt;
We set-up the mkspecs for WebOS (compiler parameters required for cross-compilation):&lt;br /&gt;
&lt;br /&gt;
# Cd to the qws mkspecs: '''cd ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws'''&lt;br /&gt;
# The WebOS mkspecs are mostly the same as the linux-arm-gnueabi-g++ mkspecs. So we copy them and modify them afterwards: '''cp -r linux-arm-gnueabi-g++ linux-webos'''&lt;br /&gt;
# Edit the linux-webos mkspecs to set-up the cross-compiler path and other build parameters. E.g. '''vi ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws/linux-webos/qmake.conf'''. This file must look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#&lt;br /&gt;
# qmake configuration for WebOS builds with arm-linux-g++&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#for 4.7.4:&lt;br /&gt;
#include(../../common/g++.conf)&lt;br /&gt;
#include(../../common/linux.conf)&lt;br /&gt;
#include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# for 4.8&lt;br /&gt;
include(../../common/linux.conf)&lt;br /&gt;
include(../../common/gcc-base-unix.conf)&lt;br /&gt;
include(../../common/g++-unix.conf)&lt;br /&gt;
include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# modifications to g++.conf&lt;br /&gt;
#Toolchain&lt;br /&gt;
&lt;br /&gt;
#Base directory of gcc toolchain&lt;br /&gt;
&lt;br /&gt;
GCCBASE                 = /opt/PalmPDK/arm-gcc/bin&lt;br /&gt;
TSLIB_INCDIR            = /opt/PalmPDK/include&lt;br /&gt;
TSLIB_LIBDIR            = /opt/PalmPDK/device/lib&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Compiler Flags to take advantage of the ARM architecture&lt;br /&gt;
QMAKE_CFLAGS_RELEASE    = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CFLAGS_DEBUG      = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
QMAKE_CXXFLAGS_RELEASE  = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CXXFLAGS_DEBUG    = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
# For official pdk&lt;br /&gt;
QMAKE_CC                = $$GCCBASE/arm-none-linux-gnueabi-gcc&lt;br /&gt;
QMAKE_CXX               = $$GCCBASE/arm-none-linux-gnueabi-g++&lt;br /&gt;
QMAKE_LINK              = $$QMAKE_CXX&lt;br /&gt;
QMAKE_LINK_SHLIB        = $$QMAKE_CXX&lt;br /&gt;
QMAKE_RANLIB            = $$GCCBASE/arm-none-linux-gnueabi-ranlib&lt;br /&gt;
&lt;br /&gt;
# modifications to linux.conf&lt;br /&gt;
QMAKE_AR                = $$GCCBASE/arm-none-linux-gnueabi-ar cqs&lt;br /&gt;
QMAKE_OBJCOPY           = $$GCCBASE/arm-none-linux-gnueabi-objcopy&lt;br /&gt;
QMAKE_STRIP             = $$GCCBASE/arm-none-linux-gnueabi-strip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
QMAKE_INCDIR = $$TSLIB_INCDIR &lt;br /&gt;
QMAKE_LIBDIR = $$TSLIB_LIBDIR &lt;br /&gt;
QMAKE_LIBS   += -lrt -lz &lt;br /&gt;
&lt;br /&gt;
QMAKE_LFLAGS += -Wl,--allow-shlib-undefined &lt;br /&gt;
&lt;br /&gt;
load(qt_config)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.3 gfxdrivers plugin for WebOS ===&lt;br /&gt;
&lt;br /&gt;
Qt embedded needs a gfxdrivers plugin which allows Qt to show things on a screen, get keyboard input and mouse events. This step gets the WebOS Qt gfxdrivers plugin. &lt;br /&gt;
&lt;br /&gt;
The initial plugin version was written by Darron Black [1,2] and it uses SDL for graphics. With the changes in WebOS 2.x, that plugin doesn't work anymore: it uses root access to read the keyboard, but recent PDK apps are not running as root anymore but in jails. Therefore an extended version is required that handles keyboard input for &amp;quot;non-root&amp;quot; users. That version is available from [http://code.google.com/p/qt-webos Qt gfxdrivers plugin for WebOS on Google Code]. It has also tentative support for screen rotation.&lt;br /&gt;
&lt;br /&gt;
# Cd to the Qt gfxdrivers directory: '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers'''&lt;br /&gt;
# Get the WebOS gfxdrivers plugin from the svn repository: '''svn checkout http://qt-webos.googlecode.com/svn/trunk/ webos'''&lt;br /&gt;
# Edit ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/gfxdrivers.pro to add the line: '''contains(gfx-plugins, webos)        :SUBDIRS += webos'''&lt;br /&gt;
# In order to support screen rotation we need to patch the &amp;quot;transformed&amp;quot; screen driver. This driver is provided by Qt to do screen rotation or offsetting and it uses as back-end the driver doing the actual access to the pixels (that would be our webos qgfxdrivers). Unfortunately the transformed driver doesn't allow to &amp;quot;notify&amp;quot; SDL when pixels are changed. A quick hack is to patch ~/qt-everywhere-opensource-src-4.8.0t/src/gui/embedded/qscreentransformed_qws.cpp. In this patch we hijack the functionality of the &amp;quot;blank&amp;quot; method (which is supposed to blank the screen) to notify the WebOS gfxdrivers before and after pixels are modified. So edit qscreentransformed_qws.cpp around lines 430 and add the two lines marked with the comments below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
    screen()-&amp;gt;blank(true);                        // ADD THIS FOR WEBOS&lt;br /&gt;
    QWSDisplay::grab();&lt;br /&gt;
    for (int i = 0; i &amp;lt; rects.size(); ++i) {&lt;br /&gt;
        const QRect r = rects.at(i) &amp;amp; bound;&lt;br /&gt;
&lt;br /&gt;
        QPoint dst;&lt;br /&gt;
        switch (trans) {&lt;br /&gt;
        case Rot90:&lt;br /&gt;
            dst = mapToDevice(r.topRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot180:&lt;br /&gt;
            dst = mapToDevice(r.bottomRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot270:&lt;br /&gt;
            dst = mapToDevice(r.bottomLeft(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        func(this, image, r.translated(-topLeft), dst);&lt;br /&gt;
    }&lt;br /&gt;
    QWSDisplay::ungrab();&lt;br /&gt;
    screen()-&amp;gt;blank(false);                       // ADD THIS FOR WEBOS&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Cross-compile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we can configure and cross-compile Qt. The lines below configure Qt to install in ~/qte-48:&lt;br /&gt;
&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0'''&lt;br /&gt;
# '''./configure -v -prefix ~/qte-48 -embedded arm -platform qws/linux-x86-g++ -xplatform qws/linux-webos -depths 16,24,32 -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-nis -no-iconv -no-dbus -no-cups -no-largefile -no-accessibility -no-gtkstyle -no-qt3support -qt-gfx-vnc -plugin-gfx-vnc -no-glib -qtlibinfix 48 -xmlpatterns -exceptions -opensource -make libs -nomake tools -nomake demo -nomake examples -nomake docs -webkit -javascript-jit -script -scripttools -declarative -openssl -qt-gfx-transformed'''&lt;br /&gt;
# '''make -j4'''&lt;br /&gt;
# '''make install'''&lt;br /&gt;
&lt;br /&gt;
The WebOS gfxdrivers plugin must be compiled manually:&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/webos'''&lt;br /&gt;
# '''make'''&lt;br /&gt;
&lt;br /&gt;
This builds and copies the plugin into ~/qte-48/plugins/gfxdrivers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hopefully you've made it so far without problems! You now have Qt in ~/qte-48.&lt;br /&gt;
&lt;br /&gt;
== 4. Compiling Qt apps ==&lt;br /&gt;
&lt;br /&gt;
We see here how to compile a Qt app for Qt on WebOS. We look at two examples that are directly taken from the Qt distribution.  &lt;br /&gt;
# fancybrowser: this is a Qt-widget-based example browser. It is available in QTSDKDIR/Examples/4.8/webkit/fancybrowser. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qt.zip here]&lt;br /&gt;
# webbrowser: this is a Qt-QML-based example browser. It is available in QTSDKDRIR/Demos/4.8/declarative/webbrowser. Since this is a QML app, a QmlApplicationViewer must be used to run the QML files. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qml.zip here]&lt;br /&gt;
&lt;br /&gt;
The binaries are available on the WebOS homebrew app repository [www.webosnation.com/a-browser-qt-test here] and [www.webosnation.com/a-browser-qml-test here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The way compilation of the apps is mostly identical, but the QML-based project has a few extra complexities so we'll see first the widget-based project.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Qt-widget app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Examples/4.8/webkit/fancybrowser in your working directory, e.g. ~/fancybrowser&lt;br /&gt;
&lt;br /&gt;
Two things must be modified in the project: &lt;br /&gt;
* fancybrowser.pro: this is the project file, it must be modified to include the proper libraries&lt;br /&gt;
* main.cpp: this is the file in which the QApplication object is instanciated. We must do some setup to indicate to the application:&lt;br /&gt;
** where to find system fonts, &lt;br /&gt;
** to start the application as a GUI server application&lt;br /&gt;
** to use the WebOS gfxdrivers plugin, or to use the transformed gfxdrivers plugin in combination with the WebOS gfxdrivers plugin to support screen rotation.&lt;br /&gt;
&lt;br /&gt;
Note that one could avoid modifying main.cpp altogether because the same results can be achieved by environment variables and by command line arguments. Therefore a script could set the environment variables and call the executable with the appropriate parameters. However we go through the self-contained solution, which is a bit more complex but may seen as more clean.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
The pro file must be modified to link the PDL and SDL libs, and also to look for the Qt libraries at the right location at runtime. Here we assume that the Qt libs are in a subdirectory called 'qt' below the directory where the application is deployed. &lt;br /&gt;
&lt;br /&gt;
Modify fancybrowser.pro and add this at the end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
!win32: {&lt;br /&gt;
message(assume qws)&lt;br /&gt;
# Set the runtime path to a relative directory w.r.t. the location of the executable&lt;br /&gt;
LIBS += -Wl,-rpath,&amp;quot;'\$$ORIGIN/qt'&amp;quot; -L/opt/PalmPDK/device/lib -lpdl -lSDL&lt;br /&gt;
INCLUDEPATH += /opt/PalmPDK/include/SDL&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that '''!win32:{...}''' sets these parameters for any &amp;quot;non windows build&amp;quot; (I happen to build the desktop app on Windows and the WebOS app on Linux). Ideally we would rather have something for webos ('''webos:{...}''') but I did not investigate how to do enable that - if somebody knows, feel free to share.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
There are modifications to main.cpp in three categories.&lt;br /&gt;
&lt;br /&gt;
When instanciating a QApplication object the fonts are search in the directory specified by the QT_QWS_FONTDIR environment variable. To my knowledge this cannot be specified to QApplication in another way. Therefore we set programmatically QT_QWS_FONTDIR to where we have our fonts. There are two possibilities: we can deploy the fonts of Qt, or we can use the fonts already available on the WebOS device. Using the fonts of the WebOS device is fine so we use this. See the commented-out line for the alternative approach.&lt;br /&gt;
&lt;br /&gt;
When instanciating the QApplication object we want to start the application as a GUI server application. This is achieved by passing QApplication::GuiServer in the QApplication constructor. The alternative approach is to call the program with '''-qws''' on the command line.&lt;br /&gt;
&lt;br /&gt;
The gfxdrivers plugin must be specified. This can be done with the '''-display''' command line argument. Here we programmatically set this command line argument.&lt;br /&gt;
We have two alternatives. We can use directly the WebOS gfxdrivers plugin. This does not allow for screen rotation. The command line would then be ''''-display PalmPreSDLFb:nnn'''. &lt;br /&gt;
Alternatively, we can use the transformed gfxdrivers in combination with the WebOS gfxdrivers plugin. This allows for screen rotation. The command line would then be '''-display Transformed:PalmPreSDLFb:nnn'''.&lt;br /&gt;
&lt;br /&gt;
'''nnn''' is a number which you must set to identify the display driver. In a normal embedded system only a single GUI server application would run at any time, and this number can be the same for all applications (or even left out, QApplication assumes number 0 then). This number is used by Qt to create a temporary directory ('''/tmp/qtembedded-nnn''') that contains, among others, a font cache.&lt;br /&gt;
&lt;br /&gt;
However, on WebOS each running Qt applications is a GUI server. Each application will thus create a '''/tmp/qtembedded-nnn''' directory. Therefore '''nnn''' must be unique for each Qt application. (maybe we need a convention to avoid conflicts - might be enough to use some randomly generated number for each app).&lt;br /&gt;
&lt;br /&gt;
main.cpp can be modified as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Generate the makefile and compile:&lt;br /&gt;
# ~/qte-48/bin/qmake fancybrowser.pro&lt;br /&gt;
# make&lt;br /&gt;
&lt;br /&gt;
Now the app is compiled. The Qt libs must also be deployed on the device. See the deployment section below for how to lay-out the files.&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Qt-QML app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Demos/4.8/declarative/webbrowser in your working directory, e.g. ~/webbrowser&lt;br /&gt;
&lt;br /&gt;
Essentially the same modifications must be made to the Qt-QML project as for the Qt-widget project, with some additions to the main file.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app, and in addition we must set the path where the QML imports can be found. This can be specified with the QML_IMPORT_PATH environment variable. We set-it up programmatically here.&lt;br /&gt;
&lt;br /&gt;
The file main.cpp looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP&lt;br /&gt;
    QString qmlpath = QString(pathexe)+&amp;quot;/imports&amp;quot;;&lt;br /&gt;
    if(!qputenv(&amp;quot;QML_IMPORT_PATH&amp;quot;,qmlpath.toAscii()))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set qml path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Same as for Qt-widget apps.&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Deployment ===&lt;br /&gt;
&lt;br /&gt;
We can now test the application, and create an IPK which can be uploaded to the HP or homebrew app repository.&lt;br /&gt;
&lt;br /&gt;
In order to test the app, it must be copied to the device together with Qt libs. The device directory structure, assuming the app is in APPDIR, must be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APPDIR:                  the application is here&lt;br /&gt;
APPDIR/qt:               qt libs. Copy ~/qte-48/lib/*.so.4 here)&lt;br /&gt;
APPDIR/fonts:            fonts (not needed if the WebOS fonts are used). Copy ~/qte-48/lib/fonts/* here&lt;br /&gt;
APPDIR/gfxdrivers:       gfxdrivers plugins. Copy ~/qte-48/plugins/gfxdrivers/* here&lt;br /&gt;
APPDIR/imageformats:     imageformats plugins. Copy ~/qte-48/plugins/imageformats/* here&lt;br /&gt;
APPDIR/imports:          QML stuff (not needed for Qt-widget). Copy ~/qte-48/imports/* here&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can deploy these files in /media/internal/APPDIR for testing and run the application from the command line.&lt;br /&gt;
&lt;br /&gt;
To create an IPK file you need in addition an appinfo.json file. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;A-Browser Qml (test)&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;pdk&amp;quot;,&lt;br /&gt;
	&amp;quot;main&amp;quot;: &amp;quot;abrowse-qml&amp;quot;,&lt;br /&gt;
	&amp;quot;id&amp;quot;: &amp;quot;net.danielroggen.abrowseqml&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
	&amp;quot;vendor&amp;quot;: &amp;quot;danielroggen&amp;quot;,&lt;br /&gt;
	&amp;quot;icon&amp;quot;:     &amp;quot;icon.png&amp;quot; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a STAGING directory which contains:&lt;br /&gt;
* the application&lt;br /&gt;
* the Qt stuff (keeping the directory structure mentionned above)&lt;br /&gt;
* the icon&lt;br /&gt;
* the appinfo.json&lt;br /&gt;
* any other required file&lt;br /&gt;
&lt;br /&gt;
And run '''palm-package STAGING'''. This will create an .ipk ready for distribution. Before distributing, try to install it on the device with Preware: copy the ipk to the device, run Preware and select the option to install ipk packages from the menu, and check that your app works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No virtual keyboard so far&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. Links ==&lt;br /&gt;
[1] [http://www.griffin.net/2010/02/qt-on-the-palm-pre.html Qt on the Palm Pre]&lt;br /&gt;
&lt;br /&gt;
[2] [https://gitorious.org/~darronb/qt/qt-palm-pre Qt port to webOS by Darron Black on gitorious]&lt;br /&gt;
&lt;br /&gt;
[3] A-Browser QML [http://danielroggen.net/sw/abrowse-qml.zip source] and [http://www.webosnation.com/a-browser-qml-test binary]&lt;br /&gt;
&lt;br /&gt;
[4] A-Browser Qt [http://danielroggen.net/sw/abrowse-qt.zip source] and [http://www.webosnation.com/a-browser-qt-test binary]&lt;br /&gt;
&lt;br /&gt;
[5] Updated [http://code.google.com/p/qt-webos/ WebOS gfxdrivers plugin]&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21943</id>
		<title>HowtoQt</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21943"/>
		<updated>2013-08-28T07:02:34Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* 1. Getting and setting up the Palm PDK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to cross-compile Qt for WebOS =&lt;br /&gt;
History:&lt;br /&gt;
&lt;br /&gt;
* 08.02.2012: first version&lt;br /&gt;
&lt;br /&gt;
= Qt and QML on WebOS devices =&lt;br /&gt;
&lt;br /&gt;
This document explains how to set-up [http://qt.nokia.com Qt 4.8 (Trolltech/Nokia's cross-platform application and UI framework)] on WebOS devices, and then how to cross-compile Qt or QML apps.&lt;br /&gt;
&lt;br /&gt;
This guide assumes:&lt;br /&gt;
* a Linux development environment (here Kubuntu 11.10 running in virtualbox on a win7 host)&lt;br /&gt;
* Qt 4.8 (the process for Qt 4.7.x is mostly identical; no idea for Qt 5)&lt;br /&gt;
* OpenSSH running on the webos device to scp files to it&lt;br /&gt;
* The reasonable development tools&lt;br /&gt;
&lt;br /&gt;
The steps include:&lt;br /&gt;
# Getting and setting-up the Palm PDK&lt;br /&gt;
# Optionally: completing the PDK with some missing includes&lt;br /&gt;
# Getting Qt 4.8, setting it up for cross-compilation&lt;br /&gt;
# Cross-compilation of Qt 4.8&lt;br /&gt;
# Updated webos port of Qt&lt;br /&gt;
# Application tweaks to look for libs in the right places&lt;br /&gt;
&lt;br /&gt;
== 1. Getting and setting up the Palm PDK ==&lt;br /&gt;
&lt;br /&gt;
Qt is cross-compiled with the official Palm PDK. The PDK plays nice: it can be installed alongside the webos internals WIDK without conflicts; there is no need to modify paths or environment variables.&lt;br /&gt;
&lt;br /&gt;
Note that I haven't &amp;quot;fully&amp;quot; installed the PDK. In particular I haven't set-up the emulator. The basic stuff needed are: the arm gcc toolchain, and novacom to communicate with the device. VirtualBox can be skipped. Java may be necessary.&lt;br /&gt;
&lt;br /&gt;
# Read about the [https://developer.palm.com/content/resources/develop/sdk_pdk_download.html#linux Palm SDK 3.05] and the installation procedure. Follow the instructions on there. But essentially this boils down to:&lt;br /&gt;
# Download novacom from that page&lt;br /&gt;
# Download the SDK from that page&lt;br /&gt;
# Install novacom and the SDK following the instructions. I.e.:&lt;br /&gt;
## sudo dpkg -i palm-sdk_3.0.5-svn528736-pho676_i386.deb&lt;br /&gt;
## sudo dpkg -i palm-novacom_1.0.80_i386.deb 	&lt;br /&gt;
&lt;br /&gt;
# The SDK is now in /opt/PalmPDK&lt;br /&gt;
&lt;br /&gt;
'''When you're running 64 bits Linux please make sure to also install ia32-libs by running:''' (otherwise you get the error that &amp;quot;arm-none-linux-gnueabi-g++ cannot be found&amp;quot;!)&lt;br /&gt;
# sudo apt-get install ia32-libs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may check that all is fine so far (or skip this - this is simply to step-by-step see if all is ok):&lt;br /&gt;
# You can invoke gcc or g++ from the PDK arm toolchain to compile some test program. E.g. '''/opt/PalmPDK/arm-gcc/bin/arm-none-linux-gnueabi-g++ hello.cpp -o hello'''&lt;br /&gt;
# You can copy this file to the usb drive on the device: '''scp hello root@ip.address.of.device:/media/internal'''&lt;br /&gt;
# You can go log on the device with novaterm: '''novaterm'''&lt;br /&gt;
# You can run your test program: '''/media/internal/hello'''&lt;br /&gt;
&lt;br /&gt;
If that works then on to the next steps.&lt;br /&gt;
&lt;br /&gt;
== 2. Optional: completing the PDK with some missing includes ==&lt;br /&gt;
&lt;br /&gt;
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit.&lt;br /&gt;
&lt;br /&gt;
There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - '''/opt/PalmPDK/include/asm/hwcap.h''' (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. &lt;br /&gt;
&lt;br /&gt;
Without these includes, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3.&lt;br /&gt;
&lt;br /&gt;
Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain.&lt;br /&gt;
&lt;br /&gt;
# Download the arm toolchain &amp;quot;Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux&amp;quot; from [http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-gnu-linux Mentor Graphics' website]. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2&lt;br /&gt;
# Untar this file: '''tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2'''&lt;br /&gt;
# Copy the entire include/asm directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include'''&lt;br /&gt;
&lt;br /&gt;
You're set!&lt;br /&gt;
&lt;br /&gt;
== 3. Getting Qt 4.8, setting it up for cross-compilation ==&lt;br /&gt;
&lt;br /&gt;
This step gets the Qt 4.8 sources, and sets-up Qt for cross-compilation using the Palm PDK.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Get the Qt sources ===&lt;br /&gt;
&lt;br /&gt;
# Cd to your home directory: '''cd ~'''&lt;br /&gt;
# Get the Qt 4.8 sources: '''http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
# Untar: '''tar xvfz qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Qt mkspecs for WebOS ===&lt;br /&gt;
&lt;br /&gt;
We set-up the mkspecs for WebOS (compiler parameters required for cross-compilation):&lt;br /&gt;
&lt;br /&gt;
# Cd to the qws mkspecs: '''cd ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws'''&lt;br /&gt;
# The WebOS mkspecs are mostly the same as the linux-arm-gnueabi-g++ mkspecs. So we copy them and modify them afterwards: '''cp -r linux-arm-gnueabi-g++ linux-webos'''&lt;br /&gt;
# Edit the linux-webos mkspecs to set-up the cross-compiler path and other build parameters. E.g. '''vi ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws/linux-webos/qmake.conf'''. This file must look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#&lt;br /&gt;
# qmake configuration for WebOS builds with arm-linux-g++&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#for 4.7.4:&lt;br /&gt;
#include(../../common/g++.conf)&lt;br /&gt;
#include(../../common/linux.conf)&lt;br /&gt;
#include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# for 4.8&lt;br /&gt;
include(../../common/linux.conf)&lt;br /&gt;
include(../../common/gcc-base-unix.conf)&lt;br /&gt;
include(../../common/g++-unix.conf)&lt;br /&gt;
include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# modifications to g++.conf&lt;br /&gt;
#Toolchain&lt;br /&gt;
&lt;br /&gt;
#Base directory of gcc toolchain&lt;br /&gt;
&lt;br /&gt;
GCCBASE                 = /opt/PalmPDK/arm-gcc/bin&lt;br /&gt;
TSLIB_INCDIR            = /opt/PalmPDK/include&lt;br /&gt;
TSLIB_LIBDIR            = /opt/PalmPDK/device/lib&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Compiler Flags to take advantage of the ARM architecture&lt;br /&gt;
QMAKE_CFLAGS_RELEASE    = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CFLAGS_DEBUG      = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
QMAKE_CXXFLAGS_RELEASE  = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CXXFLAGS_DEBUG    = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
# For official pdk&lt;br /&gt;
QMAKE_CC                = $$GCCBASE/arm-none-linux-gnueabi-gcc&lt;br /&gt;
QMAKE_CXX               = $$GCCBASE/arm-none-linux-gnueabi-g++&lt;br /&gt;
QMAKE_LINK              = $$QMAKE_CXX&lt;br /&gt;
QMAKE_LINK_SHLIB        = $$QMAKE_CXX&lt;br /&gt;
QMAKE_RANLIB            = $$GCCBASE/arm-none-linux-gnueabi-ranlib&lt;br /&gt;
&lt;br /&gt;
# modifications to linux.conf&lt;br /&gt;
QMAKE_AR                = $$GCCBASE/arm-none-linux-gnueabi-ar cqs&lt;br /&gt;
QMAKE_OBJCOPY           = $$GCCBASE/arm-none-linux-gnueabi-objcopy&lt;br /&gt;
QMAKE_STRIP             = $$GCCBASE/arm-none-linux-gnueabi-strip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
QMAKE_INCDIR = $$TSLIB_INCDIR &lt;br /&gt;
QMAKE_LIBDIR = $$TSLIB_LIBDIR &lt;br /&gt;
QMAKE_LIBS   += -lrt -lz &lt;br /&gt;
&lt;br /&gt;
QMAKE_LFLAGS += -Wl,--allow-shlib-undefined &lt;br /&gt;
&lt;br /&gt;
load(qt_config)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.3 gfxdrivers plugin for WebOS ===&lt;br /&gt;
&lt;br /&gt;
Qt embedded needs a gfxdrivers plugin which allows Qt to show things on a screen, get keyboard input and mouse events. This step gets the WebOS Qt gfxdrivers plugin. &lt;br /&gt;
&lt;br /&gt;
The initial plugin version was written by Darron Black [1,2] and it uses SDL for graphics. With the changes in WebOS 2.x, that plugin doesn't work anymore: it uses root access to read the keyboard, but recent PDK apps are not running as root anymore but in jails. Therefore an extended version is required that handles keyboard input for &amp;quot;non-root&amp;quot; users. That version is available from [http://code.google.com/p/qt-webos Qt gfxdrivers plugin for WebOS on Google Code]. It has also tentative support for screen rotation.&lt;br /&gt;
&lt;br /&gt;
# Cd to the Qt gfxdrivers directory: '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers'''&lt;br /&gt;
# Get the WebOS gfxdrivers plugin from the svn repository: '''svn checkout http://qt-webos.googlecode.com/svn/trunk/ webos'''&lt;br /&gt;
# Edit ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/gfxdrivers.pro to add the line: '''contains(gfx-plugins, webos)        :SUBDIRS += webos'''&lt;br /&gt;
# In order to support screen rotation we need to patch the &amp;quot;transformed&amp;quot; screen driver. This driver is provided by Qt to do screen rotation or offsetting and it uses as back-end the driver doing the actual access to the pixels (that would be our webos qgfxdrivers). Unfortunately the transformed driver doesn't allow to &amp;quot;notify&amp;quot; SDL when pixels are changed. A quick hack is to patch ~/qt-everywhere-opensource-src-4.8.0t/src/gui/embedded/qscreentransformed_qws.cpp. In this patch we hijack the functionality of the &amp;quot;blank&amp;quot; method (which is supposed to blank the screen) to notify the WebOS gfxdrivers before and after pixels are modified. So edit qscreentransformed_qws.cpp around lines 430 and add the two lines marked with the comments below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
    screen()-&amp;gt;blank(true);                        // ADD THIS FOR WEBOS&lt;br /&gt;
    QWSDisplay::grab();&lt;br /&gt;
    for (int i = 0; i &amp;lt; rects.size(); ++i) {&lt;br /&gt;
        const QRect r = rects.at(i) &amp;amp; bound;&lt;br /&gt;
&lt;br /&gt;
        QPoint dst;&lt;br /&gt;
        switch (trans) {&lt;br /&gt;
        case Rot90:&lt;br /&gt;
            dst = mapToDevice(r.topRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot180:&lt;br /&gt;
            dst = mapToDevice(r.bottomRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot270:&lt;br /&gt;
            dst = mapToDevice(r.bottomLeft(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        func(this, image, r.translated(-topLeft), dst);&lt;br /&gt;
    }&lt;br /&gt;
    QWSDisplay::ungrab();&lt;br /&gt;
    screen()-&amp;gt;blank(false);                       // ADD THIS FOR WEBOS&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Cross-compile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we can configure and cross-compile Qt. The lines below configure Qt to install in ~/qte-48:&lt;br /&gt;
&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0'''&lt;br /&gt;
# '''./configure -v -prefix ~/qte-48 -embedded arm -platform qws/linux-x86-g++ -xplatform qws/linux-webos -depths 16,24,32 -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-nis -no-iconv -no-dbus -no-cups -no-largefile -no-accessibility -no-gtkstyle -no-qt3support -qt-gfx-vnc -plugin-gfx-vnc -no-glib -qtlibinfix 48 -xmlpatterns -exceptions -opensource -make libs -nomake tools -nomake demo -nomake examples -nomake docs -webkit -javascript-jit -script -scripttools -declarative -openssl -qt-gfx-transformed'''&lt;br /&gt;
# '''make -j4'''&lt;br /&gt;
# '''make install'''&lt;br /&gt;
&lt;br /&gt;
The WebOS gfxdrivers plugin must be compiled manually:&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/webos'''&lt;br /&gt;
# '''make'''&lt;br /&gt;
&lt;br /&gt;
This builds and copies the plugin into ~/qte-48/plugins/gfxdrivers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hopefully you've made it so far without problems! You now have Qt in ~/qte-48.&lt;br /&gt;
&lt;br /&gt;
== 4. Compiling Qt apps ==&lt;br /&gt;
&lt;br /&gt;
We see here how to compile a Qt app for Qt on WebOS. We look at two examples that are directly taken from the Qt distribution.  &lt;br /&gt;
# fancybrowser: this is a Qt-widget-based example browser. It is available in QTSDKDIR/Examples/4.8/webkit/fancybrowser. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qt.zip here]&lt;br /&gt;
# webbrowser: this is a Qt-QML-based example browser. It is available in QTSDKDRIR/Demos/4.8/declarative/webbrowser. Since this is a QML app, a QmlApplicationViewer must be used to run the QML files. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qml.zip here]&lt;br /&gt;
&lt;br /&gt;
The binaries are available on the WebOS homebrew app repository [www.webosnation.com/a-browser-qt-test here] and [www.webosnation.com/a-browser-qml-test here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The way compilation of the apps is mostly identical, but the QML-based project has a few extra complexities so we'll see first the widget-based project.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Qt-widget app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Examples/4.8/webkit/fancybrowser in your working directory, e.g. ~/fancybrowser&lt;br /&gt;
&lt;br /&gt;
Two things must be modified in the project: &lt;br /&gt;
* fancybrowser.pro: this is the project file, it must be modified to include the proper libraries&lt;br /&gt;
* main.cpp: this is the file in which the QApplication object is instanciated. We must do some setup to indicate to the application:&lt;br /&gt;
** where to find system fonts, &lt;br /&gt;
** to start the application as a GUI server application&lt;br /&gt;
** to use the WebOS gfxdrivers plugin, or to use the transformed gfxdrivers plugin in combination with the WebOS gfxdrivers plugin to support screen rotation.&lt;br /&gt;
&lt;br /&gt;
Note that one could avoid modifying main.cpp altogether because the same results can be achieved by environment variables and by command line arguments. Therefore a script could set the environment variables and call the executable with the appropriate parameters. However we go through the self-contained solution, which is a bit more complex but may seen as more clean.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
The pro file must be modified to link the PDL and SDL libs, and also to look for the Qt libraries at the right location at runtime. Here we assume that the Qt libs are in a subdirectory called 'qt' below the directory where the application is deployed. &lt;br /&gt;
&lt;br /&gt;
Modify fancybrowser.pro and add this at the end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
!win32: {&lt;br /&gt;
message(assume qws)&lt;br /&gt;
# Set the runtime path to a relative directory w.r.t. the location of the executable&lt;br /&gt;
LIBS += -Wl,-rpath,&amp;quot;'\$$ORIGIN/qt'&amp;quot; -L/opt/PalmPDK/device/lib -lpdl -lSDL&lt;br /&gt;
INCLUDEPATH += /opt/PalmPDK/include/SDL&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that '''!win32:{...}''' sets these parameters for any &amp;quot;non windows build&amp;quot; (I happen to build the desktop app on Windows and the WebOS app on Linux). Ideally we would rather have something for webos ('''webos:{...}''') but I did not investigate how to do enable that - if somebody knows, feel free to share.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
There are modifications to main.cpp in three categories.&lt;br /&gt;
&lt;br /&gt;
When instanciating a QApplication object the fonts are search in the directory specified by the QT_QWS_FONTDIR environment variable. To my knowledge this cannot be specified to QApplication in another way. Therefore we set programmatically QT_QWS_FONTDIR to where we have our fonts. There are two possibilities: we can deploy the fonts of Qt, or we can use the fonts already available on the WebOS device. Using the fonts of the WebOS device is fine so we use this. See the commented-out line for the alternative approach.&lt;br /&gt;
&lt;br /&gt;
When instanciating the QApplication object we want to start the application as a GUI server application. This is achieved by passing QApplication::GuiServer in the QApplication constructor. The alternative approach is to call the program with '''-qws''' on the command line.&lt;br /&gt;
&lt;br /&gt;
The gfxdrivers plugin must be specified. This can be done with the '''-display''' command line argument. Here we programmatically set this command line argument.&lt;br /&gt;
We have two alternatives. We can use directly the WebOS gfxdrivers plugin. This does not allow for screen rotation. The command line would then be ''''-display PalmPreSDLFb:nnn'''. &lt;br /&gt;
Alternatively, we can use the transformed gfxdrivers in combination with the WebOS gfxdrivers plugin. This allows for screen rotation. The command line would then be '''-display Transformed:PalmPreSDLFb:nnn'''.&lt;br /&gt;
&lt;br /&gt;
'''nnn''' is a number which you must set to identify the display driver. In a normal embedded system only a single GUI server application would run at any time, and this number can be the same for all applications (or even left out, QApplication assumes number 0 then). This number is used by Qt to create a temporary directory ('''/tmp/qtembedded-nnn''') that contains, among others, a font cache.&lt;br /&gt;
&lt;br /&gt;
However, on WebOS each running Qt applications is a GUI server. Each application will thus create a '''/tmp/qtembedded-nnn''' directory. Therefore '''nnn''' must be unique for each Qt application. (maybe we need a convention to avoid conflicts - might be enough to use some randomly generated number for each app).&lt;br /&gt;
&lt;br /&gt;
main.cpp can be modified as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Generate the makefile and compile:&lt;br /&gt;
# ~/qte-48/bin/qmake fancybrowser.pro&lt;br /&gt;
# make&lt;br /&gt;
&lt;br /&gt;
Now the app is compiled. The Qt libs must also be deployed on the device. See the deployment section below for how to lay-out the files.&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Qt-QML app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Demos/4.8/declarative/webbrowser in your working directory, e.g. ~/webbrowser&lt;br /&gt;
&lt;br /&gt;
Essentially the same modifications must be made to the Qt-QML project as for the Qt-widget project, with some additions to the main file.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app, and in addition we must set the path where the QML imports can be found. This can be specified with the QML_IMPORT_PATH environment variable. We set-it up programmatically here.&lt;br /&gt;
&lt;br /&gt;
The file main.cpp looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP&lt;br /&gt;
    QString qmlpath = QString(pathexe)+&amp;quot;/imports&amp;quot;;&lt;br /&gt;
    if(!qputenv(&amp;quot;QML_IMPORT_PATH&amp;quot;,qmlpath.toAscii()))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set qml path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Same as for Qt-widget apps.&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Deployment ===&lt;br /&gt;
&lt;br /&gt;
We can now test the application, and create an IPK which can be uploaded to the HP or homebrew app repository.&lt;br /&gt;
&lt;br /&gt;
In order to test the app, it must be copied to the device together with Qt libs. The device directory structure, assuming the app is in APPDIR, must be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APPDIR:                  the application is here&lt;br /&gt;
APPDIR/qt:               qt libs. Copy ~/qte-48/lib/*.so.4 here)&lt;br /&gt;
APPDIR/fonts:            fonts (not needed if the WebOS fonts are used). Copy ~/qte-48/lib/fonts/* here&lt;br /&gt;
APPDIR/gfxdrivers:       gfxdrivers plugins. Copy ~/qte-48/plugins/gfxdrivers/* here&lt;br /&gt;
APPDIR/imageformats:     imageformats plugins. Copy ~/qte-48/plugins/imageformats/* here&lt;br /&gt;
APPDIR/imports:          QML stuff (not needed for Qt-widget). Copy ~/qte-48/imports/* here&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can deploy these files in /media/internal/APPDIR for testing and run the application from the command line.&lt;br /&gt;
&lt;br /&gt;
To create an IPK file you need in addition an appinfo.json file. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;A-Browser Qml (test)&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;pdk&amp;quot;,&lt;br /&gt;
	&amp;quot;main&amp;quot;: &amp;quot;abrowse-qml&amp;quot;,&lt;br /&gt;
	&amp;quot;id&amp;quot;: &amp;quot;net.danielroggen.abrowseqml&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
	&amp;quot;vendor&amp;quot;: &amp;quot;danielroggen&amp;quot;,&lt;br /&gt;
	&amp;quot;icon&amp;quot;:     &amp;quot;icon.png&amp;quot; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a STAGING directory which contains:&lt;br /&gt;
* the application&lt;br /&gt;
* the Qt stuff (keeping the directory structure mentionned above)&lt;br /&gt;
* the icon&lt;br /&gt;
* the appinfo.json&lt;br /&gt;
* any other required file&lt;br /&gt;
&lt;br /&gt;
And run '''palm-package STAGING'''. This will create an .ipk ready for distribution. Before distributing, try to install it on the device with Preware: copy the ipk to the device, run Preware and select the option to install ipk packages from the menu, and check that your app works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No virtual keyboard so far&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. Links ==&lt;br /&gt;
[1] [http://www.griffin.net/2010/02/qt-on-the-palm-pre.html Qt on the Palm Pre]&lt;br /&gt;
&lt;br /&gt;
[2] [https://gitorious.org/~darronb/qt/qt-palm-pre Qt port to webOS by Darron Black on gitorious]&lt;br /&gt;
&lt;br /&gt;
[3] A-Browser QML [http://danielroggen.net/sw/abrowse-qml.zip source] and [http://www.webosnation.com/a-browser-qml-test binary]&lt;br /&gt;
&lt;br /&gt;
[4] A-Browser Qt [http://danielroggen.net/sw/abrowse-qt.zip source] and [http://www.webosnation.com/a-browser-qt-test binary]&lt;br /&gt;
&lt;br /&gt;
[5] Updated [http://code.google.com/p/qt-webos/ WebOS gfxdrivers plugin]&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
	<entry>
		<id>http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21941</id>
		<title>HowtoQt</title>
		<link rel="alternate" type="text/html" href="http://wiki.webos-internals.org/index.php?title=HowtoQt&amp;diff=21941"/>
		<updated>2013-08-28T06:21:10Z</updated>

		<summary type="html">&lt;p&gt;Herrie: /* 1. Getting and setting up the Palm PDK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to cross-compile Qt for WebOS =&lt;br /&gt;
History:&lt;br /&gt;
&lt;br /&gt;
* 08.02.2012: first version&lt;br /&gt;
&lt;br /&gt;
= Qt and QML on WebOS devices =&lt;br /&gt;
&lt;br /&gt;
This document explains how to set-up [http://qt.nokia.com Qt 4.8 (Trolltech/Nokia's cross-platform application and UI framework)] on WebOS devices, and then how to cross-compile Qt or QML apps.&lt;br /&gt;
&lt;br /&gt;
This guide assumes:&lt;br /&gt;
* a Linux development environment (here Kubuntu 11.10 running in virtualbox on a win7 host)&lt;br /&gt;
* Qt 4.8 (the process for Qt 4.7.x is mostly identical; no idea for Qt 5)&lt;br /&gt;
* OpenSSH running on the webos device to scp files to it&lt;br /&gt;
* The reasonable development tools&lt;br /&gt;
&lt;br /&gt;
The steps include:&lt;br /&gt;
# Getting and setting-up the Palm PDK&lt;br /&gt;
# Optionally: completing the PDK with some missing includes&lt;br /&gt;
# Getting Qt 4.8, setting it up for cross-compilation&lt;br /&gt;
# Cross-compilation of Qt 4.8&lt;br /&gt;
# Updated webos port of Qt&lt;br /&gt;
# Application tweaks to look for libs in the right places&lt;br /&gt;
&lt;br /&gt;
== 1. Getting and setting up the Palm PDK ==&lt;br /&gt;
&lt;br /&gt;
Qt is cross-compiled with the official Palm PDK. The PDK plays nice: it can be installed alongside the webos internals WIDK without conflicts; there is no need to modify paths or environment variables.&lt;br /&gt;
&lt;br /&gt;
Note that I haven't &amp;quot;fully&amp;quot; installed the PDK. In particular I haven't set-up the emulator. The basic stuff needed are: the arm gcc toolchain, and novacom to communicate with the device. VirtualBox can be skipped. Java may be necessary.&lt;br /&gt;
&lt;br /&gt;
# Read about the [https://developer.palm.com/content/resources/develop/sdk_pdk_download.html#linux Palm SDK 3.05] and the installation procedure. Follow the instructions on there. But essentially this boils down to:&lt;br /&gt;
# Download novacom from that page&lt;br /&gt;
# Download the SDK from that page&lt;br /&gt;
# Install novacom and the SDK following the instructions. I.e.:&lt;br /&gt;
## sudo dpkg -i palm-sdk_3.0.5-svn528736-pho676_i386.deb&lt;br /&gt;
## sudo dpkg -i palm-novacom_1.0.80_i386.deb 	&lt;br /&gt;
&lt;br /&gt;
# The SDK is now in /opt/PalmPDK&lt;br /&gt;
&lt;br /&gt;
'''When you're running 64 bits Linux please make sure to also install ia32-libs by running:'''&lt;br /&gt;
# sudo apt-get install ia32-libs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may check that all is fine so far (or skip this - this is simply to step-by-step see if all is ok):&lt;br /&gt;
# You can invoke gcc or g++ from the PDK arm toolchain to compile some test program. E.g. '''/opt/PalmPDK/arm-gcc/bin/arm-none-linux-gnueabi-g++ hello.cpp -o hello'''&lt;br /&gt;
# You can copy this file to the usb drive on the device: '''scp hello root@ip.address.of.device:/media/internal'''&lt;br /&gt;
# You can go log on the device with novaterm: '''novaterm'''&lt;br /&gt;
# You can run your test program: '''/media/internal/hello'''&lt;br /&gt;
&lt;br /&gt;
If that works then on to the next steps.&lt;br /&gt;
&lt;br /&gt;
== 2. Optional: completing the PDK with some missing includes ==&lt;br /&gt;
&lt;br /&gt;
The Palm PDK contains an arm toolchain which can be used as-is to cross-compile Qt. This step can be skipped, unless you want maximum performance with JavaScript in WebKit.&lt;br /&gt;
&lt;br /&gt;
There is one issue with the Palm PDK. The Qt configuration script relies on the existence of one include file - '''/opt/PalmPDK/include/asm/hwcap.h''' (actually more includes in the /opt/PalmPDK/include/asm directory are needed) - to know whether programs can identify the characteristics of the CPU, such as the availability of Neon instructions. &lt;br /&gt;
&lt;br /&gt;
Without these includes, Qt will cross-compile and work, but the just-in-time JavaScript compiler in WebKit will be deactivated. This decreases JavaScript performance by a factor ~3.&lt;br /&gt;
&lt;br /&gt;
Therefore the recommended approach is to provide the missing include files. These files can be found in the CodeSourcery arm toolchain.&lt;br /&gt;
&lt;br /&gt;
# Download the arm toolchain &amp;quot;Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux&amp;quot; from [http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/arm-gnu-linux Mentor Graphics' website]. You need to register to download, but it's free. Make sure you get the ARM GNU/Linux Release (not the ARM EABI release!). The file you get should be called arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2&lt;br /&gt;
# Untar this file: '''tar xvfj arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2'''&lt;br /&gt;
# Copy the entire include/asm directory to the PalmPDK: '''cp -r arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/asm /opt/PalmPDK/include'''&lt;br /&gt;
&lt;br /&gt;
You're set!&lt;br /&gt;
&lt;br /&gt;
== 3. Getting Qt 4.8, setting it up for cross-compilation ==&lt;br /&gt;
&lt;br /&gt;
This step gets the Qt 4.8 sources, and sets-up Qt for cross-compilation using the Palm PDK.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Get the Qt sources ===&lt;br /&gt;
&lt;br /&gt;
# Cd to your home directory: '''cd ~'''&lt;br /&gt;
# Get the Qt 4.8 sources: '''http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
# Untar: '''tar xvfz qt-everywhere-opensource-src-4.8.0.tar.gz'''&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Qt mkspecs for WebOS ===&lt;br /&gt;
&lt;br /&gt;
We set-up the mkspecs for WebOS (compiler parameters required for cross-compilation):&lt;br /&gt;
&lt;br /&gt;
# Cd to the qws mkspecs: '''cd ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws'''&lt;br /&gt;
# The WebOS mkspecs are mostly the same as the linux-arm-gnueabi-g++ mkspecs. So we copy them and modify them afterwards: '''cp -r linux-arm-gnueabi-g++ linux-webos'''&lt;br /&gt;
# Edit the linux-webos mkspecs to set-up the cross-compiler path and other build parameters. E.g. '''vi ~/qt-everywhere-opensource-src-4.8.0/mkspecs/qws/linux-webos/qmake.conf'''. This file must look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#&lt;br /&gt;
# qmake configuration for WebOS builds with arm-linux-g++&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
#for 4.7.4:&lt;br /&gt;
#include(../../common/g++.conf)&lt;br /&gt;
#include(../../common/linux.conf)&lt;br /&gt;
#include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# for 4.8&lt;br /&gt;
include(../../common/linux.conf)&lt;br /&gt;
include(../../common/gcc-base-unix.conf)&lt;br /&gt;
include(../../common/g++-unix.conf)&lt;br /&gt;
include(../../common/qws.conf)&lt;br /&gt;
&lt;br /&gt;
# modifications to g++.conf&lt;br /&gt;
#Toolchain&lt;br /&gt;
&lt;br /&gt;
#Base directory of gcc toolchain&lt;br /&gt;
&lt;br /&gt;
GCCBASE                 = /opt/PalmPDK/arm-gcc/bin&lt;br /&gt;
TSLIB_INCDIR            = /opt/PalmPDK/include&lt;br /&gt;
TSLIB_LIBDIR            = /opt/PalmPDK/device/lib&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Compiler Flags to take advantage of the ARM architecture&lt;br /&gt;
QMAKE_CFLAGS_RELEASE    = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CFLAGS_DEBUG      = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
QMAKE_CXXFLAGS_RELEASE  = -O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize&lt;br /&gt;
QMAKE_CXXFLAGS_DEBUG    = -O0 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp&lt;br /&gt;
&lt;br /&gt;
# For official pdk&lt;br /&gt;
QMAKE_CC                = $$GCCBASE/arm-none-linux-gnueabi-gcc&lt;br /&gt;
QMAKE_CXX               = $$GCCBASE/arm-none-linux-gnueabi-g++&lt;br /&gt;
QMAKE_LINK              = $$QMAKE_CXX&lt;br /&gt;
QMAKE_LINK_SHLIB        = $$QMAKE_CXX&lt;br /&gt;
QMAKE_RANLIB            = $$GCCBASE/arm-none-linux-gnueabi-ranlib&lt;br /&gt;
&lt;br /&gt;
# modifications to linux.conf&lt;br /&gt;
QMAKE_AR                = $$GCCBASE/arm-none-linux-gnueabi-ar cqs&lt;br /&gt;
QMAKE_OBJCOPY           = $$GCCBASE/arm-none-linux-gnueabi-objcopy&lt;br /&gt;
QMAKE_STRIP             = $$GCCBASE/arm-none-linux-gnueabi-strip&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
QMAKE_INCDIR = $$TSLIB_INCDIR &lt;br /&gt;
QMAKE_LIBDIR = $$TSLIB_LIBDIR &lt;br /&gt;
QMAKE_LIBS   += -lrt -lz &lt;br /&gt;
&lt;br /&gt;
QMAKE_LFLAGS += -Wl,--allow-shlib-undefined &lt;br /&gt;
&lt;br /&gt;
load(qt_config)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.3 gfxdrivers plugin for WebOS ===&lt;br /&gt;
&lt;br /&gt;
Qt embedded needs a gfxdrivers plugin which allows Qt to show things on a screen, get keyboard input and mouse events. This step gets the WebOS Qt gfxdrivers plugin. &lt;br /&gt;
&lt;br /&gt;
The initial plugin version was written by Darron Black [1,2] and it uses SDL for graphics. With the changes in WebOS 2.x, that plugin doesn't work anymore: it uses root access to read the keyboard, but recent PDK apps are not running as root anymore but in jails. Therefore an extended version is required that handles keyboard input for &amp;quot;non-root&amp;quot; users. That version is available from [http://code.google.com/p/qt-webos Qt gfxdrivers plugin for WebOS on Google Code]. It has also tentative support for screen rotation.&lt;br /&gt;
&lt;br /&gt;
# Cd to the Qt gfxdrivers directory: '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers'''&lt;br /&gt;
# Get the WebOS gfxdrivers plugin from the svn repository: '''svn checkout http://qt-webos.googlecode.com/svn/trunk/ webos'''&lt;br /&gt;
# Edit ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/gfxdrivers.pro to add the line: '''contains(gfx-plugins, webos)        :SUBDIRS += webos'''&lt;br /&gt;
# In order to support screen rotation we need to patch the &amp;quot;transformed&amp;quot; screen driver. This driver is provided by Qt to do screen rotation or offsetting and it uses as back-end the driver doing the actual access to the pixels (that would be our webos qgfxdrivers). Unfortunately the transformed driver doesn't allow to &amp;quot;notify&amp;quot; SDL when pixels are changed. A quick hack is to patch ~/qt-everywhere-opensource-src-4.8.0t/src/gui/embedded/qscreentransformed_qws.cpp. In this patch we hijack the functionality of the &amp;quot;blank&amp;quot; method (which is supposed to blank the screen) to notify the WebOS gfxdrivers before and after pixels are modified. So edit qscreentransformed_qws.cpp around lines 430 and add the two lines marked with the comments below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
    screen()-&amp;gt;blank(true);                        // ADD THIS FOR WEBOS&lt;br /&gt;
    QWSDisplay::grab();&lt;br /&gt;
    for (int i = 0; i &amp;lt; rects.size(); ++i) {&lt;br /&gt;
        const QRect r = rects.at(i) &amp;amp; bound;&lt;br /&gt;
&lt;br /&gt;
        QPoint dst;&lt;br /&gt;
        switch (trans) {&lt;br /&gt;
        case Rot90:&lt;br /&gt;
            dst = mapToDevice(r.topRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot180:&lt;br /&gt;
            dst = mapToDevice(r.bottomRight(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        case Rot270:&lt;br /&gt;
            dst = mapToDevice(r.bottomLeft(), QSize(w, h));&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        func(this, image, r.translated(-topLeft), dst);&lt;br /&gt;
    }&lt;br /&gt;
    QWSDisplay::ungrab();&lt;br /&gt;
    screen()-&amp;gt;blank(false);                       // ADD THIS FOR WEBOS&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Cross-compile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we can configure and cross-compile Qt. The lines below configure Qt to install in ~/qte-48:&lt;br /&gt;
&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0'''&lt;br /&gt;
# '''./configure -v -prefix ~/qte-48 -embedded arm -platform qws/linux-x86-g++ -xplatform qws/linux-webos -depths 16,24,32 -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-nis -no-iconv -no-dbus -no-cups -no-largefile -no-accessibility -no-gtkstyle -no-qt3support -qt-gfx-vnc -plugin-gfx-vnc -no-glib -qtlibinfix 48 -xmlpatterns -exceptions -opensource -make libs -nomake tools -nomake demo -nomake examples -nomake docs -webkit -javascript-jit -script -scripttools -declarative -openssl -qt-gfx-transformed'''&lt;br /&gt;
# '''make -j4'''&lt;br /&gt;
# '''make install'''&lt;br /&gt;
&lt;br /&gt;
The WebOS gfxdrivers plugin must be compiled manually:&lt;br /&gt;
# '''cd ~/qt-everywhere-opensource-src-4.8.0/src/plugins/gfxdrivers/webos'''&lt;br /&gt;
# '''make'''&lt;br /&gt;
&lt;br /&gt;
This builds and copies the plugin into ~/qte-48/plugins/gfxdrivers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hopefully you've made it so far without problems! You now have Qt in ~/qte-48.&lt;br /&gt;
&lt;br /&gt;
== 4. Compiling Qt apps ==&lt;br /&gt;
&lt;br /&gt;
We see here how to compile a Qt app for Qt on WebOS. We look at two examples that are directly taken from the Qt distribution.  &lt;br /&gt;
# fancybrowser: this is a Qt-widget-based example browser. It is available in QTSDKDIR/Examples/4.8/webkit/fancybrowser. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qt.zip here]&lt;br /&gt;
# webbrowser: this is a Qt-QML-based example browser. It is available in QTSDKDRIR/Demos/4.8/declarative/webbrowser. Since this is a QML app, a QmlApplicationViewer must be used to run the QML files. Download the source with the modifications [http://danielroggen.net/sw/abrowse-qml.zip here]&lt;br /&gt;
&lt;br /&gt;
The binaries are available on the WebOS homebrew app repository [www.webosnation.com/a-browser-qt-test here] and [www.webosnation.com/a-browser-qml-test here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The way compilation of the apps is mostly identical, but the QML-based project has a few extra complexities so we'll see first the widget-based project.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Qt-widget app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Examples/4.8/webkit/fancybrowser in your working directory, e.g. ~/fancybrowser&lt;br /&gt;
&lt;br /&gt;
Two things must be modified in the project: &lt;br /&gt;
* fancybrowser.pro: this is the project file, it must be modified to include the proper libraries&lt;br /&gt;
* main.cpp: this is the file in which the QApplication object is instanciated. We must do some setup to indicate to the application:&lt;br /&gt;
** where to find system fonts, &lt;br /&gt;
** to start the application as a GUI server application&lt;br /&gt;
** to use the WebOS gfxdrivers plugin, or to use the transformed gfxdrivers plugin in combination with the WebOS gfxdrivers plugin to support screen rotation.&lt;br /&gt;
&lt;br /&gt;
Note that one could avoid modifying main.cpp altogether because the same results can be achieved by environment variables and by command line arguments. Therefore a script could set the environment variables and call the executable with the appropriate parameters. However we go through the self-contained solution, which is a bit more complex but may seen as more clean.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
The pro file must be modified to link the PDL and SDL libs, and also to look for the Qt libraries at the right location at runtime. Here we assume that the Qt libs are in a subdirectory called 'qt' below the directory where the application is deployed. &lt;br /&gt;
&lt;br /&gt;
Modify fancybrowser.pro and add this at the end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
!win32: {&lt;br /&gt;
message(assume qws)&lt;br /&gt;
# Set the runtime path to a relative directory w.r.t. the location of the executable&lt;br /&gt;
LIBS += -Wl,-rpath,&amp;quot;'\$$ORIGIN/qt'&amp;quot; -L/opt/PalmPDK/device/lib -lpdl -lSDL&lt;br /&gt;
INCLUDEPATH += /opt/PalmPDK/include/SDL&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that '''!win32:{...}''' sets these parameters for any &amp;quot;non windows build&amp;quot; (I happen to build the desktop app on Windows and the WebOS app on Linux). Ideally we would rather have something for webos ('''webos:{...}''') but I did not investigate how to do enable that - if somebody knows, feel free to share.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
There are modifications to main.cpp in three categories.&lt;br /&gt;
&lt;br /&gt;
When instanciating a QApplication object the fonts are search in the directory specified by the QT_QWS_FONTDIR environment variable. To my knowledge this cannot be specified to QApplication in another way. Therefore we set programmatically QT_QWS_FONTDIR to where we have our fonts. There are two possibilities: we can deploy the fonts of Qt, or we can use the fonts already available on the WebOS device. Using the fonts of the WebOS device is fine so we use this. See the commented-out line for the alternative approach.&lt;br /&gt;
&lt;br /&gt;
When instanciating the QApplication object we want to start the application as a GUI server application. This is achieved by passing QApplication::GuiServer in the QApplication constructor. The alternative approach is to call the program with '''-qws''' on the command line.&lt;br /&gt;
&lt;br /&gt;
The gfxdrivers plugin must be specified. This can be done with the '''-display''' command line argument. Here we programmatically set this command line argument.&lt;br /&gt;
We have two alternatives. We can use directly the WebOS gfxdrivers plugin. This does not allow for screen rotation. The command line would then be ''''-display PalmPreSDLFb:nnn'''. &lt;br /&gt;
Alternatively, we can use the transformed gfxdrivers in combination with the WebOS gfxdrivers plugin. This allows for screen rotation. The command line would then be '''-display Transformed:PalmPreSDLFb:nnn'''.&lt;br /&gt;
&lt;br /&gt;
'''nnn''' is a number which you must set to identify the display driver. In a normal embedded system only a single GUI server application would run at any time, and this number can be the same for all applications (or even left out, QApplication assumes number 0 then). This number is used by Qt to create a temporary directory ('''/tmp/qtembedded-nnn''') that contains, among others, a font cache.&lt;br /&gt;
&lt;br /&gt;
However, on WebOS each running Qt applications is a GUI server. Each application will thus create a '''/tmp/qtembedded-nnn''' directory. Therefore '''nnn''' must be unique for each Qt application. (maybe we need a convention to avoid conflicts - might be enough to use some randomly generated number for each app).&lt;br /&gt;
&lt;br /&gt;
main.cpp can be modified as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Generate the makefile and compile:&lt;br /&gt;
# ~/qte-48/bin/qmake fancybrowser.pro&lt;br /&gt;
# make&lt;br /&gt;
&lt;br /&gt;
Now the app is compiled. The Qt libs must also be deployed on the device. See the deployment section below for how to lay-out the files.&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Qt-QML app ===&lt;br /&gt;
&lt;br /&gt;
We assume a copy of QTSDKDIR/Demos/4.8/declarative/webbrowser in your working directory, e.g. ~/webbrowser&lt;br /&gt;
&lt;br /&gt;
Essentially the same modifications must be made to the Qt-QML project as for the Qt-widget project, with some additions to the main file.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the .pro file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app.&lt;br /&gt;
&lt;br /&gt;
==== Modifications to the main file ====&lt;br /&gt;
&lt;br /&gt;
Same as for the Qt-widget app, and in addition we must set the path where the QML imports can be found. This can be specified with the QML_IMPORT_PATH environment variable. We set-it up programmatically here.&lt;br /&gt;
&lt;br /&gt;
The file main.cpp looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rv;&lt;br /&gt;
&lt;br /&gt;
#ifdef Q_WS_QWS&lt;br /&gt;
#warning &amp;quot;Hacks for QWS&amp;quot;&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // Get the path to the exe...&lt;br /&gt;
    // Ideally we should use QApplication::applicationDirPath, but instanciating that&lt;br /&gt;
    // one attempts to load the fonts... which aren't defined yet&lt;br /&gt;
    char pathexe[1024];&lt;br /&gt;
    rv = readlink(&amp;quot;/proc/self/exe&amp;quot;, pathexe, sizeof(pathexe));&lt;br /&gt;
    if(!(rv&amp;gt;0 &amp;amp;&amp;amp; rv&amp;lt;sizeof(pathexe)))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Couldn't get the exe path - terminating\n&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    pathexe[rv]=0;&lt;br /&gt;
    printf(&amp;quot;path to exe: %s\n&amp;quot;,pathexe);&lt;br /&gt;
    *strrchr(pathexe,'/')=0;    // Eliminate the application name&lt;br /&gt;
    QString fontpath = QString(pathexe)+&amp;quot;/fonts&amp;quot;;&lt;br /&gt;
    //if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,fontpath.toAscii()))              // USE THIS IF YOU DEPLOY YOUR OWN FONTS&lt;br /&gt;
    if(!qputenv(&amp;quot;QT_QWS_FONTDIR&amp;quot;,&amp;quot;/usr/share/fonts&amp;quot;))                // USE THIS IF YOU USE THE WEBOS FONTS&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set font path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //&lt;br /&gt;
    // FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP    FONT SETUP&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    // ------------------------------------------------------------------------&lt;br /&gt;
    // QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP    QML SETUP&lt;br /&gt;
    QString qmlpath = QString(pathexe)+&amp;quot;/imports&amp;quot;;&lt;br /&gt;
    if(!qputenv(&amp;quot;QML_IMPORT_PATH&amp;quot;,qmlpath.toAscii()))&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Can't set qml path&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Hack setting the the display driver&lt;br /&gt;
    int argc2 = argc+2;&lt;br /&gt;
    char **argv2 = new char*[argc2];&lt;br /&gt;
    for(int i=0;i&amp;lt;argc;i++)&lt;br /&gt;
    {&lt;br /&gt;
        argv2[i] = new char[strlen(argv[i])+1];&lt;br /&gt;
        strcpy(argv2[i],argv[i]);&lt;br /&gt;
    }&lt;br /&gt;
    //char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;PalmPreSDLFb:100&amp;quot;};              // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN W/O ROTATION&lt;br /&gt;
    char *display[]={&amp;quot;-display&amp;quot;,&amp;quot;Transformed:PalmPreSDLFb:100&amp;quot;};    // USE THIS FOR THE WEBOS GFXDRIVERS PLUGIN AND ROTATION&lt;br /&gt;
    argv2[argc] = display[0];&lt;br /&gt;
    argv2[argc+1] = display[1];&lt;br /&gt;
&lt;br /&gt;
    // QApplication::GuiServer is akin to passing -qws on the command line&lt;br /&gt;
    // Passes argv2 / argc2 which stays alive for the entire duration of QApplication&lt;br /&gt;
    QApplication app(argc2, argv2,QApplication::GuiServer);  &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
#warning &amp;quot;No QWS - business as usual&amp;quot;&lt;br /&gt;
    QApplication app(argc, argv,QApplication::GuiServer);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
    rv = app.exec();&lt;br /&gt;
    return rv;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Compilation ====&lt;br /&gt;
&lt;br /&gt;
Same as for Qt-widget apps.&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Deployment ===&lt;br /&gt;
&lt;br /&gt;
We can now test the application, and create an IPK which can be uploaded to the HP or homebrew app repository.&lt;br /&gt;
&lt;br /&gt;
In order to test the app, it must be copied to the device together with Qt libs. The device directory structure, assuming the app is in APPDIR, must be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APPDIR:                  the application is here&lt;br /&gt;
APPDIR/qt:               qt libs. Copy ~/qte-48/lib/*.so.4 here)&lt;br /&gt;
APPDIR/fonts:            fonts (not needed if the WebOS fonts are used). Copy ~/qte-48/lib/fonts/* here&lt;br /&gt;
APPDIR/gfxdrivers:       gfxdrivers plugins. Copy ~/qte-48/plugins/gfxdrivers/* here&lt;br /&gt;
APPDIR/imageformats:     imageformats plugins. Copy ~/qte-48/plugins/imageformats/* here&lt;br /&gt;
APPDIR/imports:          QML stuff (not needed for Qt-widget). Copy ~/qte-48/imports/* here&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can deploy these files in /media/internal/APPDIR for testing and run the application from the command line.&lt;br /&gt;
&lt;br /&gt;
To create an IPK file you need in addition an appinfo.json file. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;A-Browser Qml (test)&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;pdk&amp;quot;,&lt;br /&gt;
	&amp;quot;main&amp;quot;: &amp;quot;abrowse-qml&amp;quot;,&lt;br /&gt;
	&amp;quot;id&amp;quot;: &amp;quot;net.danielroggen.abrowseqml&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
	&amp;quot;vendor&amp;quot;: &amp;quot;danielroggen&amp;quot;,&lt;br /&gt;
	&amp;quot;icon&amp;quot;:     &amp;quot;icon.png&amp;quot; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now create a STAGING directory which contains:&lt;br /&gt;
* the application&lt;br /&gt;
* the Qt stuff (keeping the directory structure mentionned above)&lt;br /&gt;
* the icon&lt;br /&gt;
* the appinfo.json&lt;br /&gt;
* any other required file&lt;br /&gt;
&lt;br /&gt;
And run '''palm-package STAGING'''. This will create an .ipk ready for distribution. Before distributing, try to install it on the device with Preware: copy the ipk to the device, run Preware and select the option to install ipk packages from the menu, and check that your app works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No virtual keyboard so far&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. Links ==&lt;br /&gt;
[1] [http://www.griffin.net/2010/02/qt-on-the-palm-pre.html Qt on the Palm Pre]&lt;br /&gt;
&lt;br /&gt;
[2] [https://gitorious.org/~darronb/qt/qt-palm-pre Qt port to webOS by Darron Black on gitorious]&lt;br /&gt;
&lt;br /&gt;
[3] A-Browser QML [http://danielroggen.net/sw/abrowse-qml.zip source] and [http://www.webosnation.com/a-browser-qml-test binary]&lt;br /&gt;
&lt;br /&gt;
[4] A-Browser Qt [http://danielroggen.net/sw/abrowse-qt.zip source] and [http://www.webosnation.com/a-browser-qt-test binary]&lt;br /&gt;
&lt;br /&gt;
[5] Updated [http://code.google.com/p/qt-webos/ WebOS gfxdrivers plugin]&lt;/div&gt;</summary>
		<author><name>Herrie</name></author>
	</entry>
</feed>