跳转到内容

Arch 构建系统

来自 Arch Linux 中文维基

Arch 构建系统(Arch build system,ABS)是一套从源码构建并打包软件包的系统。在 Arch 中,pacman 专门管理二进制软件包(包括那些由 ABS 创建的);而 ABS 则是一系列工具,负责把源代码编译成可安装的 .pkg.tar.zst 软件包。

Arch 构建系统类似于 *BSD 上的 ports,其用于自动化从源码构建软件包的过程。Port 可以自动下载源代码、解压缩、打补丁、编译和安装软件。一个 port 仅仅是指用户电脑上的一个目录,该目录根据即将安装的软件来命名,它包含一些能指导源码的下载和编译安装的文件。Port 系统让你只需在 port 目录下运行 makemake install clean 就能安装你想要的软件。

ABS 的概念与 Ports 相似。它由为每个 Arch Linux 可用软件包提供的 git 仓库组成。每个目录中并不包含二进制包或源代码,而是包含一个 PKGBUILD 文件(有时也会有其它文件)。在有 PKGBUILD 文件的目录里运行 makepkg 命令,系统就会在目录中下载软件的源代码、编译并打包在构建文件夹里。然后就可以通过 pacman 进行安装或升级了。

工具链

'ABS' 可以作为一个总括性术语来使用,因为它包含并依赖于若干其他部件。因此,尽管从严格意义上来讲并不精确,ABS可指代包含以下工具的完整工具集:

Arch 构建系统包含并依赖于数个组件和工具,分别用于从源码到构建出软件包的各个步骤中:

仓库树
目录树包含构建所有官方软件包所需的文件,但不包括软件包本身和源代码。这些仓库以 Git 仓库的形式托管在 gitlab.archlinux.org 上。更多详细信息请参阅#仓库结构
PKGBUILD
Bash 脚本,包含软件的源代码的 URL 和编译打包指令。
makepkg
一个 shell 命令工具,会读取 PKGBUILD,自动下载源码、编译并创建 .pkg.tar* 包(拓展名由 makepkg.conf 中的 PKGEXT 指定)。makepkg 也可以用来从 AUR 或第三方代码构建你自己的自定义软件包,具体细节请参考创建软件包
pacman
pacman 是完全独立的一个系统,但是它在通过 makepkg 或手动安装或移除软件包、解决依赖关系时都是必需的。
pkgctl/devtools
devtools 是用于为 Arch Linux 发行版构建和维护官方仓库软件包的一系列工具。pkgctl(1) 是一个高层级工具,用于帮助从软件源码仓库构建 Arch Linux 软件包并发布到二进制软件仓库中。
AUR
Arch 用户软件仓库(AUR)的 PKGBUILD 独立于官方仓库,但其中的软件包同样可以使用 ABS 的工具进行打包构建。它包含成千上万的用户贡献的 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

源代码并不直接包含在ABS目录中,而是构建时从 PKGBUILD 里指定的源代码 URL 下载。

在构建完官方软件包后,它会被发布到官方仓库之一:coreextramultilib 或是先放到测试仓库中。这些仓库存放着二进制文件,并不存放在 GitLab 上,而是由镜像源进行分发。

用例

Arch 构建系统可以将从源码构建出软件包的一些工作自动化,常见用法包括:

  • 需要编译或重新编译软件包
  • 由开发者和打包人员为 Arch Linux 构建官方二进制软件包
  • 从源代码编译并安装 Arch 官方源里没有的软件(详情请参照创建软件包
  • 定制现有的软件包以满足你的特定需求(比如开启或禁用相关选项、打补丁)
  • 用你的编译器的 flags 重新构建整个系统,“就像 FreeBSD 那样”
  • 干净地编译安装你自己定制的内核。(参照内核编译
  • 使内核模块(比如某些显卡驱动)在你定制的内核下正常工作
  • 修改 PKGBUILD 中的版本就能方便地编译和安装新的、老的、beta 或者开发版本的 Arch 软件包

用法

获取 PKGBUILD 源码

要想获取从源代码构建特定软件包所需的 PKGBUILD 文件,可以使用 pkgctl 工具,或者直接使用 Git

使用 pkgctl 工具

如需使用 pkgctl,请先安装 devtoolspkgctl 是一个帮助为 Arch Linux 构建软件包源文件的工具。

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

$ pkgctl repo clone pkgname
提示:默认情况下通过 SSH 获取,如果没有在 Arch GitLab 账户中设置 SSH 密钥,则需要通过 HTTPS 获取: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.confIgnoreGroup

/etc/pacman.conf
IgnoreGroup = modified

当系统升级发现官方仓库中有新版本时,pacman 会显示软件包因为在 IgnoreGroup 中而被忽略的提示,这时需要从 ABS 编译更新的软件包以防止部分升级