DeveloperWiki:在干净的 chroot 环境中构建

出自 ArchWiki
(重定向自 Building in a clean chroot

为何使用

在干净的 chroot 环境中构建可以防止软件包缺少依赖项,无论是由于不必要的链接还是 PKGBUILD 中 depends 数组中缺少软件包。它还允许用户为稳定仓库(coreextra)构建软件包,同时安装来自 core-testingextra-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
提示: pkgctl-build(1) 会自动选择正确的构建脚本以在干净的 chroot 环境中构建。

传统方法

设置 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 仓库(如果需要)。

注意: makechrootpkg 脚本(如下所述)会将 ~$HOME 变量解析为 /root/

自定义 pacman.conf

或者,提供自定义的 pacman.confmakepkg.conf,内容如下

$ mkarchroot -C <pacman.conf> -M <makepkg.conf> $CHROOT/root base-devel
警告: 在初始创建干净的 chroot 环境期间使用自定义的 pacman.confmakepkg.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