devtools 是 Arch Linux 开发者们用来往官方仓库里推进软件包使用的一系列工具。由于里面有许多工具可能不是我们常用的,这里主要介绍里面的一部分——用于在干净的环境中编译软件包的命令。
为什么要在干净的环境里编译软件包?这里有几个常见的理由:
- 避免忘记写依赖 – 当前环境中已安装的软件包可能在普通的 makepkg 过程中被忽略,最后在 depends 或者 makedepends 等列表中缺失。
- 避免编译过程污染环境 – 因为一些你可能没有想到的原因,编译过程中可能会对你当前的系统产生污染,比如跑 npm install 的时候可能会把缓存塞到 $HOME。
- 避免因环境不干净导致的奇怪编译错误 – 你的环境中可能有各种不干净的情况,比如 profile.d 里覆盖了 gcc 等常见命令、/usr/local/bin 里有覆盖常用命令、用非系统包管理器安装(覆盖)了一些东西等。
- 或者你只是不想把这个软件包编译时需要的一堆乱七八糟的依赖都装在自己机器上。
如果你有这样的需求,可以考虑使用 devtools。安装过程很简单
pacman -S devtools
下面需要考虑的是,这个软件包是符合哪个仓库规范的。由于一般用户不需要考虑 staging 系列仓库和配置文件等问题,下面这个列表是从 ArchWiki 中简化的版本:
目标仓库 | 架构 | 使用命令 |
---|---|---|
extra / community | x86_64 | extra-x86_64-build |
testing / community-testing | x86_64 | testing-x86_64-build |
multilib | x86_64 | multilib-build |
multilib-testing | x86_64 | multilib-testing-build |
archlinuxcn | x86_64 | archlinuxcn-x86_64-build |
archlinuxcn (但有用到 multilib 中的依赖) | x86_64 | multilib-archlinuxcn-build |
(注意最后两个命令来自 devtools-cn-git 软件包,可以从 [archlinuxcn] 仓库中得到)
直接在包含 PKGBUILD 文件的目录中执行对应的命令(替换原来工作流里的 makepkg 命令)即可。
常见问题、小技巧
- 软件包的依赖不在官方仓库中,如何把这个包“塞”到编译环境中?
extra-x86_64-build -- -I /var/cache/pacman/pkg/your-package-0-x86_64.pkg.tar.xz
- 如何传入 makepkg 的命令行参数,比如如果我想跳过测试?
extra-x86_64-build -- -- --nocheck
- 某个目标的 chroot 损坏了,如何清空重来?
extra-x86_64-build -c
- 每次重新准备干净 chroot 的过程特别慢,如何可以提速呢?
可以考虑做一个 btrfs 镜像挂载到 /var/lib/archbuild,devtools 会自动使用 btrfs 来加速这个过程。参考制作过程:
truncate -s 100G /var/archbuild.img
mkfs.btrfs /var/archbuild.img
mount -o discard,compress=lzo,autodefrag /var/archbuild.img /var/lib/archbuild
echo "/var/archbuild.img /var/lib/archbuild btrfs defaults,discard,compress=lzo,autodefrag 0 0" >> /etc/fstab
(记得要先清空 /var/lib/archbuild 目录以便作为挂载点。)
在 mkarchroot $CHROOT/root base-devel 的时候,我 $CHROOT 设置的是~/chroot ,如果挂载是不是就默认使用 var/lib/archbuild, $CHROOT 没有意义了 ? 谢谢
应该是。前面的命令可能是以你自己用户的 bash 展开,后面的命令执行时是用的 sudo 权限,环境变量不会传进去。
在 mkarchroot $CHROOT/root base-devel 的时候,我 $CHROOT 设置的是~/chroot ,挂载之后是不是就默认使用 var/lib/archbuild了? 谢谢
不好意思,这条描述的不清晰,我重发了一条
肥貓好棒!還有 multilib-archlinuxcn-git 這個容易忘(也不好補全
我猜你指的是 multilib-archlinuxcn-build,已经补上~