Arch Build System (简体中文)
ABS(Arch Build System)指的是Arch的构建系统。这是一种从源代码编译软件的类 ports 系统。在Arch中,pacman 专门管理二进制软件包(包括那些由ABS创建的),而ABS则是一系列工具,负责把源代码编译成可安装的.pkg.tar.xz
软件包。
'Ports'是 *BSD 使用的一种系统,可以自动下载源代码、解压缩、打补丁、编译和安装。一个“port”仅仅是指用户电脑上的一个目录,该目录根据即将安装的软件来命名,这个目录包含一些能指导源码的下载和编译安装的文件。Ports系统让你只需在port目录下运行make
或 make install clean
就能安装你想要的软件。
ABS 的概念与Ports相似.ABS由一个目录树构成,可以用SVN checkout。这个目录树表示(但不包含)所有官方 Arch 软件。ABS子目录并不包含软件包或源代码,而是包含一个PKGBUILD 文件(有时也会有其它文件)。在有PKGBUILD文件的目录里运行makepkg命令,将在目录中编译软件,并打包。然后就可以通过pacman进行安装或升级了。
ABS概览
'ABS'可以作为一个总括性术语来使用,因为它包含并依赖于若干其他部件。因此,尽管从严格意义上来讲并不精确,ABS可指代包含以下工具的完整工具集:
- makepkg
- ABS的 shell 命令工具,读取 PKGBUILD,下载源码,根据
makepkg.conf
中的PKGEXT
编译并创建.pkg.tar.gz
或.pkg.tar.xz
包。也可以用makepkg从AUR或第三方代码构建自定义软件包。参考Creating packages。
- Pacman
- pacman是完全独立的,但是在安装或移除软件包、解决依赖性时都是必需的。它被 makepkg 调用或者被手动执行。
- AUR
- ArchLinux社区的用户维护的软件仓库独立于ABS,包含不受支持的PKGBUILD文件。它们同样可以可以通过ABS的makepkg工具来编译并打包成可安装软件。ABS 树位于本地机器,而 AUR 则是网站界面。包含成千上万用户共享的 PKGBUILD。如果需要编译官方 Arch 树之外的软件包,AUR 中已经存在的可能性非常大。
SVN目录树
core, extra和testing 官方软件仓库 可从官方SVN的packages 仓库checkout. 而community和multilib在community SVN仓库。
每个包有各自的子目录,其中又有repos
和trunk
目录。repos
又进一步按仓库名(如core)和架构细分。repos
里的PKGBUILD和其它文件用来构建官方包。trunk
里的文件是正在开发的,并最终复制到repos
中。
例如,acl的目录结构是这样的:
acl acl/repos acl/repos/core-i686 acl/repos/core-i686/PKGBUILD acl/repos/core-x86_64 acl/repos/core-x86_64/PKGBUILD acl/trunk acl/trunk/PKGBUILD
源代码并不直接包含在ABS目录中,而是构建时从PKGBUILD
里指定的源代码URL下载。
我为什么要用ABS
ABS 可以用来:
- 编译或重新编译软件包
- 从源代码编译Arch官方源里没有的软件(详情请参照创建软件包)
- 定制现有的软件包以满足你的特定需求(通过开启或禁用相关选项)
- 用你的编译器的flags重新构建整个系统,“就像FreeBSD那样” 。(使用 pacman-src-gitAUR[断开的链接:package not found])
- 干净地编译安装你自己定制的内核。(参照内核编译(简体中文))
- 使内核模块(比如某些显卡驱动)在你定制的内核下正常工作
- 修改 PKGBUILD 中的版本就能方便的编译和安装新的、老的、beta 或者开发版本的 Arch 软件包
使用 Arch Linux 不一定会用到 ABS,但 ABS 确实可以自动化进行许多源码编译工作。
如何使用 ABS
要想获取从源代码构建特定软件包所需的PKGBUILD文件,需要使用 Svn 或支持 Git 的 asp。asp是一个对svntogit的简单封装。在下文中介绍了基于svn的方法以及基于git的方法。
使用 SVN 获取 PKGBUILD
前提
非递归checkout
要checkout core, extra,和testing 官方软件仓库:
$ svn checkout --depth=empty svn://svn.archlinux.org/packages
要checkout community和multilib仓库:
$ svn checkout --depth=empty svn://svn.archlinux.org/community
两条命令都只是创建了空目录,但它知道这是SVN checkout目录。
Checkout软件包
在刚才checkout的SVN仓库(packages或community)中执行:
$ svn update package-name
这条命令把指定的包同步到你的checkout目录。以后在顶层目录执行svn update时,这个包也会更新。
如果指定的包不存在,svn不会产生警告,只是显示类似"At revision 115847"而不创建文件。出现这种情况时:
- 检查软件包名的拼写
- 检查包是不是被移到了另一个仓库 (例如从community到主仓库)
- 到 https://archlinux.org/packages 检查这个包是不是从另一个基础包构建的 (例如python-tensorflow是在tensorflow PKGBUILD里构建的)
如果想在最新的版本进行编译,定期执行:
$ svn update
使用 Git 获取 PKGBUILD
要获取某个软件包的 svntogit 仓库:
$ asp checkout pkgname
这个命令会将软件包的 git 仓库克隆到一个目录。
要更新本地仓库,在仓库目录执行 asp update
,然后执行 git pull
.
可以使用 git 的其它命令获取软件包的老版本,或记录自定也改动,详情请参考 git 页面。
仅要获取某个软件包当前版本的快照,执行:
$ asp export pkgname
构建软件包
关于如何配置makepkg来从PKGBUILD构建软件包,请参考makepkg (简体中文)#配置。
把PKGBUILD所在目录复制到新的位置。在新目录按需要进行修改。 并按照makepkg (简体中文)#使用来构建和安装软件包。
技巧
保留修改过的软件包
Pacman 进行升级时会将修改后的软件包升级到仓库中的最新版本,可以通过下面方式避免这个行为:
在 PKGBUILD 中将软件包加入 modified
组.
PKGBUILD
groups=('modified')
然后将此组加入/etc/pacman.conf
的 IgnoreGroup
:
/etc/pacman.conf
IgnoreGroup = modified
当系统生升级发现官方仓库中有新版本时,pacman会显示软件包因为在IgnoreGroup中而被忽略的提示,这时需要从 ABS 编译更新的软件包以防止部分升级。
Checkout旧版本软件包
在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被移动到另一个仓库之前的包,只需查看日志,找到移动之前的日期或版本即可。