[原创整理]使用 pbuilder 来编译/backport Debian 软件包
http://www.linuxsir.org/bbs/thread320657.html


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

注:命令提示符采用 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 参数,后面再说了 Jump2.gif

另外, 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 包:

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

首先是建个目录来 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 就安装好了,没有的话请自行安装 :P
我们编译出来的版本要大于 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 <somebody@somewhere> 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 下载安装编译依赖再编译得花一阵子了,这段时间各位想干嘛干嘛吧 biggrin.gif ),编译出来的包会在 ~/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 ,因此不进行修改是不行的。至于怎么改就超出本文的范围了 :P
(3) 如果 backport 一系列软件是不能用 pbuilder 的。因为 pbuilder 总是会从 Debian 的 repository 来下载软件在 chroot 里使用,与你系统中的软件包无关。这种情况下大概只有老老实实 apt-get build-dep <package> ,再依次编译各个组建(当然,第一个还是可以用 pbuilder 的 :P )。

参考资料:
http://www.netfort.gr.jp/~dancer/sof...ilder-doc.html
man pbuilder
man pdebuild