Arch 编译系统 (ABS)
Arch 构建系统 (ABS) 是一个用于从源代码构建和打包软件的系统。虽然 pacman 是 Arch 用于二进制软件包管理的专用工具,但 Arch 构建系统是一套用于将源代码编译成可安装的 .pkg.tar.zst 软件包的工具集。
Arch 构建系统可以与 *BSD 的 ports 相比较,它自动化了从源代码构建软件的过程。该系统使用一个 port 来下载、解压、打补丁、编译和安装给定的软件。一个 port 仅仅是用户计算机上一个以待安装的相应软件命名的目录,其中包含几个文件,里面是关于从源代码构建和安装软件的说明。这使得安装软件就像在 port 的目录中输入 make 或 make install clean 一样简单。
Arch 构建系统基于类似的概念。它包含 Arch Linux 中每个可用软件包的 git 仓库集合。每个仓库包含一个 PKGBUILD 文件(有时还包含其他文件),但**不**包含软件源码或二进制文件。通过在某个目录中运行 makepkg,软件源码将被下载,软件将被编译,然后打包在构建目录中。之后,您就可以使用 pacman 来安装该软件包。
工具链
Arch 构建系统包含并依赖于在从源代码构建软件包过程中使用的多个组件和工具。
- 软件仓库 (Repository)
- 包含构建所有官方软件包所需文件的目录结构,但不包括软件包本身或软件的源码文件。它以 Git 仓库的形式提供,托管在 gitlab.archlinux.org。有关更多信息,请参阅 #仓库结构 部分。
- makepkg
- 一个 shell 命令工具,它读取
PKGBUILD文件,自动下载并编译源码,并根据makepkg.conf中的PKGEXT数组创建 .pkg.tar* 文件。您也可以使用 makepkg 从 Arch 用户软件仓库 (AUR) 或第三方源码构建您自己的自定义软件包。有关更多信息,请参阅 创建软件包。
- pacman
- pacman 是完全独立的,但必须由 makepkg 或手动调用,用于安装和删除构建好的软件包以及获取依赖项。
- devtools pkgctl
- devtools(7) 是 Arch Linux 发行版用于构建和维护官方仓库软件包的工具。pkgctl(1) 是一个高级工具,旨在帮助从源码仓库构建 Arch Linux 软件包并将其发布到二进制仓库。
- AUR
- Arch 用户软件仓库与
PKGBUILD文件的官方仓库是分开的,但 AUR 中的软件包可以使用相同的工具进行构建。它包含了数以千计由用户贡献的PKGBUILD文件,涵盖了那些未作为官方 Arch 软件包提供的软件。如果您需要构建一个官方 Arch 树之外的软件包,它很有可能就在 AUR 中。
PKGBUILD 文件假设软件包是在 干净的 chroot (clean chroot) 环境中构建的。在 不干净 (dirty) 的构建系统上构建软件可能会失败或导致运行时出现意外行为,因为如果构建系统动态地检测依赖关系,结果将取决于构建系统上安装了哪些软件包。仓库结构
每个软件包在 Arch Linux GitLab 实例 的 archlinux/packaging/packages 命名空间中都有自己的 源码 仓库。每个仓库包含 PKGBUILD 文件和官方构建中使用的文件。此外,那里还可以找到开发人员在构建过程中使用的一些文件。
例如,acl 的目录树如下所示:
acl ├── keys │ └── pgp │ ├── 259B3792B3D6D319212CC4DCD5BF9FEB0313653A.asc │ ├── 600CD204FBCEA418BD2CA74F154343260542DF34.asc │ └── B902B5271325F892AC251AD441633B9FE837F581.asc ├── PKGBUILD └── .SRCINFO
软件包的源代码并不直接存在于该目录中。相反,PKGBUILD 文件包含一个 URL,在构建软件包时会自动下载源代码。
当一个官方软件包被构建时,它会被发布到 官方仓库 之一:core、extra、multilib,或者先进入某个测试仓库。这些仓库是 二进制 的,不托管在 GitLab 上,而是由 镜像 提供。
用例
Arch 构建系统自动化了与从源码编译相关的特定任务。它的用例包括:
- 任何需要您编译或重新编译软件包的用例。
- 由开发者和打包者为 Arch Linux 构建官方二进制软件包。
- 从尚未提供软件包的软件源码制作和安装新软件包(参见 创建软件包)。
- 自定义现有软件包以满足您的需求(例如,启用或禁用选项、打补丁)。
- 使用您的编译器标志干净地重建整个系统,"类似于 FreeBSD"。
- 干净地构建和安装您自己的自定义内核(参见 内核编译)。
- 使内核模块与自定义内核协同工作。
- 通过编辑 PKGBUILD 中的版本号,轻松编译和安装 Arch 软件包的更新、旧版、beta 或开发版本。
用法
检索 PKGBUILD 源码
要从源码检索构建特定软件包所需的 PKGBUILD 文件,您可以使用 pkgctl 工具或直接使用 Git。
使用 pkgctl 工具
作为先决条件,请 安装 devtools 软件包。pkgctl 是一个用于帮助处理 Arch Linux 软件包构建源码文件的工具。
要使用 pkgctl 克隆包含软件包 pkgname 最新构建文件的 git 仓库,请使用以下命令:
$ pkgctl repo clone pkgbase
pkgctl repo clone --protocol=https pkgbase。请注意,这里的构建源码文件是指 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.conf 的 IgnoreGroup 部分添加此组。
/etc/pacman.conf
IgnoreGroup = modified
如果在系统更新期间官方仓库中有新版本可用,pacman 会打印一条提示,说明它正在跳过此更新,因为它在 IgnoreGroup 部分。此时,应重新构建已修改的软件包,以避免 部分升级。