Arch Build System (简体中文) - ArchWiki

# Arch Build System (简体中文)

From ArchWiki
Jump to navigation Jump to search

相关文章

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

翻译状态： 本文是 Arch_Build_System 的本地化版本。上次翻译日期：2020-1-3。如果英文版本有所更改 ，则您可以帮助同步翻译。

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概览

This article or section needs expansion.

Reason: 区分哪些组件属于ABS。 (Discuss in Talk:Arch Build System (简体中文)#)

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

SVN目录树
  目录树包含所有官方软件包的构建所需文件，不包括软件包本身和源代码。在svn和git仓库中。

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，包含不受支持的PKGBUILD文件。它们同样可以可以通过ABS的makepkg工具来编译并打包成可安装软件。ABS 树位于本地机器，而 AUR 则是网站界面。包含成千上万用户共享的 PKGBUILD。如果需要编译官方 Arch 树之外的软件包，AUR 中已经存在的可能性非常大。

Warning: 官方PKGBUILD假定包是在干净的chroot环境中构建的(built in a clean chroot). 在脏的环境中构建可能会失败或者在运行时有意外行为。 因为如果编译系统动态检查依赖的话，编译结果会受到当前可用包的影响。

### 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)
- 干净地编译安装你自己定制的内核。(参照内核编译(简体中文))
- 使内核模块(比如某些显卡驱动)在你定制的内核下正常工作
- 修改 PKGBUILD 中的版本就能方便的编译和安装新的、老的、beta 或者开发版本的 Arch 软件包

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

## 如何使用 ABS

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

### 使用 SVN 获取 PKGBUILD

#### 前提

安装subversion包。

#### 非递归checkout

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

要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://www.archlinux.org/packages 检查这个包是不是从另一个基础包构建的 (例如python-tensorflow是在tensorflow PKGBUILD里构建的)

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

## 其它工具

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

Categories:

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

Hidden category:

- Pages or sections flagged with Template:Expansion