跳转至内容

DeveloperWiki:在干净的 chroot 中构建

来自 ArchWiki

在干净的 chroot 中构建可以防止软件包缺失依赖,无论是由于不必要的链接,还是由于 PKGBUILD 文件中 depends 数组中缺失软件包所致。它还允许用户在安装了 core-testingextra-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
提示 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
  • 如果该位置将被重复使用,也可以在 $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.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.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 文件即可。

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.