DeveloperWiki:在干净的 chroot 环境中构建
为何要使用干净的 chroot 环境
在干净的 chroot 环境中构建可以防止软件包中缺少依赖项,无论是由于不必要的链接还是 PKGBUILD 中 depends 数组中缺少软件包。它还允许用户为稳定仓库(core,extra)构建软件包,同时安装来自 core-testing 或 extra-testing 的软件包。
便捷方法
为了在干净的 chroot 环境中快速构建软件包,而无需进一步的调整,可以使用 devtools 软件包中的辅助脚本。
这些辅助脚本应在与 PKGBUILD 相同的目录中调用,就像使用 makepkg 一样。例如,extra-x86_64-build
会自动从 /var/lib/archbuild
中的干净 chroot 矩阵设置 chroot 环境,更新它,并为 extra 仓库构建软件包。对于 multilib 构建,只需使用不带架构的 multilib-build
。请查阅下表,了解在为特定仓库和架构构建时应使用哪个脚本的信息。
-c
参数重置 chroot 矩阵,这在发生损坏时可能很有用。在干净的 chroot 环境中构建不需要它。
- core 被省略,因为这些软件包在进入 core 之前需要先经过 core-testing。
- 如果目标是为您自己的本地使用构建 core 软件包,则可能需要使用稳定仓库而不是测试仓库。在这种情况下,您可以简单地使用 extra 构建脚本。
目标仓库 | 架构 | 要使用的构建脚本 | 使用的 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
- 如果要重复使用该位置,也可以使用 export 命令在
$HOME/.bashrc
中定义CHROOT
变量。 - 在 btrfs 上,chroot 环境是作为子卷创建的,因此您必须通过以 root 身份运行
btrfs subvolume delete $CHROOT/root
来删除子卷来删除它。
编辑 ~/.makepkg.conf
以设置打包者名称和任何 makeflags。还要调整 $CHROOT/root/etc/pacman.d/mirrorlist
中的 镜像列表,并在 $CHROOT/root/etc/pacman.conf
中启用 testing 仓库(如果需要)。
~
和 $HOME
变量解析为 /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.xz -I required-package-2.0-2-x86_64.pkg.tar.xz
向 makepkg 传递参数
要向 makepkg 传递参数,请在 选项结束标记 之后列出它们;例如,强制执行 check()
$ makechrootpkg -c -r $CHROOT -- --check
处理大型重建
处理大型重建的最干净方法是使用 staging 仓库。针对 extra 构建第一个软件包并将其推送到 staging。然后针对 staging 重建所有后续软件包并将它们推送到那里。
如果您不能使用 staging,您可以使用类似这样的命令针对自定义软件包进行构建
# extra-x86_64-build -- -I ~/packages/foobar/foobar-2-1-any.pkg.tar.xz
您可以使用多个 -I
参数指定要安装的多个软件包。
处理大型重建的一种更简单但更脏的方法是在 chroot 环境中安装所有已构建的软件包,永远不要清理它。使用以下命令构建第一个软件包
# extra-x86_64-build
并使用以下命令构建所有后续软件包
# makechrootpkg -n -r /var/lib/archbuild/extra-x86_64
运行 namcap(-n
参数)意味着在 chroot 环境中安装软件包。*-build 默认也会这样做。
技巧与窍门
在 tmpfs 中构建
如果系统有足够的 RAM,则可以为 devtools 构建脚本指定 tmpfs。
# mount --mkdir -t tmpfs -o defaults,size=20G tmpfs /mnt/chroots/arch # extra-x86_64-build -c -r /mnt/chroots/arch