Python项目生成Debian包小记

一、安装打包需要的工具

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-VersionXB-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/

This entry was posted in Unix/Linux. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>