发布时间:2022-08-09 文章分类:编程知识 投稿人:赵颖 字号: 默认 | | 超大 打印

QtApplication

Create Ubuntu DEB package from a Qt application

The following instructions describe how to create an Ubuntu .deb package from a Qt application.

Introduction

Programs written using the Qt framework are not configured by a configure-script, but by the qmake (qmake-qt4) program which is part of the Qt development tools. This program will (also) generate the Makefile.

This guide assumes there is no similar package in an Ubuntu repository available and you intend to build a new package from scratch using dpkg-buildpackage / pbuilder.

A detailed guide on .deb packaging can be found at the PackagingGuide. This guide will describe the packaging process just in a short summary.

Setting up the environment

1. Download the necessary tools via apt-get

sudo apt-get install build-essential devscripts ubuntu-dev-tools debhelper dh-make diff patch gnupg fakeroot lintian pbuilder

2. Pbuilder lets you build in a clean, chroot environment, ensuring all dependencies are present. Create a file .pbuilderrc

nano .pbuilderrc

and fill it with

COMPONENTS="main restricted universe multiverse"

Then construct the base environment (note: it can take a long time)

sudo pbuilder create

3. Get the sources of the desired application and untar them into a specific directory

tar -xvf helloworld-1.0.tar.gz

4. Preserve an .orig-archive ('-' between name and version becomes '_'!)

cp helloworld-1.0.tar.gz helloworld_1.0.orig.tar.gz

5. Descend into the created directory and execute dh_make. Answer to the questions dh_make will ask

cd helloworld-1.0
dh_make -e your@email.address

6. Descend into the 'debian'-directory and delete unneeded templates (unless you need them)

cd debian
rm *.ex *.EX

7. Edit the 'changelog', 'copyright' and 'control' files. For information how to do it, go to https://wiki.ubuntu.com/PackagingGuide/PackagingOverview Make sure that libqt4-dev and qt4-qmake is added to the Build-Depends list (assuming you're using Qt 4.x).

8. In the next step, you can use either plain Debhelper or CDBS to write your rules file.

8a. If you want Debhelper, replace the 'rules'-file with the one from /usr/share/doc/debhelper/examples/rules.arch and edit it according to your needs

#!/usr/bin/make -f
# Sample debian/rules that uses debhelper.
# This file is public domain software, originally written by Joey Hess.
#
# This version is for packages that are architecture dependent.
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
build: build-stamp
build-stamp:
        dh_testdir
        # Add here commands to compile the package.
        qmake-qt4 -config release
        make
        touch build-stamp
clean:
        dh_testdir
        dh_testroot
        rm -f build-stamp
        # Add here commands to clean up after the build process.
        #$(MAKE) clean
        #$(MAKE) distclean
        dh_clean
install: build
        dh_testdir
        dh_testroot
        dh_prep
        dh_installdirs
        # Add here commands to install the package into debian/<packagename>
        make INSTALL_ROOT=`pwd`/debian/package_name 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_installchangelogs
        dh_installdocs
        dh_installexamples
        dh_installman
        dh_link
        dh_strip
        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

Important: In line 38, change "package_name" into actual name of your package. If you have some custom commands, add it to line 16.

8b. CDBS (Common Debian Building System) provides a simpler method for writing the rules to build the package.

The use of this system requires that cdbs be added to the Build-Depends list in the control file (see step 7).

To use it, first install it with

sudo apt-get install cdbs

Then save the rules file with these contents

#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/qmake.mk

9. Add the following Lines to your .pro-file in the parent directory

TARGET = <application>
target.path = /usr/bin
INSTALLS += target

optional: add supplementary files to the installation

data.path = /usr/share/<application>/data
data.files = data/*
INSTALLS += data

A comprehensive guide that shows the possibilities of QMake, e.g. whether a certain file already exists on the target system, can be found at http://doc.qt.nokia.com/latest/qmake-manual.html

Building the package

10. Now you can either build the package locally or - if you prepared the pbuilder earlier - in a base environment.

10a. Building locally can be achieved with

debuild

It produces the DEB package in the directory above.

Note: If you don't have GPG key to sign the package, add parameters

debuild -uc -us

10b. To build with pbuilder, prepare .dsc file

debuild -S

Run pbuilder itself

sudo pbuilder build ../*.dsc

The DEB package goes to /var/cache/pbuilder/result/.

Note: Using pbuilder takes more time than building locally, but guarantees your package and its dependencies will be installed properly on any machine using Ubuntu. If you don't know if your prepared the sources properly, a common practice is to firstly build the package locally with debuild. If something goes wrong, you can speed up recompilation with parameters -nc. In the end, build the package again in pbuilder to make sure everything works.