跳转到内容

Arch 构建系统

来自 Arch Linux 中文维基

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

Ports 是 *BSD 使用的一种系统,可以自动下载源代码、解压缩、打补丁、编译和安装软件。一个“port”仅仅是指用户电脑上的一个目录,该目录根据即将安装的软件来命名,它包含一些能指导源码的下载和编译安装的文件。Ports系统让你只需在port目录下运行makemake install clean就能安装你想要的软件。

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

ABS概览[编辑 | 编辑源代码]

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

仓库树
目录树包含所有官方软件包的构建所需的文件,但不包括软件包本身和源代码。这些仓库以Git仓库的形式托管在gitlab.archlinux.org上。更多详细信息请参阅#仓库结构
PKGBUILD
Bash脚本,包含软件的源代码的URL和编译打包指令。
makepkg
ABS的 shell 命令工具,读取 PKGBUILD,下载源码,编译并创建 .pkg.tar*包(拓展名由makepkg.conf中的PKGEXT指定)。makepkg也可以用来从AUR或第三方代码构建你自己的自定义软件包。参考Creating packages
Pacman
pacman是完全独立的一个系统,但是它在安装或移除软件包、解决依赖关系时都是必需的。它被 makepkg 调用或者被手动执行。
AUR
ArchLinux社区的用户维护的软件仓库独立于ABS,包含不受支持的PKGBUILD文件。它们同样可以可以通过ABS的makepkg工具来编译并打包成可安装软件。与只是一个git仓库的 ABS 树不同,AUR 是一个有着精致外观及多种交互功能的网站界面。它包含成千上万的用户贡献的 PKGBUILD,来提供Arch官方仓库中没有的软件。如果需要编译官方 Arch 树之外的软件包,AUR 中已经存在的可能性非常大。
警告: 官方PKGBUILD假定包是在干净的 chroot 环境中构建英语DeveloperWiki:Building in a clean chroot的。在“脏”的环境中构建可能会失败或者在运行时有意外行为。 因为如果编译系统动态检查依赖的话,编译结果会受到当前系统可用包的影响。

仓库结构[编辑 | 编辑源代码]

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

每个包在archlinux/packaging/packages下都有其独立的仓库,仓库中包含PKGBUILD和用于官方构建的文件。此外,开发人员在构建过程中使用的一些文件也可以在那里找到。

例如,acl 的目录结构是这样的:

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

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

我为什么要用ABS[编辑 | 编辑源代码]

常见的使用 ABS 的场景包括:

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

使用 Arch Linux 不一定会用到 ABS,但 ABS 确实可以自动化进行许多源码编译工作。

如何使用 ABS[编辑 | 编辑源代码]

获取 PKGBUILD 源码[编辑 | 编辑源代码]

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

使用 pkgctl 工具[编辑 | 编辑源代码]

如需使用pkgctl,请先安装 devtools

要使用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 编译更新的软件包以防止部分升级。

其它工具[编辑 | 编辑源代码]

  • pbget - 从web接口直接获取某个包的PKGBUILD,支持AUR.