# Arch Build System (简体中文)

相关文章

- Arch packaging standards
- Creating packages
- Kernel Compilation with ABS
- PKGBUILD
- makepkg
- pacman
- 官方软件仓库
- AUR

翻译状态： 本文是英文页面 Arch_Build_System 的翻译，最后翻译时间：2014-04-12，点击这里可以查看翻译后英文页面的改动。

本文简要介绍 Arch 编译系统，同时提供一个使用教程。这不是一个完整的参考指南！如果需要更多信息，请参考手册页面。

注意: ABS 每天同步一次，所以可能会有一些滞后。

## 什么是 ABS

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

### 类 ports 系统又是什么？

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

### ABS 的概念与之相似

ABS由一个目录树构成(the ABS Tree)，位于`/var/abs`。它包含许多子目录，每个子目录都属于某一类别，都以相应的可创建的软件包命名。这个目录树表示(但不包含)所有官方 Arch 软件，可以通过 SVN 系统取得。你可以把一个子目录称为一个“ABS”，就像称呼“port“那样。这些“ABS”(或者说子目录)并不包含软件包或源代码, 相对地，它包含一个PKGBUILD 文件(有时也会有其它文件)。PKGBUILD是一个简单的Bash脚本——一个文本文件（包含对编译和打包过程的指示、包含源码包的下载地址）。ABS最重要的部分就是PKGBUILD。运行 ABS makepkg 命令，将先编译软件，然后在编译目录打包。然后就可以通过 Arch Linux 的软件包管理器pacman进行安装、升级和删除了。

### ABS概览

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

ABS tree
  `/var/abs/`下的目录结构。包含`/etc/abs.conf`指定的所有 Arch 官方软件。这些树会在安装 abs 之后，运行`abs`脚本的时候创建。

PKGBUILD
  Bash脚本，包含软件的源代码位置和编译打包指令。

makepkg
  ABS的 shell 命令工具,读取 PKGBUILD，下载源码，根据`makepkg.conf` 中的`PKGEXT`编译并创建 `.pkg.tar.gz` 或 `.pkg.tar.xz`包。

Pacman
  Pacman是完全独立的，但是在安装或移除软件包、解决依赖性时都是必需的。它或者被 makepkg 调用或者被手动执行。

AUR
  ArchLinux社区的用户维护的软件仓库独立于ABS，包含[unsupported]的PKGBUILDs。它们同样可以可以通过ABS的makepkg工具来编译并打包成可安装软件。ABS 树位于本地机器，而 AUR 则是网站界面。包含成千上万用户共享的 PKGBUILD。如果需要编译官方 Arch 树之外的软件包，AUR 中已经存在的可能性非常大。

## 我为什么要用ABS

ABS 可以用来:

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

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

## 如何使用 ABS

使用ABS通过以下步骤来构建软件包:

1. 使用pacman来安装abs 软件包。
2. 以root权限运行`abs`来与 Arch Linux 的服务器同步ABS文件树。
3. 复制需要构建的文件(一般在`/var/abs/<repo>/软件包名称`目录下)到一个用于构建的目录。
4. 切换到构建目录，编辑`PKGBUILD`文件(如果需要的话) 然后运行`makepkg`.
5. 根据PKGBUILD文件中的指令, makepkg 程序会自动下载源码包,解压, 打上补丁, 根据`makepkg.conf`中的`CFLAGS`编译它, 并将二进制文件打包为扩展名为`.pkg.tar.gz`或者`.pkg.tar.xz`的文件中.
6. 安装只需要简单地运行`pacman -U <.pkg.tar.xz文件>`删除软件包也同样使用pacman.

### 安装工具

首先从官方软件仓库中安装软件包abs.

需要的依赖会被自动安装，比如rsync. 安装编译需要的工具链可以通过软件包组 base-devel.

### /etc/abs.conf

使用root编辑`/etc/abs.conf`，包含你想要仓库。

删除除你想要的软件仓库前的叹号，比如：

    REPOS=(core extra community !testing)

### ABS树

当你第一次运行abs时，它用cvs系统令ABS树与Arch服务器同步。那么ABS树到底是什么呢？它位于/var/abs下，看起来是这样的：

    | -- core/
    |     || -- acl/
    |     ||     || -- PKGBUILD
    |     || -- attr/
    |     ||     || -- PKGBUILD
    |     || -- abs/
    |     ||     || -- PKGBUILD
    |     || -- autoconf/
    |     ||     || -- PKGBUILD
    |     || -- ...
    | -- extra/
    |     || -- acpid/
    |     ||     || -- PKGBUILD
    |     || -- apache/
    |     ||     || -- PKGBUILD
    |     || -- ...
    | -- community/
    |     || -- ...

所以说ABS树与软件包数据库有着完全一致的结构：

