在Arch Linux上使用Devtools

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com

Devtools软件包最初是为受信任的用户制作的,可以为官方存储库正确创建软件包。但是,普通用户也可以使用它来构建AUR软件包,甚至可以修改官方软件包。

请参阅本指南,以全面了解和使用AUR,包括获取 PKGBUILD。如果您选择编译软件包的方法,那么此文档仅显示特定于Devtools的步骤。

Devtools维护一个单独的干净Arch安装,位于 /var/lib/archbuild//root,其中仅包含软件包组 basebase-devel。如果不存在这种全新安装,它将自动创建它。如果确实存在,它将自动更新其中的所有软件包。当使用Devtools构建软件包时,它会以这种全新安装的副本开头,仅将必需的软件包安装到副本中,将源代码复制到其中,在其中进行编译和打包,然后仅复制出最终的软件包,格式与官方存储库中的格式相同。

与运行相比,Devtools有很多优势 makepkg 直。优点之一是 base-devel 以及编译(而不是运行)您正在制作的程序包所必需的其他程序包永远不会出现在主系统中。这样就减少了需要定期升级和关注的软件包。虽然主要是为Arch软件包维护者带来好处,但是当 PKGBUILD 是不正确的,例如,如果由于列出维护者恰好已经安装在其主系统中而没有列出依赖项。您还可以使用构建软件包速度更快的计算机,然后将生成的软件包复制到运行该软件包的速度较慢的计算机上,而不会污染构建计算机的安装。

主要缺点是,干净的根目录始终存在,占用大约800MB的空间,通常单个副本在那里会占用更多的空间。注意,如果 /var/lib/archbuild/ 使用Btrfs,干净根目录的副本开始是Btrfs快照,因此这些文件不会占用两倍的空间。干净的根目录始终保留在该目录中,以避免每次制作软件包时都重新安装它。

使用Devtools进行编译

安装Devtools:

# pacman -S devtools

要构建软件包,Devtools包括 archbuild,但是您不能直接运行它。它还包括以下内容的符号链接: {extra, gnome-unstable, kde-unstable, staging, testing}-x86_64-build。该符号链接用于运行它将被检查 archbuild,以确定您要使用的目标。可以运行这些不稳定/分段/测试存储库,这些存储库的版本可能比正式存储库发布的版本更高。要将官方存储库用于非AUR软件包,请在目录中 PKGBUILD,例如由 git clone,运行以下命令:

$ extra-x86_64-build

注意: 本指南的其余部分将仅涉及 extra-x86_64-build

完成运行后,将得到以下结果:

/var/lib/archbuild/extra-x86_64/root – 一种 干净的chroot,这是仅软件包组的最新安装 basebase-devel
/var/lib/archbuild/extra-x86_64/ -这将包含一个 建立chroot。这是干净chroot的副本,其中包含构建或运行正在构建的程序包所需的所有依赖关系以及其源代码,编译结果和程序包。
您所在的目录将包含软件包和构建日志文件,以及所有已下载的源代码。

最后,您可能会注意到“Checking PKGBUILD”和“Checking ---.pkg.tar.xz“。这些之后的任何行均从 namcap,它会自动查找格式错误的问题 PKGBUILD 文件,包似乎没有使用的依赖项,包似乎没有使用的依赖项等等。误报通常是由 namcap,但它是进行调查的绝佳工具。如果您的程序包工作正常,则最好不要提醒维护人员 namcap 输出,除非您已仔细研究并确认应进行更改。

您可以使用 pacman 安装软件包,只要安装包在官方存储库或本地存储库中,它将安装运行该软件包所需的所有依赖项。

如此处所述使用本地存储库,或直接安装文件:

# pacman -U ---.pkg.tar.xz

如果你要跑步 extra-x86_64-build 再次,现在或以后的任何时候,使用此软件包或其他软件包,它将在需要时更新干净的chroot,删除生成的chroot,使其成为干净的chroot的新副本,然后执行相同的过程。如果您的目录仍然有上次下载的源代码,它将使用它。如果该软件包是开发性的AUR软件包,它将提取新的更改,而不是重新克隆。

在内部, extra-x86_64-build 运行 makechrootpkg,内部调用 makepkg。的选项 extra-x86_64-build 包括以下这些:

-c :删除并重新创建整个chroot,以清理chroot /var/lib/archbuild/extra-x86_64/ 目录,包括其干净的chroot和所有构建的chroot目录。仅当干净的chroot损坏或以破坏向后兼容性的方式升级Devtools时,才很少需要这样做。
-r

:使用与以下目录不同的目录 /var/lib/archbuild/extra-x86_64/ 包含chroot。

任何有关 extra-x86_64-build-- 传递给 makechrootpkg,当它在内部使用它时。总是会自动从中传递几个参数 extra-x86_64-buildmakechrootpkg。这些自动参数是 -r -c -n。他们告诉 makechrootpkg 删除构建chroot并使其成为干净chroot的新副本,然后运行 namcap 如果成功构建,则在软件包上。可以传递给的常用选项 makechrootpkg-l 。这是赋予构建chroot的目录名称,而不是 ,这对于维护多个副本或同时编译多个软件包很有用。

