Skip to main content

Pbuilder build package

前言

Pbuilder 是常用的编译 deb 包的工具

优点: 环境干净,本质是chroot,与宿主机隔离;

缺点: 非常依赖仓库,如果没有仓库武功自费一半。

需要:

  1. 仓库

  2. 一台相同架构的机器

Pbuilder 安装及配置

使用apt 包管理器安装Pbuilder

sudo apt update
sudo apt -y install pbuilder

修改Pbuilder 配置文件

假如我们使用的仓库为Deepin 社区仓库,在sources.list 应该是这个样子:

deb https://community-packages.deepin.com/deepin apricot main contrib non-free
sudo vim /etc/pbuilderrc
MIRRORSITE=https://community-packages.deepin.com/deepin
DEBOOTSTRAPOPTS=(
	"--no-check-gpg"
	"--variant=buildd"
	"--include=deepin-keyring,git,ssh,vim,pbuilder,devscripts,perl-openssl-defaults,ssh,sudo"
)

MIRRORSITE:仓库地址

这里填写的是 Deepin 社区仓库的地址 https://community-packages.deepin.com/deepin

DEBOOTSTRAPOPTS: debootstrap 的参数。debootstrap 是拉取干净的文件系统(chroot)的工具

  1. "--no-check-gpg" 用于跳过 gpg 签名检查。一般用于仓库没有签名时,Deepin 社区仓库是有签名的,所以加不加都可以。
  2. "--variant=buildd" variant 后加预设的软件包,参数还可以设为–variant=minbase|buildd|fakechrootminbase 只安装必须的包和apt, buildd 是指的 build-essential 之类编译相关的包, fakechroot 会使用非root 用户来安装包
  3. "--include=" 指定额外预装的包

创建一个Pbuilder tgz

Pbuilder 使用debootstrap 拉取chroot 环境后,会将chroot 目录压缩成 tgz 文件

sudo pbuilder --create --distribution apricot --basetgz apricot.tgz

--distribution apricot apricot 是Deepin 社区仓库的codename

需要在 /usr/share/debootstrap/scripts/ 下存在相同文件名的文件,如 /usr/share/debootstrap/scripts/apricot,如果没有需要手动复制过去。

sudo install -Dvm644 /usr/share/debootstrap/scripts/buster /usr/share/debootstrap/scripts/apricot

每个仓库所有的 codename 我们都可以在仓库下的dists 目录中看到

https://community-packages.deepin.com/deepin/dists/

--basetgz apricot.tgz --basetgz 后指定保存的文件名

使用

进入Pbuilder tgz

使用 --login --basetgz 文件名的形式进入

sudo pbuilder --login --basetgz apricot.tgz

编辑仓库源

sudo vim /etc/apt/sources.list

deb https://community-packages.deepin.com/deepin apricot main contrib non-free
deb-src https://community-packages.deepin.com/deepin apricot main contrib non-free

编辑完后 sudo apt update 一下

拉取源码

  1. git仓库: 通过git 拉取
  2. apt仓库: 使用apt policy 包名 查看包版本号,apt source 源码包名=版本号 拉取源码

编译

在pbuilder tgz环境中 apt install pbuilder devscripts sudo 后,可以在代码目录使用 V=s debuild-pbuilder -us -uc 编译

V=s 会显示更多日志

debuilddpkg-buildpackage 的封装,debuild-pbuilder 可以用 pbuilder 的自动解析依赖的功能, -us 是不签名deb 包, -uc 是不签名 changes 文件

编译后deb 包会在上层目录

将deb包拿出来

在上层目录将deb 包打个压缩包, tar cvf debs.tar.gz *.deb, 然后把压缩包传出来,可以用python3 -m http.server 开一个8000 端口的 http

Questions & Answers

Q: 想要更多参考资料?

A: Diaspora_Packaging_pbuilder - Debian Wiki

Q: 这个环境是持久化的吗?

A: 默认Ctrl-D 退出后就销毁的,如果想要持久化,--login --basetgz sp2.tgz 后加 --save-after-login

Q: 这样打出来有版本号依赖问题怎么办?

A: 如果安装有版本号依赖问题, 可以手改依赖版本 (修改的前提是对接口变动有信心,后果自负)

  1. Step1 解包: dpkg-deb -R dde-daemon_5.13.97-1_amd64.deb dde-daemon
  2. Step2 修改依赖版本号: 修改 dde-daemon/DEBAIN/control 文件中的Depends 字段
  3. Step3 再压回去: 再用dpkg-deb -b dde-daemon dde-daemon_5.13.97-1_amd64.deb