Packaging a Qt application

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 source directory to Package-Version (for example myapp-0.1 for an application ‘myapp’ with a version of ‘0.1’)
  • Create a ‘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

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