ABS(Arch Build System)指的是Arch的构建系统。这是一种从源代码编译软件的类 ports 系统。在Arch中,pacman 专门管理二进制软件包(包括那些由ABS创建的),而ABS则是一系列工具,负责把源代码编译成可安装的.pkg.tar.gz/.pkg.tar.xz
软件包。
'Ports'是 *BSD 使用的一种系统,可以自动下载源代码、解压缩、打补丁、编译和安装。一个“port”仅仅是指用户电脑上的一个目录,根据即将安装的相应软件来命名,包含一些文件来指导源码的下载和编译安装,典型的方式是找到那个目录(或者说port),进行make
或 make install clean
,然后系统就会下载、编译和安装你想要的软件了。
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进行安装、升级和删除了。
用 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可指代包含以下工具的完整工具集:
/var/abs/
下的目录结构。包含
/etc/abs.conf
指定的所有 Arch 官方软件。这些树会在安装
abs 之后,运行
abs
脚本的时候创建。
makepkg.conf
中的
PKGEXT
编译并创建
.pkg.tar.gz
或
.pkg.tar.xz
包。
ABS 可以用来:
使用 Arch Linux 不一定会用到 ABS,但 ABS 确实可以自动化进行许多源码编译工作。
使用ABS通过以下步骤来构建软件包:
abs
来与 Arch Linux 的服务器同步ABS文件树。/var/abs//软件包名称
目录下)到一个用于构建的目录。PKGBUILD
文件(如果需要的话) 然后运行makepkg
. makepkg.conf
中的CFLAGS
编译它, 并将二进制文件打包为扩展名为.pkg.tar.gz
或者.pkg.tar.xz
的文件中. pacman -U <.pkg.tar.xz文件>
删除软件包也同样使用pacman.首先安装abs:
# pacman -S abs
需要的依赖会被自动安装,比如rsync
并安装编译所需的软件:
# pacman -S base-devel
使用root编辑/etc/abs.conf
,包含你想要仓库。
删除除你想要的软件仓库前的叹号,比如:
REPOS=(core extra community !testing)
当你第一次运行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文件包含了一个URL,源码包将从那里自动下载。
以root身份运行:
# abs
ABS树会在/var/abs
下创建。你会发现ABS树有几个分枝,这些分枝与你在/etc/abs.conf
中的选择相对应。
abs命令也用于定期地同步和更新你的ABS树。
只同步一个软件(格式:所在仓库/名称,比如 core/abs):
# abs/
这样不用下载整个 abs 树就能编译。
/etc/makepkg.conf指明环境变量和编译器的flags。如果你使用SMP系统也许会希望编辑它。默认的设置是为i686和 x86_64优化的,在这些架构的单CPU系统上很有效。(默认设置可以在SMP机器上使用,但只会利用一个核心/CPU——参见 Safe Cflags.).
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:
$ grep myname /etc/makepkg.conf PACKAGER="myname
$ expac "%n %p" | grep "myname" | column -t archey3 myname binutils myname gcc myname gcc-libs myname glibc myname tar myname
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
)
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 (/
).
如果你还不熟悉编译源代码,那么你需要知道大多数软件包(但不是所有的)都可以通过这种传统方式从源代码编译创建:
$ 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
系统。