Arch Build System (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Arch_Build_System翻译。上次翻译日期:2021-2-12。如果英文版本有所更改,则您可以帮助同步翻译。

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

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

ABS 的概念与Ports相似。ABS的一部分是SVN仓库或等价的Git仓库,这个仓库中每个目录与Arch Linux的官方软件包一一对应。每个目录中并不包含二进制包或源代码,而是包含一个PKGBUILD文件(有时也会有其它文件)。在有PKGBUILD文件的目录里运行makepkg命令,系统就会在目录中下载软件的源代码、编译并打包在build文件夹里。然后就可以通过pacman进行安装或升级了。

ABS概览

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

仓库树
目录树包含所有官方软件包的构建所需的文件,但不包括软件包本身和源代码。这可以通过svngit仓库来获取。具体请参见#仓库树
PKGBUILD
Bash脚本,包含软件的源代码的URL和编译打包指令。
makepkg
ABS的 shell 命令工具,读取 PKGBUILD,下载源码,编译并创建 .pkg.tar.gz.pkg.tar.xz包(拓展名由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环境中构建的。 在“脏”的环境中构建可能会失败或者在运行时有意外行为。 因为如果编译系统动态检查依赖的话,编译结果会受到当前系统可用包的影响。

仓库树

core, extratesting 官方软件仓库 可从packages 仓库checkout. 而communitymultilibcommunity仓库。

每个包有各自的子目录,其中又有repostrunk目录。repos又进一步按仓库名(如core)和架构细分。repos里的PKGBUILD和其它文件用来构建官方包。trunk里的文件是给开发者用的,并最终复制到repos中。

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

acl
acl/repos
acl/repos/core-x86_64
acl/repos/core-x86_64/PKGBUILD
acl/trunk
acl/trunk/PKGBUILD

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

我为什么要用ABS

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

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

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

如何使用 ABS

要想获取从源代码构建特定软件包所需的PKGBUILD文件,需要使用 Svn 或支持 Gitaspasp是一个对svntogit的简单封装。在下文中介绍了基于svn的方法以及基于git的方法

使用 SVN 获取 PKGBUILD

前提

安装subversion包。

checkout仓库

警告: 不要下载整个仓库,请按下面的说明操作。整个SVN仓库非常大,不只会占用大量的硬盘空间,archlinux.org服务器也会因为下载产生费用。非正常使用可能会导致你的地址被封禁。不要对公共SVN进行任何脚本操作。

要checkout core, extra,和testing 官方软件仓库:

$ svn checkout --depth=empty svn://svn.archlinux.org/packages

要checkout communitymultilib仓库:

$ svn checkout --depth=empty svn://svn.archlinux.org/community

两条命令都只是创建了空目录,但它知道这是SVN checkout目录。

Checkout软件包

在刚才checkout的SVN仓库(packagescommunity)中执行:

$ svn update package-name

这条命令把指定的包同步到你的checkout目录。以后在顶层目录执行svn update时,这个包也会更新。

如果指定的包不存在,svn不会产生警告,只是显示类似"At revision 115847"而不创建文件。出现这种情况时:

提示: 要check旧版本,参考#Checkout旧版本软件包.

如果想在最新的版本进行编译,定期执行:

$ svn update

使用 Git 获取 PKGBUILD

先安装 install 软件包 aspAsp 是通过Git接口获取Arch Linux的软件包的源代码文件的工具。另外可以参考Arch Linux BBS论坛帖子[1]

要获取某个软件包的 svntogit 仓库:

$ asp checkout pkgname

这个命令会将软件包的 git 仓库克隆到一个目录。

要更新本地仓库,在仓库目录执行 asp update,然后执行 git pull.

可以使用 git 的其它命令获取软件包的老版本,或记录自定义改动。关于怎么用git,请参考 git 页面。

仅要获取某个软件包当前版本的快照,执行:

$ asp export pkgname

构建软件包

关于如何配置makepkg来从PKGBUILD构建软件包,请参考makepkg (简体中文)#配置

PKGBUILD所在目录复制到新的位置。在新目录按需要进行修改。 并按照makepkg (简体中文)#使用来构建和安装软件包。

技巧

保留修改过的软件包

Pacman 进行升级时会将修改后的软件包升级到仓库中的最新版本,可以通过下面方式避免这个行为:

在 PKGBUILD 中将软件包加入 modified 组.

PKGBUILD
groups=('modified') 

然后将此组加入/etc/pacman.confIgnoreGroup

/etc/pacman.conf
IgnoreGroup = modified

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

Checkout旧版本软件包

checkout的SVN仓库目录 (即"packages"或"community") 中查看日志:

$ svn log package-name

从历史记录中找出要checkout的版本。例如要checkout版本r1729:

$ svn update -r1729 package-name

已存在的package-name目录会更新成指定版本。

也可以指定一个日期,如果当天没有对应版本,svn会找出之前的最近版本。下面的例子checks out了2009-03-03的版本:

$ svn update -r'{20090303}' package-name

要checkout被移动到另一个仓库之前的包,只需查看日志,找到移动之前的日期或版本即可。

其它工具

  • pbget - 从web接口直接获取某个包的PKGBUILD,支持AUR.
  • asp - 管理Arch Linux包构建源文件的工具。使用了git接口获取新的源。