Arch Build System (简体中文)

From ArchWiki
Jump to: navigation, search
翻译状态: 本文是英文页面 Arch_Build_System翻译,最后翻译时间:2017-10-31,点击这里可以查看翻译后英文页面的改动。

本文简要介绍 Arch 编译系统,同时提供一个使用教程。这不是一个完整的参考指南!

什么是 ABS

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

类 ports 系统又是什么?

'Ports'是 *BSD 使用的一种系统,可以自动下载源代码、解压缩、打补丁、编译和安装。一个“port”仅仅是指用户电脑上的一个目录,根据即将安装的相应软件来命名,包含一些文件来指导源码的下载和编译安装,典型的方式是找到那个目录(或者说port),进行makemake install clean,然后系统就会下载、编译和安装你想要的软件了。

ABS 的概念与之相似

ABS由一个目录树构成,可以用SVN checkout。这个目录树表示(但不包含)所有官方 Arch 软件。ABS子目录并不包含软件包或源代码,而是包含一个PKGBUILD 文件(有时也会有其它文件)。在有PKGBUILD文件的目录里运行makepkg命令,将在目录中编译软件,并打包。然后就可以通过pacman进行安装或升级了。

ABS概览

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

SVN目录树
目录树包含所有官方软件包的构建所需文件,不包括软件包本身和源代码。在svngit仓库中。
PKGBUILD
Bash脚本,包含软件的源代码位置和编译打包指令。
makepkg
ABS的 shell 命令工具,读取 PKGBUILD,下载源码,根据makepkg.conf 中的PKGEXT编译并创建 .pkg.tar.gz.pkg.tar.xz包。也可以用makepkg从AUR或第三方代码构建自定义软件包。参考Creating packages
Pacman
pacman是完全独立的,但是在安装或移除软件包、解决依赖性时都是必需的。它或者被 makepkg 调用或者被手动执行。
AUR
ArchLinux社区的用户维护的软件仓库独立于ABS,包含[unsupported]的PKGBUILDs。它们同样可以可以通过ABS的makepkg工具来编译并打包成可安装软件。ABS 树位于本地机器,而 AUR 则是网站界面。包含成千上万用户共享的 PKGBUILD。如果需要编译官方 Arch 树之外的软件包,AUR 中已经存在的可能性非常大。
Warning: 官方PKGBUILD假定包是在干净的chroot环境中构建的(built in a clean chroot). 在的环境中构建可能会失败或者在运行时有意外行为。 因为如果编译系统动态检查依赖的话,编译结果会受到当前可用包的影响。

SVN目录树

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

每个包有各自的子目录,其中又有repostrunk目录。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那样” 。(使用pacbuilder-svnAUR不支持 git 仓库)
  • 干净地编译安装你自己定制的内核。(参照内核编译(简体中文))
  • 使内核模块(比如某些显卡驱动)在你定制的内核下正常工作
  • 修改 PKGBUILD 中的版本就能方便的编译和安装新的、老的、beta 或者开发版本的 Arch 软件包

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

如何使用 ABS

要获取需要的 PKGBUILD,从源代码编译软件包,需要使用 Svn 或支持 Gitasp

使用 SVN 获取 PKGBUILD

前提

安装subversion包。

非递归checkout

Warning: 不要下载整个仓库,请按下面的说明操作。整个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"而不创建文件。出现这种情况时:

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

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

$ svn update

使用 Git 获取 PKGBUILD

先安装 install 软件包 asp

要获取某个软件包的 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.confIgnoreGroup

/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被移动到另一个仓库之前的包,只需查看日志,找到移动之前的日期或版本即可。

其它工具

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