Pbuilder build package
前言
Pbuilder 是常用的编译 deb 包的工具
优点: 环境干净,本质是chroot,与宿主机隔离;
缺点: 非常依赖仓库,如果没有仓库武功自费一半。
需要:
-
仓库
-
一台相同架构的机器
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)的工具
"--no-check-gpg"
用于跳过 gpg 签名检查。一般用于仓库没有签名时,Deepin 社区仓库是有签名的,所以加不加都可以。"--variant=buildd"
variant 后加预设的软件包,参数还可以设为–variant=minbase
|buildd
|fakechroot
。minbase
只安装必须的包和apt,buildd
是指的 build-essential 之类编译相关的包,fakechroot
会使用非root 用户来安装包"--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
一下
拉取源码
- git仓库: 通过git 拉取
- apt仓库: 使用apt policy 包名 查看包版本号,apt source 源码包名=版本号 拉取源码
编译
在pbuilder tgz环境中 apt install pbuilder devscripts sudo
后,可以在代码目录使用 V=s debuild-pbuilder -us -uc
编译
V=s
会显示更多日志
debuild
是 dpkg-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: 如果安装有版本号依赖问题, 可以手改依赖版本 (修改的前提是对接口变动有信心,后果自负)
- Step1 解包: dpkg-deb -R dde-daemon_5.13.97-1_amd64.deb dde-daemon
- Step2 修改依赖版本号: 修改 dde-daemon/DEBAIN/control 文件中的Depends 字段
- Step3 再压回去: 再用dpkg-deb -b dde-daemon dde-daemon_5.13.97-1_amd64.deb