Packaging a java library for Debian as an upstream
Tuesday, August 17th, 2010I have just finished my GSoC project working on GNU Prolog for Java which is a Java library for doing Prolog. I got as far as the beta release of version 0.2.5. One of the things I want to do for the final release is to integrate the making of .deb files to distribute the binary, source and documentation into the ant build system. This post exists to chronicle how I go about doing that.
First some background reading: There is a page on the debian wiki on Java Packaging. You will want to install javahelper as well as debain-policy and debhelper. You will then have the javahelper documentation in /usr/share/doc/javahelper/. The debian policy on java will probably also be useful.
Now most debian packages will be created by people working for debian using the releases made by upstreams but I want to be a good upstream and do it myself.
So I ran:
jh_makepkg --package=gnuprologjava --maintainer="Daniel Thomas" \ --email="drt24-debian@srcf.ucam.org" --upstream="0.2.5" --library --ant --default
I then reported a bug in jh_makepkg where it fails to support the --default and --email options properly because I got “Invalid option: default”. Which might be fixed by the time you read this.
So I ran:
jh_makepkg --package=gnuprologjava --maintainer="Daniel Thomas" \ --email="drt24-debian@srcf.ucam.org" --upstream="0.2.5" --library --ant
And selected ‘default’ when prompted by pressing F.
I got:
dch warning: Recognised distributions are: {dapper,hardy,intrepid,jaunty,karmic,lucid,maverick}{,-updates,-security,-proposed,-backports} and UNRELEASED. Using your request anyway. dch: Did you see that warning? Press RETURN to continue...
Which I think stems from the fact that javahelper is assuming debian but javahelper uses debhelper or similar which Ubuntu has configured for Ubuntu. However this doesn’t matter to me as I am trying to make a .deb for Debian (as it will then end up in Ubuntu and many other places – push everything as far upstream as possible).
Now because of the previously mentioned bug the --email option is not correctly handled so we need to fix changelog, control and copyright in the created debian folder to use the correct email address rather than user@host in the case of changelog and NAME in the case of control and copyright (two places in copyright).
copyright needs updating to have Upstream Author, Copyright list and licence statement and homepage.
For licence statement I used:
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA On Debian systems the full text of the GNU Library Public License, can be found in the file /usr/share/common-licenses/LGPL-3.
control needs updating to add homepage, Short Description and Long Description (which needs to be indented with one space). I also added texinfo and libgetopt-java to Build-Depends and Suggests: libgetopt-java.
GNU Prolog for Java has a build dependency on gnu.getopt as gnu.prolog.test.GoalRunner uses it so I added
export CLASSPATH=/usr/share/java/gnu-getopt.jar to debian/rules. libgnuprologjava-java.javadoc needed build/api put in it so that it could find the javadoc.
So at this point I have a debian folder with the right files in it but I don’t have an ant task which will do everything neatly. Since debian package building really wants to happen on an unpacked release tarball of the source I modified my existing dist-src target to copy the debian folder across as well and added the following to my init target:
<!-- Key id to use for signing the .deb files --> <property name="dist.keyid" value="" /> <property name="dist.name-version" value="${ant.project.name}-${version}"/> <property name="dist.debdir" value="dist/${dist.name-version}/" />
I could then add the following dist-deb target to do all the work.
<target name="dist-deb" depends="dist-src" description="Produce a .deb to install with"> <mkdir dir="${dist.debdir}"/> <unzip src="dist/${dist.name-version}-src.zip" dest="${dist.debdir}"/> <!-- Delete the getopt code as we want to use the libgetopt-java package for that --> <delete dir="${dist.debdir}src/gnu/getopt"/> <exec executable="dpkg-buildpackage" dir="${dist.debdir}"> <arg value="-k${dist.keyid}"/> </exec> </target>
So this gives me binary and source files for distribution and includes the javadoc documentation but lacks the manual.
To fix that I added libgnuprologjava-java.docs containing
build/manual/ docs/readme.txt
, libgnuprologjava-java.info containing build/gnuprologjava.info and libgnuprologjava-java.doc-base.manual containing:
Document: libgnuprologjava-java-manual Title: Manual for libgnuprologjava-java Author: Daniel Thomas Abstract: This the Manual for libgnuprologjava-java Section: Programming Format: HTML Index: /usr/share/doc/libgnuprologjava-java/manual Files: /usr/share/doc/libgnuprologjava-java/manual/*.html
Now all of this might result in the creation of the relevant files needed to get GNU Prolog for Java into Debian but then again it might not :-). The .deb file does install (and uninstall) correctly on my machine but I might have violated some debian-policy.