omxd Debian package
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.
Init Scripts
Originally 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…
Automated Releases
I copied the make tag
rule from szg, which creates releases, where the tag message is a commit list in Debian changelog format.
$(DESTDIR)
In your Makefile, use the $(DESTDIR)
prefix whereever you install something.
cp omxd $(DESTDIR)/usr/bin
debian/omxd.dirs
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
force-reload
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
Having 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 prerm
and preinst
scripts too with
service omxd stop
Idempotency
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 preinst
:
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 debian/postinst
script.
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.
make utag
During packaging I had to undo release commits and tags countless times. I even automated it with make utag
.
Conclusion
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/ /
The install
apt-get update apt-get install omxd
I’m also accepting donations for my post-traumatic stress disorder treatment on my PayPal account.