一、安装打包需要的工具
apt-get install dh-make debhelper devscripts cdbs build-essential fakeroot python2.5-dev
在对Python源代码进行打包的时候,需要用于打包的专用命令,例如创建文件模板、加入man文件、生成Debian包使用的md5sum文件、将所有的文件整合成“*.deb”文件等,debhelper库的安装提供了一系列小工具来完成这些任务。
dh-make是一个方便对源代码进行Debian化的工具,主要体现在根据当前的Debian系统为我们自动生成一系列格式化的build files,省去我们手动创建的功夫。
Debian包本身的所有者是root,同时也需要root权限来安装的,为了使非root权限的开发者也能够创建Debian包,fakeroot命令使在创建文件的时候让非root用户获取到root的权限,仅仅在创建文件的时候。
传统的makefile文件是需要自己写一系列的命令来完成打包的过程,包括检查权限、调用打包命令等等,为了减轻打包的工作,使用cdbs(Common Debian Build System)为开发人员处理打包的细节和检查相关的配置。
python2.5-dev的加入是为了能够编译Python源代码中的extensions,可以根据当前系统的python版本(如X.Y)来下载相应的pythonX.Y-dev包。
安装devscripts可以获得许多的辅助性工具,有利于提高制作Debian包的效率。比如使用dch命令来编辑changelog文件、使用debclean清除包创建过程中生成的各种临时文件等等。
创建Debian软件包的环境主要在Debian操作系统上。
二、创建相关文件
通过dpkg –info <package>可以查看到关于这个<package>的相关信息,比如版本号、依赖包、支持的Python版本、描述信息等等,这些信息并非在包的制作过程中由命令自动识别并生成的(还没有这么智能),除了这些信息外,还有更新日志,Makefile等文件,这些文件的信息都需要人为的输入。
在创建这些文件之前,先理清一下目录结构。先把python的项目处理成可安装的目录(假如我要打包的项目是myproject-0.1.14),打目录打包成tar.gz格式,并重命名为myproject_0.1.14.orig.tar.gz(制作包的工具会自动地用Debian化后的文件与orig.tar.gz文件进行对比,将对比的结果用于生成diff.gz文件)。
----mydir
----myproject-0.1.14/
----change.log
----docs/
----sample_proj/
----setup.py
----src/
----myproject_0.1.14.orig.tar.gz
在创建相关文件之前,文件目录大概如上。然后进入myproject-0.1.14/目录,这里我们使用dh_make命令生成一个打包用到的文件模板,我们直接在这些模板文件的基础上进行修改。在调用之前,先设置两个dh_make需要用到的环境变量:
export DEBFULLNAME="Your Name" export DEBEMAIL="Your.Email@address.com"
设置好之后,使用dh_make命令来生成文件模板:
dh_make -c gpl -s -b
其中,要先说明的是我们要制作的Deian软件包是基于GPL license(-c gpl,copyright文件会体现),并且我们只需要从当前的源代码中生成一个二进制包(-s),同时,为了使制作Debian化的过程更简单,我们使用cdbs(-b, Common Debian Build System)。
调用dh_make命令要注意的一点是,是必须在myproject-0.1.14/目录下执行,即必须包括源代码的目录下执行,并且源代码的目录命名必须为<packagename>-<version>。
成功调用了dh_make命令后,在myproject-0.1.14/目录下会多了一个debian的目录,在debian/目录下,我们目前只需要要保留changelog, compat, control, copyright, rules这5个文件,其他的可以删除掉,关于这些文件的可参考这里。
debian/changelog
myproject (0.1.14-1) unstable; urgency=low * Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP> -- myname <myemail@address.com> Thu, 16 Jul 2009 01:20:48 +0800
这个文件是一个关于更新日志的记录,描述了在新版本中Debian化和源代码上与旧版本的不同之处,生成Debian软件包之后主要体现在”*.changes”文件中。可以使用debchange编辑或者直接手动编辑,如果是手动编辑,要注意缩进是否正确(在*之前要注意有两个空格,在签名和日期之前还有一个空格)。
可以将第一行中的”unstable”改写成当前制作的包可用的Debian系统(如lenny, etch, stable…)。如果是官方的Debian包的话,在”Initial release”后面要写上这个版本所fix的一些bug的number。详见的细节,可参考这里。
debian/compat
compat文件必须只包括一行,这一行指出这个包使用debhelper的兼容级别,一般是当前系统安装的debhelper的版本,使用dpkg -p debhelper | grep Version可以看到版本号。通过dh_make命令生成的compat文件已经是有内容的。关于debhelper,可以参考这里。
debian/control
control文件包含这个包的相当多的重要信息,包括Section, Maintainer, Homepage, Stardards-Version, Architecture, Description等等。这些信息可以通过dpkg –info <packagename>来获取,同时在成功安装后会被存储在/var/lib/dpkg/status文件中。具体的control信息可参考这里和这里。
对相应的属性进行修改如下:
Source: myproject
Section: python
Priority: optional
Maintainer: Stephen Chan<stephenchan@endlesscode.com>
Build-Depends: cdbs (>= 0.4.49), debhelper (>= 7), python-support (>= 0.6)
XS-Python-Version: >=2.5, <<3.0
Standards-Version: 3.8.0
Homepage: http://www.endlesscode.com/myproject/
Package: myproject
Architecture: i386
XB-Python-Version: 2.5, 2.6
Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python-jinja2, python-simplejson, python-mysqldb, python-m2crypto
Replaces: myproject-0.1.13, myproject-0.1.12
Description: help you build web application in an easy and lazy way(this is a short description, must not exceed a single line)
Here you should put a long description about your package. This line *MUST*
begin with a single space.
Look for more information about this:
http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description
其中关于XS-Python-Version和XB-Python-Version是专门用于Python源代码的打包信息。XS-Python-Version说明当前的Debian源代码包所支持的Python版本,用于在系统的Python版本变化时跟踪软件包,以及用于某些软件包的脚本中自动生成合适的Depends和Provides。XS-Python-Version属性中的值可以是下面格式中的一种:
XS-Python-Version: all XS-Python-Version: current XS-Python-Version: current, >= X.Y XS-Python-Version: >= X.Y XS-Python-Version: >= A.B, << X.Y XS-Python-Version: A.B, X.Y
其中”all”表示当前的Debian软件包支持所有的Python可用版本,”current”表示支持当前Debian系统默认的Python版本。显示指定版本或者是指定支持版本的范围也是被允许的。
对于XB-Python-Version(生成的二进制软件包支持的Python版本),当要生成Debian软件包的Python源代码中没有extensions时,此项可直接表示为XB-Python-Version: ${python:Versions},python:Versions会自动被赋予和XS-Python-Version一样的值。当源代码中有extensions时(myproject中有),但必须显示列出支持的Python版本。
debian/copyright
copyright的信息与普通的copyright信息一样,在这里添加上作者和Email就可以了,相关信息可参考这里。由于信息太多,这里只截取”License”节前的内容。
This package was debianized by: Stephen Chan <stephenchan@endlesscode.com> on Wed, 17 Jun 2009 16:30:35 +0800 It was downloaded from: <http://www.endlesscode.com/myproject/> Upstream Author(s): Stephen Chan<stephenchan@endlesscode.com> Copyright: <Copyright (C) 2008-2009 EndlessCode>
debian/rules
rules文件就是用于生成Debian软件包的Makefile文件,这个文件必须是能够执行的,如果是手动创建这个文件,要注意将文件设置为可执行文件。
将文件修改成:
#!/usr/bin/make -f DEB_PYTHON_SYSTEM=pysupport include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/python-distutils.mk
在这个Makefile文件中,使用了CDBS来创建的模板会自动调用python-distutils.mk需要的debhelper相关工具函数(dh_*)来生成Debian软件包。在DEB_PYTHON_SYSTEM的值中除了pysupport,还可以赋值pycentral,这是两个用于打包python源代码的不同工具系统。我们可以在rules文件中改变一样默认的安装参数,比如改变默认的生成脚本名字(默认是”setup.py”)、改变Python默认的安装目录等等,详见可参考这里。
三、生成Debian包
当完成了所有的Debian化的信息更改之后,就可以生成Debian软件包了。在与debian/同个目录下(此为myproject-0.1.14/)调用下面命令:
dpkg-buildpackage -us -uc -rfakeroot
在调用dpkg-buildpackage来创建Debian软件包时,我们需要指出当前的软件包不需要将签名内嵌到Debian软件包中(-us),也不需要对生成的changes文件进行签名(-uc),同时也要说明当需要获取root的权限来创建文件时要调用的获取root权限的工具(-rfakeroot)。
在成功调用了dpkg-buildpackage命令后,会生成有4个文件:*.diff.gz, *.dsc, *.changes, *.deb。目录结构如下:
----mydir
----myproject-0.1.14/
----change.log
----docs/
----sample_proj/
----setup.py
----src/
----myproject_0.1.14.orig.tar.gz
----myproject_0.1.14-1.diff.gz
----myproject_0.1.14-1_i386.deb
----myproject_0.1.14-1.dsc
----myproject_0.1.14-1_i386.changes
myproject_0.1.14-1.diff.gz的内容主要是Debian化的改变的内容,也就是上面所添加的debian/目录下面的5个文件的内容。
myproject_0.1.14-1.dsc就是Debian软件包的相关信息,与control文件的内容一致。
myproject_0.1.14-1_i386.changes主要就是在debian/changelog中所添加的一些版本改变的信息。
myproject_0.1.14-1_i386.deb就是我们所生成的Debian软件包了。
四、参考
a) Debian Python Policy
http://www.debian.org/doc/packaging-manuals/python-policy/index.html#contents
b) Debian Policy Manual
http://www.debian.org/doc/debian-policy/index.html#contents
c) Debian New Maintainer’s Guide
http://www.debian.org/doc/manuals/maint-guide/
d) Debian packaging with CDBS
http://debathena.mit.edu/packaging/
e) CDBS Documentation
http://cdbs-doc.duckcorp.org/en/cdbs-doc.xhtml
f) Creating a .deb package from a python setup.py
http://ghantoos.org/2008/10/19/creating-a-deb-package-from-a-python-setuppy/