Arch 构建系统

出自 ArchWiki
(重定向自 ABS

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

Arch 构建系统可以比作 *BSD 的 ports,后者自动化了从源代码构建软件的过程。该系统使用一个 port 来下载、解包、打补丁、编译和安装给定的软件。一个 port 仅仅是用户计算机上的一个小目录,以要安装的相应软件命名,其中包含一些文件,其中包含从源代码构建和安装软件的指令。这使得安装软件就像在 port 目录下键入 makemake install clean 一样简单。

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

工具链

此条目或章节需要扩充。

理由:pkgctl/devtools 添加到列表中。(在 Arch 构建系统讨论页 中讨论)

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

仓库
包含构建所有官方软件包所需文件但不包含软件包本身或软件源文件的目录结构。它以 Git 仓库的形式提供,托管在 gitlab.archlinux.org 上。有关更多信息,请参阅 #仓库结构 部分。
PKGBUILD
一个 Bash 脚本,其中包含源代码的 URL 以及编译和打包指令。
makepkg
一个 shell 命令工具,它读取 PKGBUILD,自动下载和编译源代码,并根据 makepkg.conf 中的 PKGEXT 数组创建 .pkg.tar*。您也可以使用 makepkg 从 AUR 或第三方来源制作您自己的自定义软件包。有关更多信息,请参阅 创建软件包
pacman
pacman 是完全独立的,但必须被调用,无论是通过 makepkg 还是手动,来安装和移除构建的软件包以及获取依赖项。
AUR
Arch 用户仓库独立于官方 PKGBUILD 仓库,但 AUR 中的软件包可以使用相同的工具构建。它包含数千个用户贡献的 PKGBUILD,用于官方 Arch 软件包中不可用的软件。如果您需要构建官方 Arch 树之外的软件包,它很可能在 AUR 中。
警告:官方 PKGBUILD 假定软件包在干净的 chroot 环境中构建。在不干净的构建系统上构建软件可能会失败或在运行时导致意外行为,因为如果构建系统动态检测依赖项,则结果取决于构建系统上可用的软件包。

仓库结构

coreextracore-testingextra-testing 官方仓库 托管在 Arch Linux GitLab 实例上。

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

例如,acl 的目录树看起来像这样

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

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

用例

Arch 构建系统自动化了与源代码编译相关的某些任务。其用例包括

此条目或章节需要扩充。

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

用法

获取 PKGBUILD 源码

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

使用 pkgctl 工具

作为前提条件,安装 devtools 软件包。pkgctl 是一个帮助使用 git 处理 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 以从您检出的 PKGBUILD 构建软件包,如 makepkg#Configuration 中所述。

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

技巧与窍门

保留修改过的软件包

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

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

PKGBUILD
groups=('modified')

将此组添加到 /etc/pacman.conf 中的 IgnoreGroup 部分。

/etc/pacman.conf
IgnoreGroup = modified

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