ArchLinux的ABS

 什么是 ABS

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

类 ports 系统又是什么?

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

ABS的概念与之相似

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

漫游ABS

用 pacman -S abs 安装abs。以root身份运行'abs',通过与Arch Linux服务器同步来创建ABS树。举例来说,如果你打算从源代码编译nano,就把/var/abs/core/base/nano复制到某一目录,然后到那个目录里运行makepkg'。就这么简单。Makepkg会试着读取并执行包含在PKGBUILD中的指示。适当的源码包将被自动下载和解压,根据/etc/makepkg.conf指定的CFLAGS编译,最后压缩成扩展名为.pkg.tar.gz的软件包,每一步都依照PKGBUILD中相应的指示来进行。安装只需要运行pacman -U nano.pkg.tar.xz。卸载同样由pacman来解决。

PKGBUILD和其它的文件当然可以被定制,以满足你的需求。你也可以用ABS makepkg功能从外来的代码编译你自己的软件包。(参照/var/abs/core/下原始的PKGBUILD和install文件)

有了ABS树,一个Arch用户只要稍动手就能自动地从源代码编译获得任何Arch软件。

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:

# pacman -S abs

需要的依赖会被自动安装,比如rsync

并安装编译所需的软件:

# pacman -S base-devel
警告: 在抱怨缺少和编译有关的依赖关系缺失前,请确认是否执行此步骤。makepkg 进行编译时会假定 "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树与软件包数据库有着完全一致的结构:

  • 第一级目录为软件仓库名
  • 第二级目录代表ABS本身,目录名就是你打算创建的软件的名字。
  • PKGBUILD文件包含所有有关软件包的信息。
  • 而且,ABS目录可能还包含了补丁和(或)其它打包所需的文件。

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——参见 Safe Cflags.).

Set the PACKAGER variable in /etc/makepkg.conf

Setting the PACKAGER variable in /etc/makepkg.conf is an optional but highly recommended step. It allows a "flag" to quickly identify which packages have been built and/or installed by YOU, not the official maintainer! This is easily accomplished using expac available from the community repo:

Showing All Packages (including those from 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
Showing Only Packages Containing in Repos

This example only shows packages contained in the repos defined in /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/branch/category/pkgname)复制到你的工作目录/path/to/build/dir。

编译软件包

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

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

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

登入工作目录。

$ cd ~/abs/slim

Modify the PKGBUILD to add or remove support for components, to patch or to change package versions, etc. (optional):

$ nano PKGBUILD

用普通用户执行makepkg (with -s switch to install with automatic dependency handling):

$ makepkg -s

以root身份安装:

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

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

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

Essentially, the same steps are being executed in the traditional method (generally including the ./configure, make, make install steps) but the software is installed into a fake root environment. (A fake root is simply a subdirectory within the build directory that functions and behaves as the system's root directory. In conjunction with the fakeroot program, makepkg creates a fake root directory, and installs the compiled binaries and associated files into it, with root as owner.) The fake root, or subdirectory tree containing the compiled software, is then compressed into an archive with the extension .pkg.tar.xz, or a package. When invoked, pacman then extracts the package (installs it) into the system's real root directory (/).

传统方法编译安装过程(不使用 ABS)

如果你还不熟悉编译源代码,那么你需要知道大多数软件包(但不是所有的)都可以通过这种传统方式从源代码编译创建:

  • 下载源码包(浏览器、wget或什么其它的方法)
  • 解压缩:
$ tar -xzf foo-0.99.tar.gz

或者

$ tar -xjf foo-0.99.tar.bz2
  • 进入目录:
$ cd foo-0.99
  • 配置软件包:一般来说,在源码目录里都有一个叫做configure的脚本用来配置软件包(添加或移除某些支持、选择安装位置,等等)并检查在你的电脑上是否有该软件包所需的全部软件。这样来运行它:
$ ./configure [option]

你应该先试试help选项以更好地理解它的工作方式:

$ ./configure --help

如果没有--prefix选项,大多数脚本会把/usr/local作为安装路径,而另一些使用/usr。为了协调一致,一般建议使用--prefix=/usr/local选项。把个人的程序安装到/usr/local是很好的做法,把/usr留给发行版所管理的包。这样就保证了个人程序的版本能与发行版的包管理系统(在Arch上是pacman)所管辖的那些共存。

$ ./configure --prefix=/usr/local
  • 编译:
$ make
  • 安装:
# make install
  • 卸载可以这样完成,进入源码目录,运行:
# make uninstall

无论如何,你每次都应该读一读INSTALL文件以了解软件包被编译和安装的方式。并非所有的包都使用configure; make; make install系统

注意: 当然,上述传统方法依然可以在Arch Linux中使用。然而,如果你不小心,文件也许会散落在 pacman (或其他包管理器)没有注意的地方。你仅应在充分了解手动编译和系统软件跟踪时才可以使用,并且如果你使用一个软件包管理器可能会在 Arch (或其它发行版) 中导致问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值