Say you’ve an existing package like gitg
and you want to use the new version of gitg
or even apply your own patches. You could directly make install
but you will probably regret it as soon as you’ll want to upgrade/uninstall, and you want to create a better package than the one created by checkinstall. Apperantly, creating a deb
package for a new version of already packaged deb
isn’t complicated.
Getting Started
Start by pulling the sources for the already available package. I’ll by using gitg
as an example throughout this tutorial.
$ apt-get source gitg
This will create a folder according to the version of the package, something like gitg-0.2.4
. Extract the new version besides it and cd
into its directory. The next step is to copy the debian/
directory from the old source package the code you’ve just extracted.
$ cp -R ../gitg-0.2.4/debian/ .
Dependencies
There are some dependencies you’ll need:
$ sudo apt-get install devscripts
$ sudo apt-get install dpkg-dev
You’ll probably want to do:
$ sudo apt-get build-dep gitg
in order to make sure you’ve all the relevant build time dependencies.
Update debian/
Files
The next step is to update the files under the debian/
sub-directory.
$ DEBEMAIL="Guy Rutenberg <myemail@domain.com>" debchange --nmu
This will update the debian/changelog
and set the new version. --nmu
will create a new “non maintainer upload” version, meaning if the current version was 0.2.4-0ubuntu1
, it will change it to 0.2.4-0ubuntu1.1
. This will make sure that there won’t be any collision between your package and an official one. If you update to a new upstream version. It might be more suitable to use something like this:
$ debchange --newversion 0.2.5+20111211.git.20391c4
If necessary, update the Build-Depends
and Depends
sections of debian/control
.
Building the Package
If your building a package directly from version control and not part of an official release, you may need to run
$ ./autogen
at this point.
Now to the actual building:
$ debuild -us -uc -i -I -b
-us -uc
tells the script not to sign the .dsc
and .changes
files accordingly. -i
and -I
makes the script ignore common version control files. -b
tells debuild
to only create binary packages. You can also pass -j
followed by the number of simultaneous jobs you wish to allow (e.g. -j3
, like in make
) which an significantly speed things up.
Installing the Package
The package will reside in the parent directory, for example:
../gitg_0.2.5+20111211.git.20391c4_amd64.deb
At this point you’re basically done. If you want to install the package you can use
sudo debi
while you’re still inside the build directory.
Creating Source Packages
If you want to go the extra mile and create source packages, it will make things easier for others to build their own packages based on yours.
You’ll need to create a an “orig” tarball
../gitg_0.2.5+20111211.git.20391c4.orig.tar.bz2
(note the underscore between the package-name and the version). The “orig” tarball should contain the original source-code without the debian specific patches.
Now you can run the debuild
command like before but without the -b
flag.
This will create the following files:
../gitg_0.2.5+20111211.git.20391c4.debian.tar.gz
../gitg_0.2.5+20111211.git.20391c4.dsc
References
- UpdatingADeb
- Man pages for
debuild
,dpgk-genchanges
,dpgk-buildpackage
.
It’s worth mentioning that debchange is found in devscripts package.
Another handy script in devscripts is debcheckout.
@Orgad, you’re right. One has to
apt-get install devscripts
in order to follow the tutorial.To elaborate on what Tzafrir said,
debcheckout
is a tool that automatically checkout the code from maintainer’s version control. Thus, you can get the latestdebian/
files, and more recent code that what is available viaapt-get source
, but probably not as recent as the one you can get directly from the project’s version control.Thank you. This post helped me patch a bugged Xubuntu Xenial (16.04) bug involving xfsettingsd in the xfce4-settings package and install properly.
The only thing I would suggest is that you add a parameter after debchange –nmu
I was scratching my head for a good half hour until I realized I had to provide my own version number