DeveloperWiki:在干净的 chroot 中构建
在干净的 chroot 中构建可以防止软件包缺失依赖,无论是由于不必要的链接,还是由于 PKGBUILD 文件中 depends 数组中缺失软件包所致。它还允许用户在安装了 core-testing 或 extra-testing 软件包的同时,为稳定仓库(core, extra)构建软件包。
便捷方法
若要在无需进一步调整的情况下快速在干净的 chroot 中构建软件包,可以使用 devtools 软件包提供的辅助脚本。
这些辅助脚本(例如 pkgctl build)应在包含 PKGBUILD 文件的同一目录下调用,就像使用 makepkg 一样。例如,extra-x86_64-build 会自动从 /var/lib/archbuild 中的干净 chroot 矩阵创建 chroot,对其进行更新,并为 extra 仓库构建软件包。对于 multilib 构建,则直接使用不带架构名称的 multilib-build。请参考下表了解在为特定仓库和架构构建时应使用哪个脚本。
-c 参数会重置 chroot 矩阵,在出现损坏时非常有用。但在干净的 chroot 中构建时不需要该参数。
- core 被省略,因为这些软件包在进入 core 之前必须先经过 core-testing。
- 如果目标是为个人本地使用构建 core 软件包,可能更希望使用稳定仓库而不是测试仓库。在这种情况下,您可以直接使用 extra 构建脚本。
| 目标仓库 | Architecture | 使用的构建脚本 | 使用的 Pacman 配置文件 |
|---|---|---|---|
| extra | x86_64 | extra-x86_64-build | /usr/share/devtools/pacman.conf.d/extra.conf |
| core-testing / extra-testing | x86_64 | extra-testing-x86_64-build | /usr/share/devtools/pacman.conf.d/extra-testing.conf |
| core-staging / extra-staging | x86_64 | extra-staging-x86_64-build | /usr/share/devtools/pacman.conf.d/extra-staging.conf |
| multilib | x86_64 | multilib-build | /usr/share/devtools/pacman.conf.d/multilib.conf |
| multilib-testing | x86_64 | multilib-testing-build | /usr/share/devtools/pacman.conf.d/multilib-testing.conf |
| multilib-staging | x86_64 | multilib-staging-build | /usr/share/devtools/pacman.conf.d/multilib-staging.conf |
传统方法
设置 chroot
devtools 软件包提供了创建并在干净的 chroot 中构建的工具。如果尚未安装,请先安装。
要创建一个干净的 chroot,请创建一个存放 chroot 的目录。例如 $HOME/chroot。
$ mkdir ~/chroot
定义 CHROOT 变量
$ CHROOT=$HOME/chroot
现在创建 chroot(需要 root 子目录,因为 $CHROOT 目录将为干净的工作副本创建其他子目录)
$ mkarchroot $CHROOT/root base-devel
- 如果该位置将被重复使用,也可以在
$HOME/.bashrc中使用 export 命令定义CHROOT变量。 - 在 Btrfs 上,chroot 将作为 子卷 (subvolume) 创建。
编辑 ~/.makepkg.conf 以设置打包者名称和任何 makeflags。此外,根据需要调整 $CHROOT/root/etc/pacman.d/mirrorlist 中的 镜像列表,并在 $CHROOT/root/etc/pacman.conf 中启用 testing 仓库。
~ 和 $HOME 变量会被 makechrootpkg 脚本(详见下文)解析为 /root/。自定义 pacman.conf
或者,可以通过以下方式提供自定义的 pacman.conf 和 makepkg.conf
$ mkarchroot -C <pacman.conf> -M <makepkg.conf> $CHROOT/root base-devel
pacman.conf 或 makepkg.conf 可能会导致 chroot 环境出现非预期的自定义调整。请谨慎使用。在 chroot 中构建
首先,确保基础 chroot ($CHROOT/root) 是最新的
$ arch-nspawn $CHROOT/root pacman -Syu
然后,在包含其 PKGBUILD 文件的目录中调用 makechrootpkg 来构建软件包
$ makechrootpkg -c -r $CHROOT
makechrootpkg 传递 -c 标志可确保在构建之前清理工作 chroot ($CHROOT/$USER)。预安装所需软件包
若要构建一个其依赖项在 $CHROOT/root/pacman.conf 启用的仓库中不可用的软件包,请使用 -I package 将其预安装到工作 chroot 中
$ makechrootpkg -c -r $CHROOT -I build-dependency-1.0-1-x86_64.pkg.tar.zst -I required-package-2.0-2-x86_64.pkg.tar.zst
向 makepkg 传递参数
要向 makepkg 传递参数,请将它们列在选项结束标记 -- 之后(参见 实用程序语法指南 中的 Guideline 10)。例如,强制执行 check()
$ makechrootpkg -c -r $CHROOT -- --check
处理大规模重新构建
处理大规模重新构建最干净的方法是使用 staging 仓库。针对 extra 构建第一个软件包并将其推送到 staging。然后针对 staging 重新构建所有后续软件包并将其推送到那里。
如果您无法使用 staging,可以使用如下命令针对自定义软件包进行构建
# extra-x86_64-build -- -I ~/packages/foobar/foobar-2-1-any.pkg.tar.zst
您可以使用多个 -I 参数指定安装多个软件包。
处理大规模重新构建的一种更简单但较粗糙的方法是在 chroot 中安装所有构建的软件包且永不清理。使用以下命令构建第一个软件包:
# extra-x86_64-build
并使用以下命令构建所有后续软件包:
# makechrootpkg -n -r /var/lib/archbuild/extra-x86_64
运行 namcap(-n 参数)意味着将软件包安装在 chroot 中。*-build 默认也会这样做。
技巧与提示
在 tmpfs 中构建
如果系统有足够的内存,可以为 devtools 构建脚本指定 tmpfs
# mount --mkdir -t tmpfs -o defaults,size=20G tmpfs /mnt/chroots/arch # extra-x86_64-build -c -r /mnt/chroots/arch
删除 chroot
只需删除 chroot 目录及其对应的 .lock 文件即可。