跳转至内容

DeveloperWiki:在干净的chroot中构建

来自 ArchWiki

在干净的chroot中构建可防止软件包出现依赖项缺失,无论是由于不必要的链接还是PKGBUILD文件中depends数组中缺少软件包。它还允许用户为稳定存储库(coreextra)构建软件包,同时安装来自core-testingextra-testing的软件包。

便捷方式

为了快速在干净的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
  • 如果需要重复使用该位置,也可以使用export命令在$HOME/.bashrc中定义CHROOT变量。
  • Btrfs上,chroot被创建为子卷

编辑~/.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
注意-c标志传递给makechrootpkg可确保在构建前清理工作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传递参数,请将它们列在选项结束标记--之后。例如,要强制执行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中构建

如果系统有足够的RAM,可以为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文件。