广告位
在Arch Linux上使用Devtools
作者: 分类:Linux浏览(2,038)2019-11-13

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

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

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

makepkg直接运行相比,Devtools有很多优势。优点之一是,base-devel编译但不运行正在制作的程序包所必需的其他程序包永远不会出现在主系统中。这样就减少了需要定期升级和关注的软件包。尽管主要是为Arch软件包维护者带来好处,但是当a 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,这是仅包含软件包组base和的最新安装base-devel
  • /var/lib/archbuild/extra-x86_64/<USERNAME>-这将包含一个构建chroot。这是干净chroot的副本,其中包含构建或运行正在构建的程序包所需的所有依赖关系以及其源代码,编译结果和程序包。
  • 您所在的目录将包含软件包和构建日志文件,以及所有下载的源代码。

最后,您可能会注意到“ Checking PKGBUILD”和“ Checking <PKGNAME>-<PKGVER>-<PKGREL>-<ARCH>.pkg.tar.xz”。这些内容之后的所有行都是从中输出的namcap,它们会自动查找问题,例如格式错误的PKGBUILD文件,包似乎没有使用的依赖关系,包似乎没有使用的依赖关系等等。误报通常是由产生的namcap,但是它是进行调查的重要工具。如果您的程序包工作正常,则最好不要提醒维护人员namcap输出,除非您已仔细检查并确认应进行更改。

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

按照此处说明使用本地存储库,或直接安装文件:

# pacman -U <PKGNAME>-<PKGVER>-<PKGREL>-<ARCH>.pkg.tar.xz

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

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

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

extra-x86_64-buildafter 内部使用它时,after的所有参数--都传递给makechrootpkg。几个参数总是自动传递extra-x86_64-buildmakechrootpkg。这些自动参数是-r <value given to extra-x86_64-build -r option if given, /var/lib/archbuild/extra-x86_64 otherwise> -c -n。他们告诉makechrootpkg删除构建chroot并使其成为干净chroot的新副本,并namcap在成功构建的软件包上运行。可以传递给的常用选项makechrootpkg-l <copy name>。这是提供构建chroot的目录名称,而不是<USERNAME>,对于维护多个副本或同时编译多个软件包非常有用。

makechrootpkgafter 内部使用它来构建软件包时,after的所有参数--都传递给makepkg。第一次makepkg由运行makechrootpkg,它使用其自己的不可更改的选项来完成,以下载源文件(如果需要)并执行完整性检查;因此,此运行无法转发任何内容。它会makepkg第二次运行以构建软件包,并始终自动传递其makepkg参数,--syncdeps --noconfirm --log --holdver --skipinteg以告知makepkg在构建chroot内自动安装构建和使用软件包所需的缺少依赖项,而不是在询问过程中要求确认pacman,将构建过程记录到文本除以外的文件,stdout如果在版本控制系统中,则不要更新源代码,也不要执行源文件验证检查。

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

$ extra-x86_64-build <DEVTOOLS-OPTIONS> -- <MAKECHROOTPKG-OPTIONS> -- <MAKEPKG-OPTIONS>

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

Devtools配置文件

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

  • 对于和/etc这样的文件,您可以在适当的位置安全地对其进行编辑,并且在升级软件包时,它不会覆盖您的更改。而是会保存以结尾的新配置文件(如果它们与先前版本相比有所更改)。但是,Devtools配置文件不适合用户编辑,因此,在升级Devtools时,它将完全覆盖对这些文件的更改,而不会发出警告。已提出并拒绝对此行为进行更改,因为这有助于确保将软件包发送到所有具有相同编译设置的正式存储库。makepkg.confpacman.conf.pacnew/usr/share/
  • 该值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'
图片压缩在线工具 tools online