If you’ve been following this blog or the Praxis code site for the last couple of months, you might be forgiven for thinking that not a lot had been happening. Actually that’s far from the case. I’ve been busy with a number of projects, one of which has seen some major additions to the Praxis code, and I’m now in the process of tidying that up for a new release. Some of the audio code has also been extracted and pushed to a separate repository (https://github.com/jaudiolibs/) of which more soon … but I digress. One thing that changed with the last Praxis LIVE release is that by default the Linux download is a .deb (Debian binary package) file, and I’ve been meaning to write up a how-to (for my benefit as much as yours!) since. So, here goes.
Grasping for control
To be clear before we start, this is a simple way to package a NetBeans platform application (or any Java application) to be installed as a .deb. I was having issues with using the default Linux installer from the NetBeans platform, particularly since moving to Ubuntu 12.04, and wanted a better way to integrate the install into the system. This is
probably definitely not a guide to best practice in packaging .debs, not least because I wanted to keep the general structure of the code (also including Windows binaries for the build harness) intact. Oh, and you’ll have to be doing this on Linux with access to the dpkg tools!
So, firstly you need to create a directory within which to structure your package. This directory should be named according to the Debian package name conventions –
<PackageName>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>. As we’re packaging a Java program (even though it contains some native binaries) we can use architecture All. For Praxis LIVE build:121231 this translated as
I decided to have all the code of Praxis LIVE itself installed within
/usr/lib/praxis-live, so I created this directory within my package directory and extracted the entire contents of the ZIP build of Praxis LIVE into it. Alongside this, I created symlinks in the
/usr/bin directory to point to the launchers in
/usr/lib/praxis-live/bin (Praxis LIVE has two launchers, one for GUI use and one for CLI use). These should be created as absolute links to where your files will be, ie. using
ln -s /usr/lib/praxis-live/bin/praxis praxis – they’ll show up as broken links if you’ve not installed your application yet! I’ll come on to the
/usr/share directory in a moment.
Finally, and most importantly, you need to create the
DEBIAN directory. This directory won’t show up in your final installation – it contains the files that control how your .deb is built. The only file necessary in here is called
control and is a plain text file containing various properties. The contents of the Praxis LIVE control file are as follows.
Package: praxis-live Version: 121231-1 Architecture: all Maintainer: Neil C Smith Installed-Size: 46000 Depends: openjdk-6-jre | openjdk-7-jre | java6-jre Priority: optional Homepage: http://praxis.googlecode.com Description: Open-source, graphical environment for rapid development of intermedia performance tools, projections and interactive spaces. Praxis is a Java-based modular framework for live creative play with video, images, audio, and other media.
Architecture properties should match those you used for your directory naming earlier. The
Depends line lists packages that we rely on – here this just requires one of the specified JRE packages.
Priority should almost certainly be optional (user installed software). The rest should be fairly self-explanatory – the description can go onto multiple line, with subsequent lines indented.
Can you share some more?
The most important file is the .desktop file in
/usr/share/applications This will install your application in the menu when your .deb is installed. The contents of the Praxis LIVE .desktop file are
[Desktop Entry] Name=Praxis LIVE Comment=Praxis LIVE Exec=/usr/bin/praxis_live Icon=praxis.png Categories=Development;Java; Terminal=false Type=Application
Again this should be fairly explanatory. The
Icon property just needs the file name and will search for the correct icons under the
icons directory as shown. The
Exec property points to the actual command that will be run when your desktop item is selected in the menu or elsewhere.
The file at
/usr/share/doc/<package>/copyright is just a plain text file with copyright information.
The slightly more cryptic file at
/usr/share/lintian/overrides/<package> actually controls how the package is checked during the build process, and stop it complaining about certain things we’re doing that are not following Debian packaging guidelines to the letter (such as including native binaries in an architecture all package). The current Praxis LIVE override file contains the following four items
praxis-live: arch-independent-package-contains-binary-or-object praxis-live: missing-dependency-on-libc praxis-live: debian-changelog-file-missing praxis-live: extended-description-is-empty
Let’s fake it and finish
And finally, we need to build a .deb file out of our directory. For this you’ll need to ensure you have the
fakeroot commands available.
dpkg-deb does the actual building. However, if you look at the ownership of the files in your directory you’ll notice that they’re owned by your user account and not by root (as with other installed applications). The
fakeroot command ensures the files in the .deb are now correctly owned by root.
To build your .deb, open a terminal in the parent directory of your package build directory, and execute the following command (inserting your directory name! 🙂 )
fakeroot dpkg-deb -b <your-package-directory>
All being well you should end up with a nice, installable .deb file next to your directory. It’s probably a good idea to open it in an archive manager and check it’s as expected before testing installation!
Keep hold of your package directory. You can copy & paste it to create your next .deb. Just change the version number in the directory name and control file, and replace everything in
Some light .deb-time reading