- 一级目录：软件仓库名
- 二级目录：软件的名字。
- 三级目录：PKGBUILD (包含编译软件包需要的信息) 和其它相关文件(补丁和(或)其它打包所需的文件)

ABS目录中并没有编译软件所需的源代码，PKGBUILD文件包含了一个URL，源码包将从那里自动下载。

#### 下载 ABS 树

以root身份运行：

    # abs

ABS树会在`/var/abs`下创建。你会发现ABS树有几个分枝，这些分枝与你在`/etc/abs.conf`中的选择相对应。

abs命令也用于定期地同步和更新你的ABS树。

只同步一个软件（格式：所在仓库/名称，比如 core/abs）：

    # abs <repository>/<package>

这样不用下载整个 abs 树就能编译。

#### /etc/makepkg.conf

`/etc/makepkg.conf`设定环境变量和编译器的flags。如果你使用SMP系统也许会希望编辑它。默认的设置是为i686和 x86_64优化的，在这些架构的单CPU系统上很有效。(默认设置可以在SMP机器上使用，但只会利用一个核心／CPU——参见makepkg.conf).

#### 修改 /etc/makepkg.conf 中的 PACKAGER 变量

设置 `/etc/makepkg.conf`文件中的 PACKAGER 变量是一个可选但又极力推荐的步骤。它能提供一个“标志“来快速识别某个包是由你打包或安装的，而不是这个包的官方维护者！使用expac 可以容易的完成这个工作。

##### 列出所有包 （包括从 AUR 中获取的）

    $ grep myname /etc/makepkg.conf
    PACKAGER="myname <myemail@myserver.com>

    $ expac "%n %p" | grep "myname" | column -t
    archey3 myname
    binutils myname
    gcc myname
    gcc-libs myname
    glibc myname
    tar myname

##### 只列出软件仓库中的包

这个例子只列出了包含在`/etc/pacman.conf`的软件仓库中的包：

    $ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1)
    binutils
    gcc
    gcc-libs
    glibc
    tar

##### 建立一个工作目录

你必须建立一个工作目录，编译将在那里进行。所有的事情都在那里完成；千万不要直接在ABS树里编译。在你的home文件夹下就很好，当然，有些使用者更愿意在`/var/abs/`下创建一个属于普通用户的“local“文件夹。

建立你的工作目录。比如：

    $ mkdir -p $HOME/abs

把ABS从ABS树(var/abs/repository/pkgname)复制到编译目录。

#### 编译软件包

ABS是一种精致的工具，它为包创建过程提供强大的协助和高度的可定制性，并且生成一个可安装的包文件。ABS方式包括从ABS树自制ABS到工作目录和执行makepkg。在下面的例子中，我们将创建slim软件包。

把slim的ABS复制到工作目录。

    $ cp -r /var/abs/extra/slim/ ~/abs

登入工作目录。

    $ cd ~/abs/slim

修改 PKGBUILD 文件以进行增加或移除某些组件，打补丁或修改包的版本等工作。(可选的):

    $ nano PKGBUILD

用普通用户执行makepkg (带 `-s` 参数以便在安装时自动处理依赖关系):

    $ makepkg -s

以root身份安装：

    # pacman -U slim 1.3.0-2-i686.pkg.tar.xz

这样就行了。你已经从源代码编译了slim并用pacman把它干净地安装到了系统中。卸载软件也用pacman来解决。(`pacman -R slim`)

- ABS方式在某种程度上实现了自动化，为我们增添了便利。同时，通过PKGBUILD，它也保持了完全的透明度以及对编译安装流程的控制。

#### fakeroot

使用ABS编译软件方法与传统编译方法基本相同。 (一般包含 `./configure, make, make install` 等步骤), 不过软件被安装到了一个叫做fake root 的环境。 (fake root，简单的说，是在编译工作目录下的一个子目录，这个子目录的功能和行为与系统根目录(`/`)相同。与 fakeroot 程序结合, makepkg 创建了一个虚拟的根目录, 然后将编译好的二进制文件和其他相关文件以 root 用户身份安装到其中)。然后 fake root, 或者包含了编译好的软件的子目录，被压缩到以`.pkg.tar.xz`为后缀的压缩文档中，成为软件包. 当软件包被调用的时候，pacman 解压缩软件包并将它安装到系统真正的根目录(`/`)中。

### 保留修改过的软件包

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

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

    PKGBUILD

    groups=('modified')

然后将此组加入`/etc/pacman.conf` 的 `IgnoreGroup`：

    /etc/pacman.conf

    IgnoreGroup = modified

这样软件包的升级就会被忽略，这时需要从 ABS 编译更新的软件包以防止部分升级。

Categories:

- About Arch (简体中文)
- Package development (简体中文)
- Package management (简体中文)