跳转至内容

Arch 编译系统 (ABS)

来自 ArchWiki
(来自 Arch Build System 的重定向)

Arch 构建系统 (ABS) 是一个用于从源代码构建和打包软件的系统。虽然 pacman 是 Arch 用于二进制软件包管理的专用工具,但 Arch 构建系统是一套用于将源代码编译成可安装的 .pkg.tar.zst 软件包的工具集。

Arch 构建系统可以与 *BSD 的 ports 相比较,它自动化了从源代码构建软件的过程。该系统使用一个 port 来下载、解压、打补丁、编译和安装给定的软件。一个 port 仅仅是用户计算机上一个以待安装的相应软件命名的目录,其中包含几个文件,里面是关于从源代码构建和安装软件的说明。这使得安装软件就像在 port 的目录中输入 makemake install clean 一样简单。

Arch 构建系统基于类似的概念。它包含 Arch Linux 中每个可用软件包的 git 仓库集合。每个仓库包含一个 PKGBUILD 文件(有时还包含其他文件),但**不**包含软件源码或二进制文件。通过在某个目录中运行 makepkg,软件源码将被下载,软件将被编译,然后打包在构建目录中。之后,您就可以使用 pacman 来安装该软件包。

工具链

Arch 构建系统包含并依赖于在从源代码构建软件包过程中使用的多个组件和工具。

软件仓库 (Repository)
包含构建所有官方软件包所需文件的目录结构,但不包括软件包本身或软件的源码文件。它以 Git 仓库的形式提供,托管在 gitlab.archlinux.org。有关更多信息,请参阅 #仓库结构 部分。
PKGBUILD
一个 Bash 脚本,其中包含源代码的 URL 以及编译和打包说明。
makepkg
一个 shell 命令工具,它读取 PKGBUILDs,自动下载并编译源码,然后根据 makepkg.conf 中的 PKGEXT 数组创建一个 .pkg.tar* 软件包。您也可以使用 makepkg 来从 AUR 或第三方源创建您自己的自定义软件包。有关更多信息,请参阅 创建软件包
pacman
pacman 是完全独立的,但无论是由 makepkg 调用还是手动调用,都是必须的,用于安装和卸载已构建的软件包以及获取依赖项。
pkgctl / devtools
devtools 是 Arch Linux 发行版用于构建和维护官方仓库软件包的工具。 pkgctl(1) 是一个高级工具,用于帮助从源代码仓库构建 Arch Linux 软件包并将其发布到二进制仓库。
AUR
Arch 用户仓库 (AUR) 与官方 PKGBUILD 仓库是分开的,但 AUR 中的软件包可以使用相同的工具进行构建。它包含成千上万由用户贡献的 PKGBUILD,用于 Arch 官方软件包未提供的软件。如果您需要构建官方 Arch 树之外的软件包,很可能它就在 AUR 中。
警告 官方 PKGBUILD 假定软件包是在 干净的 chroot 中构建的。在一个 的构建系统上构建软件可能会失败或导致运行时出现意外行为,因为如果构建系统动态检测依赖项,结果将取决于构建系统中可用的软件包。

仓库结构

每个软件包在 Arch Linux GitLab 实例archlinux/packaging/packages 命名空间下都有自己的 源码 仓库。每个仓库包含 PKGBUILD 和官方构建中使用的文件。此外,在那里还可以找到开发者用于构建过程的一些文件。

例如,acl 的目录树如下所示:

acl
├── keys
│   └── pgp
│       ├── 259B3792B3D6D319212CC4DCD5BF9FEB0313653A.asc
│       ├── 600CD204FBCEA418BD2CA74F154343260542DF34.asc
│       └── B902B5271325F892AC251AD441633B9FE837F581.asc
├── PKGBUILD
└── .SRCINFO

软件包的源代码不在该目录中。相反,PKGBUILD 包含一个 URL,在构建软件包时会下载源代码。

当一个官方软件包被构建时,它会被发布到 官方仓库 之一:coreextramultilib,或者先进入某个测试仓库。这些仓库是 二进制 的,不托管在 GitLab 上,而是由 镜像 提供。

用例

Arch 构建系统自动化了与从源码编译相关的特定任务。它的用例包括:

  • 任何需要您编译或重新编译软件包的用例。
  • 由开发者和打包者为 Arch Linux 构建官方二进制软件包。
  • 从尚未提供软件包的软件源码制作和安装新软件包(参见 创建软件包)。
  • 自定义现有软件包以满足您的需求(例如,启用或禁用选项、打补丁)。
  • 使用您的编译器标志干净地重建整个系统,"类似于 FreeBSD"。
  • 干净地构建和安装您自己的自定义内核(参见 内核编译)。
  • 使内核模块与自定义内核协同工作。
  • 通过编辑 PKGBUILD 中的版本号,轻松编译和安装 Arch 软件包的更新、旧版、beta 或开发版本。

用法

检索 PKGBUILD 源码

要从源码检索构建特定软件包所需的 PKGBUILD 文件,您可以使用 pkgctl 工具或直接使用 Git

使用 pkgctl 工具

作为先决条件,请 安装 devtools 软件包。pkgctl 是一个用于帮助处理 Arch Linux 软件包构建源码文件的工具。

要使用 pkgctl 克隆包含软件包 pkgname 最新构建文件的 git 仓库,请使用以下命令:

$ pkgctl repo clone pkgname
提示 默认情况下,这会通过 SSH 进行克隆。如果您尚未在您的 Arch GitLab 账户中设置 SSH 密钥,则需要通过 HTTPS 进行克隆:pkgctl repo clone --protocol=https pkgname

请注意,这里的构建源码文件是指 PKGBUILD,可能还包含其他几个必需的文件,例如密钥。也就是说,Arch Linux 构建系统所需的关键文件。它不指软件包的源码文件(例如 C 或 Python 文件),这些文件是由软件包的作者团队编写的。

这不仅会提供当前的源码构建文件,还会提供它们之前的版本。此外,您可以使用所有其他 git 命令来检出软件包的旧版本或跟踪自定义更改。

如果您想获取某个特定版本的软件包,可以使用类似以下的命令:

$ pkgctl repo clone --switch="2:1.19.5-1" go

请阅读 pkgctl-repo-clone(1) 以获得更多见解,以及了解其他可用命令。

直接使用 git

使用以下 git 命令克隆一个软件包:

$ git clone https://gitlab.archlinux.org/archlinux/packaging/packages/pkgname.git

例如,复制 Apache 的构建文件:

$ git clone https://gitlab.archlinux.org/archlinux/packaging/packages/apache.git

构建软件包

配置 makepkg 以构建您已检出的 PKGBUILDs 的软件包,如 makepkg#Configuration 中所述。

然后,将包含您要修改的 PKGBUILD 的目录复制到一个新位置。在那里进行所需的修改,并像在 makepkg#Usage 中描述的那样使用 makepkg 来创建和安装新软件包。

技巧与提示

保留已修改的软件包

使用 pacman 更新系统会用官方仓库中同名的软件包替换已修改的软件包。请参阅以下说明,了解如何避免这种情况。

PKGBUILD 中插入一个 group 数组,并将该软件包添加到名为 modified 的组中。

PKGBUILD
groups=('modified')

/etc/pacman.confIgnoreGroup 部分添加此组。

/etc/pacman.conf
IgnoreGroup = modified

如果在系统更新期间官方仓库中有新版本可用,pacman 会打印一条提示,说明它正在跳过此更新,因为它在 IgnoreGroup 部分。此时,应重新构建已修改的软件包,以避免 部分升级