红联Linux门户
Linux帮助
当前位置: 红联Linux门户 > Debian

使用pbuilder来编译/backport Debian软件包

发布时间:2008-09-19 21:40:38来源:红联作者:Dnirta
原作者:manphiz
出自:LinuxSir.Org

pbuilder 可以通过创建 chroot 环境来自动安装编译依赖并编译 Debian 软件包(以免自己 apt-get build-dep 下载一大堆东西又忘了该删除哪些。它可以指定 chroot 环境的版本(stable, testing, unstable),因此它也可以用来 backport 软件包到 stable 或 testing ,不过前提是编译依赖要满足。另外,此软件是由日本人开发的,怀着对福田康夫能改善中日关系的期待,暂时解除抵制日货的心里底线。

注:命令提示符采用 bash 风格, # 表示需要 root 权限, $ 就是不需要。

1、安装

Debian 包安装没什么可说的:

# apt-get install pbuilder

当然 aptitude, synaptic 都行,看个人习惯。建议安装其 recommends 的包。

值得注意的是目前的 cdebootstrap 有问题,大家要暂时使用 debootstrap 。

2、配置

全局配置文件在 /etc/pbuilderrc ,里面有各项参数的详细说明。个人的配置自然是编辑 ~/.pbuilderrc 。以我目前的为例:

MIRRORSITE=http://http.us.debian.org/debian # 镜像,可选 geekbone 或 cn99 。
APTCACHE="/var/cache/apt/archives" # 下载的 deb 文件缓存位置。让其和系统共用一个缓存,可以节省空间。
DEBOOTSTRAP="debootstrap" # 说过 cdebootstrap 暂时不能用啦,默认又用的是 cdebootstrap ,只好在这里改掉啦

注意,一定要注意:这些选项仅仅在创建 pbuilder 的 chroot 环境时有用,创建完成后, pbuilder 就会使用 chroot 环境里的设置。也就是说这些配置就没用了。

“那怎么改呢?” 有个 --override-config 参数,后面再说了 :)

另外, pbuilder 需要 root 权限(chroot 需要),但并不修改系统,因此配置 sudo 来运行 pbuilder 比较方便。

3、创建环境:

配置好后,可以用 create 参数来创建 chroot 环境。最简单的命令是

# pbuilder create

但请先不要着急执行。 pbuilder 默认创建的是 sid 环境,并且创建的 chroot 环境会作为 base.tgz 存储在 /var/cache/pbuilder/ 。这些设置可以通过参数来修改:

--basetgz [base.tgz location]
--distribution [distribution(sid|etch|lenny|experimental)]
详细的参数请参考 pbuilder --help 。

比如如果要创建 etch 环境:

# pbuilder create --distribution etch

创建 chroot 是一个漫长的过程。

4、更新 pbuilder chroot 环境:

sid 升级是很频繁的,如果不升级 chroot 环境,某些旧的包可能就会从 repository 里删除,导致编译依赖安装失败。升级是很容易的。

# pbuilder --update

各大镜像时不时会挂掉,这可是很郁闷的事儿。而且修改 ~/.pbuilderrc 已经没有用了。这时候就需要使用 --override-config 参数啦~ 比如 us 镜像挂掉了,但是 geekbone 还是好的:

# pbuilder update --override-config --mirror http://mirrors.geekbone.org/debian

实际上 --override-config 后面可以接各种参数,比如 --aptcache, --debootstrap 。具体的请参见 pbuilder --help 。

5、编译 Debian 包:

终于开始干正事儿了,我这里以编译打上 MSN 群补丁的 pidgin 为例

首先是建个目录来 apt-get source pidgin:

$ mkdir ~/pidgin-build && cd ~/pidgin-build
$ apt-get source pidgin

这样会下载下来 pidgin 的 Debian 源码包(包含原始档案 *.orig.tar.gz 和 Debian 的配置部分 *.diff.gz 和 *.dsc 文件)并解压。

接着下载下来本帖附件中的 MSN 群补丁(目前适用于 2.3.x )并解压:

$ gunzip 99_msn_group.patch.gz

之后把这个补丁放到 pidgin 的 debian/patches 目录下:

$ mv 99_msn_group.patch pidgin-2.3.1/debian/patches

接下来我们要修改 Debian 的 changelog ,因为编译出来的软件包的版本就是 changelog 的版本。这一步需要 devscripts ,安装 pbuilder 的时候如果选择安装 recommends 就安装好了,没有的话请自行安装。

我们编译出来的版本要大于 Debian 的版本,否则更新的时候会被要求重新下载。目前 pidgin 的版本是 2.3.1-2 ,那我们就起名为 2.3.1-2msngroup:

$ cd pidgin-2.3.1/debian
$ dch -v 2.3.1-2msngroup

之后会出现类似这样的几行:

pidgin (2.3.1-2msngroup) unstable; urgency=low

*

-- somebody Mon, 17 Dec 2007 10:49:57 +0800

在星号后面随便填些什么就可以了,比如 Add msn group member name display patch. 然后保存退出。

下面就可以编译啦。 pbuilder 默认会把编译的结果放到 /var/cache/pbuilder/result 下,不过我们可以通过 --buildresult 来指定编译完成的包的位置。退到源码目录那一层,也就是 pidgin-2.3.1 下,执行:

$ cd .. # 或者 cd ~/pidgin-build/pidgin-2.3.1 或者 cd $(你自己创建的 pidgin-build 目录)/pidgin-2.3.1
# pdebuild --buildresult ..

然后等这它编译完成(chroot 下载安装编译依赖再编译得花一阵子了,这段时间各位想干嘛干嘛吧,编译出来的包会在 ~/pidgin-build 目录中(或者你自己选定的目录)。接下来用 dpkg -i 安装需要的部分就可以啦

这时候各位可以发现,由于编译是在 chroot 里完成的,宿主系统没有任何的修改,只是增加了编译时需要的 deb 包的缓存,想必应该比 apt-get build-dep 干净多了

方法就是这样,怎么用就要靠各位发挥想象力啦

6、几点建议:

(1) 编译前一定要先 pbuilder --update ,否则可能会无法安装依赖喔

(2) 在 backport 的时候失败是很正常的,因为新软件可能会依赖更高版本的组件。比如 stardict 需要 debhelper >=5.0.51 ,而 etch 只有 5.0.42 ,因此不进行修改是不行的。至于怎么改就超出本文的范围了

(3) 如果 backport 一系列软件是不能用 pbuilder 的。因为 pbuilder 总是会从 Debian 的 repository 来下载软件在 chroot 里使用,与你系统中的软件包无关。这种情况下大概只有老老实实 apt-get build-dep ,再依次编译各个组建(当然,第一个还是可以用 pbuilder 的 )。
文章评论

共有 0 条评论