I’m through my most swearword-intensive development ever: creating a Debian package from the omxd Raspberry Pi media-player daemon. Debian developers take note: if strange freak-accidents happen to you and your families, it’s my fault. I’m currently being treated with post-traumatic stress disorder and want to forget the whole experience.
Except, I decided to write down the most interesting stations of my journey through the Valley of the Shadow of De… Debian. Documentation is available but hard to find, as most Google hits are about using deb packages, not creating them.
If you are an experienced Debian developer and find that I’m a noob, an idiot and a luser, you’re right. But then, why does Linus Torvalds refuse to provide SubSurface binaries for Linux? Exactly. Because he did not let his brain rot by thinking that creating deb or rpm packages is something sane. And no, the problem is not fragmentation. Once you’ve created you deb package, alien will turn it into and rpm in no time. It’s creating the deb that’s so difficult.
make install just inserted an omxd call into
/etc/rc.local and started omxd. But better don’t mess with existing files, so I changed it to create
/etc/init.d/omxd with start/stop/restart verbs and registered it for auto-start by
update-rc.d omxd defaults
and finally doing a
service omxd start
How naive I was…
I copied the
make tag rule from szg, which creates releases, where the tag message is a commit list in Debian changelog format.
In your Makefile, use the
$(DESTDIR) prefix whereever you install something.
cp omxd $(DESTDIR)/usr/bin
I did not remember this, but this file is needed with a list of directories you install files into. Note the lack of leading slash:
usr/bin usr/share/man/man1 usr/share/doc/omxd etc/init.d
Lintian throws an error that you need a
force-reload verb in your init script. So I gave in.
Auto start/restart/stop omxd – The Real Troubles Begin
make install starting and registering your daemon does not help.
dpkg-buildpackage just uses this rule to collect the installed files. Later when the deb is installed, it’s not run. You need a
debian/postinst maintainer script to do a
service omxd start
But during upgrades you need to stop it first, so add
preinst scripts too with
service omxd stop
But a reinstall/upgrade will fail if your init script returns an error when attempting starting an already started daemon or stopping an already stopped one or trying to do anything with a non-existing one. So make sure they are idempotent: running them repeatedly has no effect at all, not even an error. In case of
service omxd stop || true
Also make sure the init scripts start/stop verbs don’t fail for these cases.
debian/conffiles, Bloody conffiles
dpkg-buildpackage considers anything you install into the
/etc directory a configuration file and adds them automatically to the
debian/conffiles file. Result: if you develop something using
make install/uninstall, then install the deb package again,
dpkg will refuse to install the those files, because their lack is a modification by the sysadmin. Unbelievable but true. And there is no obvious workaround, either. All you can do, and this is confirmed by the Debian docs, is to create anything in
/etc by the
There are no words for the idiocy of the Debian
conffiles policy. How often have you been prompted by Ubuntu/Debian package upgrades about mysterious config file changes you’ve never ever touched? It’s all because it’s so difficult to get it right.
And why is anything in
/etc added to
conffiles with no possibility to override? Sure,
/etc/init.d/omxd is a config file. But it’s the init system’s config file, not mine!
And Finally, lintian
I used lintian. Did it complain about the lacking
debian/omxd.dirs file? No. Did it warn me about the auto-start idempotency problems? No. Did it complain about a completely useless
force-reload initscript verb? Yes. Did it complain about the lack of all the useless and paranoid GCC warning options in my makefile? Yes. And finally did it throw an error upon the only existing workaround for the conffile-hell? Yes.
Lintian is a useless piece of shite. I threw it out.
During packaging I had to undo release commits and tags countless times. I even automated it with
The Debian packages for omxd and the latest stable omxplayer are available in my repo. Just add it to your software sources by adding the file
/etc/apt/sources.list.d/subogero.list containing this:
deb http://linux.subogero.com/deb/ /
apt-get update apt-get install omxd
I’m also accepting donations for my post-traumatic stress disorder treatment on my PayPal account.