【小白课程】一文教你调试OKBS编译错误
OKBS(openKylin Build Service),软件包编译发布平台,提供openKylin X86、RISC-V、RAM架构软件包的同源编译、管理及软件源自动更新发布等功能,简化代码仓维护者对软件包编译、管理、发布的工作。未来软件包编译发布平台还将支持更多的体系结构,即使openKylin社区开发者没有自己的硬件,也能编译发布出同源代码仓各体系结构的二进制软件包。
1.下载chroot
进入build任务页面(以下为选取举例)
点击上图框内Architecture下的链接,这里是:https://build.openkylin.top/openkylin/nile/amd64;
然后将地址栏中的build.openkylin.top替换为api.build.openkylin.top/devel;
替换后为:http://api.build.openkylin.top/devel/openkylin/nile/amd64,访问该地址,信息如下:
其中,chroot_url为这个包编译环境的下载地址。
将其下载到相同体系架构的系统中。
x86架构:
http://api.build.openkylin.top/devel/openkylin/nile/amd64
arm架构:
http://api.build.openkylin.top/devel/openkylin/nile/arm64
riscv架构:
http://api.build.openkylin.top/devel/openkylin/nile/riscv64
2.解压chroot,并且配置成OKBS平台上编译时相同的软件源
将下载的chroot压缩包以root权限解压:
sudo tar -xaf chroot-openkylin-nile-amd64.tar.gz
然后修改 chroot-autobuild/etc/apt/sources.list文件。
在OKBS编译日志的开头,将会看到如下内容:
RUN: /usr/share/launchpad-buildd/bin/in-target mount-chroot --backend=chroot --series=nile --arch=amd64 PACKAGEBUILD-229378
Starting target for build PACKAGEBUILD-229378
RUN: /usr/share/launchpad-buildd/bin/in-target override-sources-list --backend=chroot --series=nile --arch=amd64 PACKAGEBUILD-229378 'deb http://archive.build.openkylin.top/openkylin nile main' 'deb http://archive.build.openkylin.top/openkylin nile-security main' 'deb http://archive.build.openkylin.top/openkylin nile-updates main' 'deb http://archive.build.openkylin.top/openkylin nile-proposed main'
Can't find dpkg-alter package
Overriding sources.list in build-PACKAGEBUILD-229378
将sources.list原来的内容删除,写入以下内容,和buildlog里override-sources-list的参数是对应的:
deb http://archive.build.openkylin.top/openkylin nile main
deb http://archive.build.openkylin.top/openkylin nile-security main
deb http://archive.build.openkylin.top/openkylin nile-updates main
deb http://archive.build.openkylin.top/openkylin nile-proposed main
如果要测试编译过程,则需要把src源添加到sources.list中,或者手动下载源码包到chroot中。
deb-src http://archive.build.openkylin.top/openkylin nile maindeb-src http://archive.build.openkylin.top/openkylin nile-proposed main
3.chroot到编译环境中,先把环境升级到最新
# 进入chroot环境
sudo chroot chroot-autobuild
# 更新环境
apt updateapt dist-upgrade
4.分析问题
4.1 分析依赖冲突原因
尝试安装buildlog中报错的包:
# apt install python3-aptThe following packages have unmet dependencies: python3-apt : Depends: libapt-inst2.0 (>= 1.2.28~) but 1.2.15-ok0.2 is to be installed Depends: libapt-pkg5.0 (>= 1.2.28~) but 1.2.15-ok0.2 is to be installed E: Unable to correct problems, you have held broken packages.
使用apt policy命令列出软件源中libapt-inst2.0的可选版本:
# apt policy libapt-inst2.0libapt-inst2.0: Installed: (none) Candidate: 1.2.15-ok0.2k2 Version table: 1.2.15-ok0.2k2 1100 1100 http://archive.build.openkylin.top/openkylin nile-proposed main amd64 Packages 1.2.10-ok1k1 50 50 http://archive.build.openkylin.top/openkylin nile main amd64 Packages
显示优先安装nile-proposed源的1.2.15版本,不满足python3-apt对libapt-inst2.0的安装版本要求。
再列出python3-apt的可选版本:
# apt policy python3-aptpython3-apt: Installed: (none) Candidate: 1.1.0~beta1ok0.16.04.8 Version table: 1.1.0~beta1ok1 50 50 http://archive.build.openkylin.top/openkylin nile main amd64 Packages 1.1.0~beta1ok0.16.04.8 500 500 http://archive.build.openkylin.top/openkylin nile-proposed main amd64 Packages
与上述情况相同
解决办法:对不满足依赖版本的要求的软件包,进行升级版本,以达到上述版本要求。
以上是一个简单分析举例。具体编译情况类型较多,根据具体现象分析。
4.2 测试编译过程
# 创建编译测试文件夹
mkdir ~/build-test
cd ~/build-test
# 下载源码包 [方法1]使用deb-src源自动下载+解包
apt source 包名=版本号
# 举例: apt source hello=2.12.1-ok2
# 下载源码包 [方法2]手动下载(wget示例)
apt install wget
wget https://...orig.tar.gz https://...debian.tar.xz https://...dsc
dpkg-source -x ...dsc
# 举例: 打开OKBS平台的源码包页面 https://build.openkylin.top/openkylin/+source/hello/2.12.1-ok2,找到Downloads部分的源码包下载链接
# 手动下载源码包: wget https://build.openkylin.top/openkylin/+archive/primary/+sourcefiles/hello/2.12.1-ok2/hello_2.12.1.orig.tar.gz https://build.openkylin.top/openkylin/+archive/primary/+sourcefiles/hello/2.12.1-ok2/hello_2.12.1-ok2.debian.tar.xz https://build.openkylin.top/openkylin/+archive/primary/+sourcefiles/hello/2.12.1-ok2/hello_2.12.1-ok2.dsc
# 手动解包:dpkg-source -x hello_2.12.1-ok2.dsc
# 安装编译依赖 [方法1]使用deb-src源自动安装
apt build-dep 包名=版本号
# 举例: apt build-dep hello=2.12.1-ok2
# 安装编译依赖 [方法2]手动安装(需要提前进入源码解包后的文件夹)
cd 源码包解压的目录
apt build-dep ../...dsc
# 举例: cd hello-2.12.1
# 举例:apt build-dep ../hello_2.12.1-ok2.dsc
# 如果使用安装编译依赖方法2, 则已经进入源码包解包目录,不用重复执行此步
cd 源码包解压的目录
# 举例: cd hello-2.12.1
# 挂载必要目录
mount -t devtmpfs dev /dev
mount -t proc proc /proc
mount -t sysfs sys /sys
# 如果是amd64体系
dpkg-buildpackage -b
# 如果是其他体系
dpkg-buildpackage -B
# 调试完成后记得将上面的目录卸载
umount /proc
umount /dev
umount /sys
以上就是本次如何调试OKBS编译错误的简单步骤啦,你学会了吗?如有更多疑问,欢迎反馈交流~