给 deepin 修包(入世篇)

要不,你先看看这个万能的手册

工作流

具体的工作流在这里中有介绍。简言之,我们只要关注有问题的包和干脆没有的包即可,如果这个包只是版本不够,那你只要找你的 mentor 然后请求升级即可,当然如果遇到了版本锁死的情况另说。

什么是没有的包?简言之就是在你的本机上无论通过二进制源还是源码源都无法下载的包。这一点很重要,由于 deepin 构建系统中有一些容量过大或临时放入的包只有 obs 中有而 github 上没有,我们只能按照用户最终面向为准。

如果你恰巧找到了这样一个不存在的包,比如我最早修的 ocaml-augeas ,那么大致的流程是这样的:

首先,在 repository-manager 中添加这个不存在的包(注意,是缺失的包对应的源码包):

1
2
3
- repo: ocaml-augeas
  group: deepin-sysdev-team
  info: OCaml bindings to the Augeas configuration library

这些信息可以在 ocaml-augeas对应的源码包提供处 找到,如果你找不到这个网站可以直接在 Google 中搜索 debian package search 然后第一条或者第二条就是。填写完信息之后进行 pr 。

过一段时间(但你最好还是私信一下你的 mentor 丢一下你的 pr 链接)后系统就会自动创建模板 repo , fork 一份然后 clone 到本地,在打包结束后使用。

接下来把源码包下载到本机:

1
2
3
wget http://deb.debian.org/debian/pool/main/o/ocaml-augeas/ocaml-augeas_0.6-2.dsc
wget http://deb.debian.org/debian/pool/main/o/ocaml-augeas/ocaml-augeas_0.6.orig.tar.gz
wget http://deb.debian.org/debian/pool/main/o/ocaml-augeas/ocaml-augeas_0.6-2.debian.tar.xz

解包:

1
dpkg-source -x *.dsc

接下来我们需要进入源码目录并应用源码目录内的补丁,这里涉及到了 dquilt 命令,对于 bash 的构建方法在这里。简言之,你要修改 ~/.bashrc~/.dquiltrc-dpkg 两个文件如下:

1
2
3
alias dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"
. /usr/share/bash-completion/completions/quilt
complete -F _quilt_completion -o filenames dquilt
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
d=. ; while [ ! -d $d/debian -a $(readlink -e $d) != / ]; do d=$d/..; done
if [ -d $d/debian ] && [ -z $QUILT_PATCHES ]; then
    # if in Debian packaging tree with unset $QUILT_PATCHES
    QUILT_PATCHES="debian/patches"
    QUILT_PATCH_OPTS="--reject-format=unified"
    QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
    QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
    QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33"
    if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi
fi

但我用 fish ,而 fish 自带的补全功能已经足够了,所以对 ~/.config/fish/config.fish 的修改就相对简单一些:

1
alias dquilt="quilt --quiltrc=$HOME/.quiltrc-dpkg"

这不意味着如果你使用别的 shell 那最一开始对 bashrc 的修改就没用了,你在新创建的 rootfs 中还是得乖乖用 bash 。

进入源码目录,然后使用

1
2
dquilt pop -a
rm -rf .pc

进行源码修复。修复后按照正常流程创建 rootfs 然后查看打包是否成功。打包后把最开始 clone 的模板仓库中的版本管理和自动化相关组件丢到源码目录中,举例的话是这样:

1
2
3
mv ../ocaml-augeas/.git ./
mv ../ocaml-augeas/.github ./
mv ../ocaml-augeas/debian/deepin ./debian

然后提交……

1
2
3
4
git add .
git commit
# 这里的commit message 应当遵守semantic commit中的一般原则,如“feat: update ocaml-augeas to 0.6-2”
git push

然后 pr ,在 /ok-to-test/integrate 之后你就得到了两份产出。

循环依赖

对于一些源码包,如 superminlibguestfs ,涉及到了两个软件包都缺失而在 Dependencies 字段中互相依赖的场景,但其中一方可能只在某几项测试中使用了这个依赖。这时候就应该在 debian/control 中涉及循环依赖的包后方添加 <!nocheck> ,然后在安装剩下的依赖时使用

1
export DEB_BUILD_PROFILES=nocheck

绕开这些依赖进行后续的依赖安装。

改动源码之后的打包流程

dpkg-buildpackage 在打包时会严格检查你的包和上游的 orig.tar.gz 是否能够对应,如果你做了修改而继续使用原有的源码包进行打包会导致打包失败。这种情况下我们应该重新构建源码包(以下构建流程假定你的源码目录为 repo ,参考来源:buildpackage-deepin):

1
pushd repo ; dh_testdir ; dh_quilt_unpatch ; PACKAGE=$(dpkg-parsechangelog -S source) ; VERSION=$(dpkg-parsechangelog -S Version | rev | cut -d '-' -f 2- | cut -f1 -d ':' | rev) ; tmpdir=$(mktemp -d) ; mv debian/ $tmpdir/ ; TAR="$PACKAGE"_"$VERSION.orig.tar.gz" ; tar -czf ../$TAR . ; mv $tmpdir/debian . ; popd

然后正常地安装依赖并进行打包即可。

github actions

一些源码中可能包含一些自带的 github actions ,在打包前把它们删掉,然后按照“改动源码之后的打包流程”进行打包即可。原有的 github actions 可能导致 CI 算力浪费从而减慢整个系统的构建。

新时代的千年虫

time_t 这个 type 在 32-bit 机器上是32位,而在 64-bit 机器上是64位,32位的 time_t 会在2038年溢出,于是 Debian 官方在2023年末至2024年初开始了 t64-transition ,具体的细节在这里,长话短说就是进行 ABI 替换。但是这个文档中有这样一句话:

1
64-bit architectures are not affected by the Y2k38 problem, but they are affected by this transition.

也就是说对于我们现在工作使用的 RISC-V 64 架构来说这个改动唯一的变化就是更改了产出二进制包的后缀进而导致调用版本问题。具体的修正方法是首先修改 control 对应的条目,规则在这里。你需要把 t64 后缀的 Package 名修正,然后删掉对应的 Break 和 Replace 字段,之后退出 control ,删除 t64 对应的 lintian-override ,重命名 t64 后缀的 install ,然后再在 symbols 中删除第一行中的 t64 后缀,之后按照正常流程打包即可。

11月左右 deepin26 将会迁往 RVA23 ,届时会有大量的额外工作,《灭世篇》就得届时再更新了。最后,别忘了看万能的 manual

Maybe making a better tomorrow...
Built with Hugo
Theme Stack designed by Jimmy