任何有关 makechrootpkg-- 传递给 makepkg,当它在内部使用它来构建软件包时。第一次 makepkg 由…运行 makechrootpkg,它使用自己不可更改的选项来完成,以在需要时下载源文件并执行完整性检查;因此,此运行无法转发任何内容。它运行 makepkg 第二次构建软件包,并且始终自动通过 makepkg 的论点 --syncdeps --noconfirm --log --holdver --skipinteg 告诉 makepkg 以在构建chroot中自动安装构建和使用软件包所需的缺少依赖项,而无需在安装过程中进行确认 pacman,除了将构建过程记录到文本文件之外, stdout,如果在版本控制系统中,请勿更新源代码,也不要执行源文件验证检查。

您可以使用以下形式将它们链接在一起:

$ extra-x86_64-build  --  -- 

注意 /var/lib/archbuild 可以看作是一个临时目录。如果您有多个Vultr硬盘驱动器,则值得在此处安装RAID0(条带化)文件系统。如果您有大量RAM,还可以挂载RAM支持的文件系统,例如 tmpfs。生成软件包后,将其复制到您运行的目录中 extra-x86_64-build 从中,如果您愿意,此时可以删除 /var/lib/archbuild。下次运行会比较慢,因为它将需要重新创建一个干净的根。或者,您可以删除 /var/lib/archbuild/ 从构建chroot回收多余的空间,然后由下次运行的Devtools自动删除它。因此,即使您在此处安装的RAID0文件系统发生故障,丢失最多的还是正在进行的编译。

Devtools配置文件

Devtools配置文件需要注意一些细节。他们位于 /usr/share/devtools/, 如 makepkg-x86_64.confpacman-extra.conf

对于 /etc 像文件 makepkg.confpacman.conf,您可以在适当的位置安全地进行编辑,并且升级软件包后,它不会覆盖您的更改。相反,它将保存新的配置文件(如果它们与以前的版本相比有所更改),以 .pacnew。但是,Devtools配置文件位于 /usr/share/ 它不适合用户编辑,因此在升级Devtools时,它将完全覆盖您对这些文件的更改,而不会提醒您。已经提出并拒绝对此行为进行更改,因为这有助于确保将软件包发送到所有具有相同编译设置的正式存储库。
的价值 MAKEFLAGSPACKAGER{SRC,SRCPKG,PKG,LOG}DEST 取自 /etc/makepkg.conf 而不是 /usr/share/devtools/makepkg-x86_64.conf

本地存储库

如果要构建依赖于已构建的其他软件包的软件包,则需要使用本地存储库,以便在 pacman 在构建chroot中运行,它会找到依赖项。

要设置本地存储库,请参阅本指南的“本地存储库”部分。

创建一个自定义目标:

# ln -s archbuild /usr/bin/custom-x86_64-build
# cp /usr/share/devtools/pacman-{extra,custom}.conf

编辑 /usr/share/devtools/pacman-custom.conf,并在末尾添加以下内容:

[archLocalRepo]
SigLevel = Optional TrustAll
Server = file:///archLocalRepo

编辑 /etc/pacman.conf,并添加以下内容。这将强制将目录绑定安装在chroot中:

CacheDir    = /var/cache/pacman/pkg/ /archLocalRepo/

现在,代替使用 extra-x86_64-build 用这个:

$ custom-x86_64-build

如果您始终要使用自定义目标,则可以删除 /var/lib/archbuild/extra-x86_64-build/ 目录(如果存在),因为chroots现在位于 /var/lib/archbuild/custom-x86_64-build/

包装更快

注意启用线程打包涉及编辑 /usr/share/devtools 配置文件,它不受官方支持,因此每次Devtools升级时,都需要执行此更改。

Devtools将整个软件包组合成存档格式。默认情况下, .tar.xz 使用单个线程 xz 压缩。

在多CP​​U系统上,您可以允许 xz 通过编辑使用多个线程 /usr/share/devtools/makepkg-x86_64.conf,然后更改以下行:

COMPRESSXZ=(xz -c -z -)

要允许拥有虚拟核心的线程数量尽可能多:

COMPRESSXZ=(xz -c -z - --threads=0)

要允许使用多个虚拟内核,但不能全部使用,以减少对整体系统性能的影响,请添加特定数量:

COMPRESSXZ=(xz -c -z - --threads=21)

指定的线程数多于您拥有的虚拟内核数,将会降低性能。

如果您不介意打包文件较大(可能很大),请通过编辑禁用压缩 /usr/share/devtools/makepkg-x86_64.conf,然后更改以下行:

PKGEXT='.pkg.tar.xz'

将其更改为如下所示:

PKGEXT='.pkg.tar'

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com