ABS(Arch Build System)是一套从源码构建并打包软件包的系统。在 Arch 中,pacman 专门管理二进制软件包(包括那些由 ABS 创建的);而 ABS 则是一系列工具,负责把源代码编译成可安装的 .pkg.tar.zst 软件包。
Ports 是 *BSD 使用的一种系统,可以自动下载源代码、解压缩、打补丁、编译和安装软件。一个“port”仅仅是指用户电脑上的一个目录,该目录根据即将安装的软件来命名,它包含一些能指导源码的下载和编译安装的文件。Ports 系统让你只需在 port 目录下运行 make
或 make install clean
就能安装你想要的软件。
ABS 的概念与 Ports 相似。它由为每个 Arch Linux 可用软件包提供的 git 仓库组成。每个目录中并不包含二进制包或源代码,而是包含一个 PKGBUILD 文件(有时也会有其它文件)。在有 PKGBUILD
文件的目录里运行 makepkg 命令,系统就会在目录中下载软件的源代码、编译并打包在构建文件夹里。然后就可以通过 pacman 进行安装或升级了。
工具链
'ABS' 可以作为一个总括性术语来使用,因为它包含并依赖于若干其他部件。因此,尽管从严格意义上来讲并不精确,ABS可指代包含以下工具的完整工具集:
Arch 构建系统包含并依赖于数个组件和工具,分别用于从源码到构建出软件包的各个步骤中:
- 仓库树
- 目录树包含构建所有官方软件包所需的文件,但不包括软件包本身和源代码。这些仓库以 Git 仓库的形式托管在 gitlab.archlinux.org 上。更多详细信息请参阅#仓库结构。
- makepkg
- 一个 shell 命令工具,会读取 PKGBUILD,自动下载源码、编译并创建 .pkg.tar* 包(拓展名由
makepkg.conf
中的PKGEXT
指定)。makepkg 也可以用来从 AUR 或第三方代码构建你自己的自定义软件包,具体细节请参考创建软件包。
- pacman
- pacman 是完全独立的一个系统,但是它在通过 makepkg 或手动安装或移除软件包、解决依赖关系时都是必需的。
- AUR
- Arch 用户软件仓库(AUR)的 PKGBUILD 独立于官方仓库,但其中的软件包同样可以使用 ABS 的工具进行打包构建。它包含成千上万的用户贡献的 PKGBUILD,来提供 Arch 官方仓库中没有的软件。如果需要编译官方 Arch 树之外的软件包,AUR 中已经存在的可能性非常大。
仓库结构
core、extra、core-testing 和 extra-testing 官方软件仓库托管在 Arch Linux GitLab 实例上。
每个包在 archlinux/packaging/packages 下都有其独立的仓库,仓库中包含 PKGBUILD
和用于官方构建的文件。此外,开发人员在构建过程中使用的一些文件也可以在那里找到。
例如,acl包 的目录结构是这样的:
acl ├── keys │ └── pgp │ ├── 259B3792B3D6D319212CC4DCD5BF9FEB0313653A.asc │ ├── 600CD204FBCEA418BD2CA74F154343260542DF34.asc │ └── B902B5271325F892AC251AD441633B9FE837F581.asc └── PKGBUILD
源代码并不直接包含在ABS目录中,而是构建时从 PKGBUILD
里指定的源代码 URL 下载。
用例
Arch 构建系统可以将从源码构建出软件包的一些工作自动化,常见用法包括:
- 需要编译或重新编译软件包
- 从源代码编译并安装 Arch 官方源里没有的软件(详情请参照创建软件包)
- 定制现有的软件包以满足你的特定需求(比如开启或禁用相关选项、打补丁)
- 用你的编译器的 flags 重新构建整个系统,“就像 FreeBSD 那样”
- 干净地编译安装你自己定制的内核。(参照内核编译)
- 使内核模块(比如某些显卡驱动)在你定制的内核下正常工作
- 修改 PKGBUILD 中的版本就能方便地编译和安装新的、老的、beta 或者开发版本的 Arch 软件包
用法
获取 PKGBUILD 源码
要想获取从源代码构建特定软件包所需的 PKGBUILD 文件,可以使用 pkgctl 工具,或者直接使用 Git。
使用 pkgctl 工具
如需使用 pkgctl,请先安装 devtools包。pkgctl 是一个帮助使用 git 为 Arch Linux 构建软件包源文件的工具。
要使用 pkgctl 获取包含软件包 pkgname 最新构建文件的 git 仓库,请使用以下命令:
$ pkgctl repo clone pkgname
pkgctl repo clone --protocol=https pkgname
请注意,这里所说的构建文件是指 PKGBUILD,可能还包括一些其他必要的文件,如密钥。也就是说,是 ABS 所需的基本文件,而不是由包的开发团队编写的源代码文件,例如 C 或 Python 文件。
该命令不仅会提供当前的构建文件,还会提供它的历史版本。此外,还可以使用其他 git 命令来签出旧版本或跟踪更改。
如果想获取特定版本,可以使用以下命令:
$ pkgctl repo clone --switch="2:1.19.5-1" go
如需获取更多详细信息以及其他可用命令,请阅读 pkgctl-repo-clone(1)
直接使用 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 来从 PKGBUILD 构建软件包,请参考 makepkg#配置。
然后把 PKGBUILD 所在目录复制到新的位置。在新目录按需要进行修改。 并按照 makepkg#使用 来构建和安装软件包。
技巧
保留修改过的软件包
pacman 进行升级时会将修改后的软件包升级到仓库中的最新版本,可以通过下面方式避免这个行为:
在 PKGBUILD 中将软件包加入 modified
组:
PKGBUILD
groups=('modified')
然后将此组加入 /etc/pacman.conf
的 IgnoreGroup
:
/etc/pacman.conf
IgnoreGroup = modified
当系统升级发现官方仓库中有新版本时,pacman 会显示软件包因为在 IgnoreGroup 中而被忽略的提示,这时需要从 ABS 编译更新的软件包以防止部分升级。