Skip to content

我们的工作习惯

Levi Zim edited this page May 5, 2023 · 7 revisions

不是让软件能出包就算修复,对于 Patch 的内容我们有着一些不成文的约定。你可以在这篇文章中了解我们以往对某个错误的通用修复方式,也可以了解我们的一些要求。

修改 qemu-user-blacklist.txt

该文件应该保持字典序, 可以通过以下命令向该文件中添加一个新的包:

echo "包名" | LC_ALL=C sort -o qemu-user-blacklist.txt - qemu-user-blacklist.txt

注意 LC_ALL=C 是必须的. 不指定 LC_ALL=C 会导致 sort 按照当前系统的本地化设置进行排序, 可能会忽略除字母和数字之外的其他字符, 导致最后顺序不一样. 参考 man sort 和此链接.

Rust

error: failed to run rustc to learn about target-specific information

解决方案:删除 PKGBUILD 里的 --target "$CARCH-unknown-linux-gnu" 参数

error: failed to run custom build command for ring v0.16.20

解决方案:使用肥猫 patch 后的 ring。在 PKGBUILD 的 prepare 函数(如果没有这个函数就自己加上)内加入下面两行:

echo -e "\n[patch.crates-io]\nring = { git = 'https://github.com/felixonmars/ring', branch = '0.16.20' }" >> Cargo.toml
cargo update -p ring

无法编译 jemallocator 这个依赖

解决方案:给上游发 PR,把 jemallocator 这个 crate 换成 tikv-jemallocator。

参考 PR:

在 QEMU-user 里编译 Rust 程序卡住了

打开 htop,摁 F4 搜索编译程序的名字,可以用方向键移动。在 S 那一列里查看应用状态,如果是 Z,即 Zombie 僵尸状态,说明编译程序卡死了,需要杀掉重开。选上这个程序之后按 k 键,左侧会弹出 Send Signal 窗口,选择 SIGABRT 信号并回车,程序就会被干掉了,然后你再重试。

Golang

替换依赖

编辑 go.mod,用 replace 语法进行替换(可以放在文件最后面)。

例子:把 modernc.org/libc 的 v1.4.1 版本升到 v1.14.11 版本

replace modernc.org/libc v1.4.1 => modernc.org/libc v1.14.11

然后把这个修改生成出 patch,在 PKGBUILD 的 prepare 函数里添加:

patch -Ni ../fix-libc.patch
go get -d modernc.org/libc

最后把 riscv64.patch 和修改的 patch 放在一起,提交 PR。

C/C++

config.guess: unable to guess system type

解决方案:

  1. 首先向上游汇报他们的 config.guessconfig.sub 文件过老。
  2. 然后在 PKGBUILD 里尝试使用 autoreconf -fi 命令来更新 config.guess
  3. 如果上游的 config.guess 文件已经老到无法更新,将 /usr/share/autoconf/build-aux/ 目录下的 config.guessconfig.sub 文件拷贝到本地。
  4. 提交 PR,并附带上你的上游汇报链接。
  5. 持续跟踪你的上游报告,上游更新完并发版之后删除 patch。

undefined reference to __atomic_exchange_1

具体参考: https://blog.jiejiss.com/A-RISC-V-gcc-pitfall-revealed-by-a-glibc-update/

Clone this wiki locally