Packaging a Qt application

(Example: wikify)
(Debhelper 7: move debhelper information to Packaging)
Line 204: Line 204:
* [[Packaging|Packaging guide for Maemo]]
* [[Packaging|Packaging guide for Maemo]]
* [http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html Desktop entry specification]
* [http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html Desktop entry specification]
-
 
-
= Debhelper 7 =
 
-
 
-
A backport of Debhelper 7 for fremantle is available in extras-devel.
 
-
It works transparently and can coexist with debhelper 5 in the SDK.
 
-
It even works on autobuilder, if you specify the correct build-dependency debhelper7.
 
-
Read the mails about [http://www.mail-archive.com/maemo-developers@maemo.org/msg23779.html debhelper7]
 
-
and [http://www.mail-archive.com/maemo-developers@maemo.org/msg23749.html cdbs-dh7].
 
-
 
-
Alternatively, you can try to use debhelper 5 in some cases:
 
-
 
-
Debian packages that requires level 7 needs some changes:
 
-
eg:
 
-
* debian/compat:  7 -> 5
 
-
* debian/control: Build-Depends: debhelper (>= 7) -> debhelper (>= 5)
 
-
* And maybe comment out a few dh_* calls from debian/rules, which might not exist on level 5
 
-
 
-
Now things might get complex if the packaging already uses some new
 
-
features of level 7, like those CDBS-like helper rules. In such cases,
 
-
looking at versions prior to the compatibility level upgrade might
 
-
help doing the downgrade (and most Debian packages are kept in public
 
-
SCMs like svn.debian.org).
 
[[Category:Development]]
[[Category:Development]]
[[Category:Qt]]
[[Category:Qt]]

Revision as of 11:16, 1 February 2010

Contents

Packaging a Qt application for Maemo

Main article: Packaging


Packaging a Qt application for Maemo is very similar to packaging any other application, so this document only contains information on Qt-specific packaging issues.

Creating a Maemo package from a qmake project

In order to create a new package for Maemo, from a qmake project, you will need to:

  • Rename the upstream source directory to Package-Version (for example myapp-0.1 for an application myapp with a version of 0.1)
  • Create “src” directory in Package-Version/
  • Copy all the files to the src/ directory
  • Rename src/appname.pro to src/src.pro
$mv myapp myapp-0.1
$cd myapp-0.1
$mkdir src
$cp * src
$mv src/appname.pro src/src.pro

Append the following chunk to end of your src/src.pro. The chunk adds an install section to your qmakefile

  unix {
    #VARIABLES
    isEmpty(PREFIX) {
        PREFIX = /usr/local
  }
BINDIR = $$PREFIX/bin
DATADIR =$$PREFIX/share

DEFINES += DATADIR=\"$$DATADIR\" PKGDATADIR=\"$$PKGDATADIR\"

#MAKE INSTALL

INSTALLS += target desktop iconxpm icon26 icon48 icon64

  target.path =$$BINDIR

  desktop.path = $$DATADIR/applications/hildon
  desktop.files += $${TARGET}.desktop

  iconxpm.path = $$DATADIR/pixmap
  iconxpm.files += ../data/maemo/$${TARGET}.xpm

  icon26.path = $$DATADIR/icons/hicolor/26x26/apps
  icon26.files += ../data/26x26/$${TARGET}.png

  icon48.path = $$DATADIR/icons/hicolor/48x48/apps
  icon48.files += ../data/48x48/$${TARGET}.png

  icon64.path = $$DATADIR/icons/hicolor/64x64/apps
  icon64.files += ../data/64x64/$${TARGET}.png
}


  • Create a myapp-0.1/myapp.pro file like this:
QMAKEVERSION = $$[QMAKE_VERSION]
ISQT4 = $$find(QMAKEVERSION, ^[2-9])
isEmpty( ISQT4 ) {
error("Use the qmake include with Qt4.4 or greater, on Debian that is qmake-qt4");
}

TEMPLATE = subdirs
SUBDIRS  = src
  • Run dh_make to debianize the source archive, it creates:
    • An archive with the unchanged upstream source (orig.tar.gz)
    • Some basic files in the debian directory
    • Some example files (*.EX *.ex)
export DEBFULLNAME="maintainer first name and last name"
dh_make --createorig --single -e maintainer@email.org -c gpl

Having a look inside the debian/ dir

At this point the directory my-app contains

  • the source directory ( src/ )
  • the debian directory (debian/)

Inside the debian dir we have the files needed for the creation of the debian package

  • Changelog - Application's change log
  • Compat - Debian helper compatibly version
  • Control - Describes the packages to be made
  • Copyright - Copyright text
  • Rules - A binary makefile containing the rules to build the package


Editing the rules file

The rules file generated by dh_make will be modified in order to look like this one. We are using qmake, so we haven't a configure file to run. If you cut-and-paste following file, notify that empty space beginning of lines it TAB characters, it is not multiple space characters. If you cut-and-paste the following chunk, you most propably get spaces instead tabs and the file does not wok

#!/usr/bin/make -f
APPNAME := my_app_name
builddir:
        mkdir -p builddir

builddir/Makefile: builddir
        cd builddir && qmake-qt4 PREFIX=/usr ../$(APPNAME).pro

build: build-stamp

build-stamp: builddir/Makefile
        dh_testdir
        # Add here commands to compile the package.
        cd builddir && $(MAKE)
        touch $@

clean:
        dh_testdir
        dh_testroot
        rm -f build-stamp
        # Add here commands to clean up after the build process.
        rm -rf builddir
        dh_clean
install: build
        dh_testdir
        dh_testroot
        dh_clean -k
        dh_installdirs

        # Add here commands to install the package into debian/your_appname
        cd builddir && $(MAKE) INSTALL_ROOT=$(CURDIR)/debian/$(APPNAME) install
# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.

# Build architecture-dependent files here.
binary-arch: build install
        dh_testdir
        dh_testroot
        dh_installdocs
        dh_installexamples
        dh_installman
        dh_link
        dh_strip --dbg-package=my-application-dbg
        dh_compress
        dh_fixperms
        dh_installdeb
        dh_shlibdeps
        dh_gencontrol
        dh_md5sums
        dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure

Application menu icon & position

The Maemo application menu detects automatically an app that provides a .desktop file in /usr/share/application/hildon . If you don't have desktop file, create one in the src directory.

[Desktop Entry]
Encoding=UTF-8
Version=0.1
Type=Application
Name=myapp
Exec=/usr/bin/myapp
Icon=myapp
X-HildonDesk-ShowInToolbar=true
X-Osso-Type=application/x-executable

Maemo menu structure is completely different from Debian:

  • An unmodified Debian package installs the proper .desktop in /usr/share/applications
  • Applications that use the debian menu are displayed in the extra menu

In order to show our application in the correct Maemo menu:

  • debian/myapp.install moves the .desktop file and icons in the right directory
src/*.desktop usr/share/applications/hildon
src/*.png usr/share/icons/hicolor/26x26/apps
  • debian/postinst should call maemo-select-menu-location utility to permit the user to choose the menu location. This works only in Diablo, it doesn't work in Fremantle.
#!/bin/sh
maemo-select-menu-location myapp.desktop

Example

You can download the source package of qt-maemo-example from the extras-devel repository as follows, if you have source packages enabled in your /etc/apt/sources.list file:

apt-get source qt-maemo-example

This command will download the:

  • unmodified source (.orig.tar.gz)
  • debian dsc file (.dsc)
  • diff file (.diff)

and will then automatically launch dpkg -x file.dsc in order to decompress the orig.tar.gz and apply the changes.

Useful Links