出自 Arch Linux 中文维基

ABS(Arch Build System)指的是Arch的構建系統。這是一種從原始碼編譯軟體的類 ports 系統。在Arch中,pacman 專門管理二進位軟體包(包括那些由ABS創建的);而ABS則是一系列工具,負責把原始碼編譯成可安裝的.pkg.tar.xz 軟體包。

Ports 是 *BSD 使用的一種系統,可以自動下載原始碼、解壓縮、打補丁、編譯和安裝軟體。一個「port」僅僅是指用戶電腦上的一個目錄,該目錄根據即將安裝的軟體來命名,它包含一些能指導源碼的下載和編譯安裝的文件。Ports系統讓你只需在port目錄下運行makemake install clean就能安裝你想要的軟體。

ABS 的概念與Ports相似。ABS的一部分是SVN倉庫或等價的Git倉庫,這個倉庫中每個目錄與Arch Linux的官方軟體包一一對應。每個目錄中並不包含二進位包或原始碼,而是包含一個PKGBUILD文件(有時也會有其它文件)。在有PKGBUILD文件的目錄裡運行makepkg命令,系統就會在目錄中下載軟體的原始碼、編譯並打包在build文件夾裡。然後就可以通過pacman進行安裝或升級了。

ABS概覽

'ABS'可以作為一個總括性術語來使用,因為它包含並依賴於若干其他部件。因此,儘管從嚴格意義上來講並不精確,ABS可指代包含以下工具的完整工具集:

倉庫樹
目錄樹包含所有官方軟體包的構建所需的文件,但不包括軟體包本身和原始碼。這可以通過svngit倉庫來獲取。具體請參見#倉庫樹
PKGBUILD
Bash腳本,包含軟體的原始碼的URL和編譯打包指令。
makepkg
ABS的 shell 命令工具,讀取 PKGBUILD,下載源碼,編譯並創建 .pkg.tar.gz.pkg.tar.xz包(拓展名由makepkg.conf中的PKGEXT指定)。makepkg也可以用來從AUR或第三方代碼構建你自己的自定義軟體包。參考Creating packages
Pacman
pacman是完全獨立的一個系統,但是它在安裝或移除軟體包、解決依賴關係時都是必需的。它被 makepkg 調用或者被手動執行。
AUR
ArchLinux社區的用戶維護的軟體倉庫獨立於ABS,包含不受支持的PKGBUILD文件。它們同樣可以可以通過ABS的makepkg工具來編譯並打包成可安裝軟體。與只是一個git倉庫的 ABS 樹不同,AUR 是一個有著精緻外觀及多種交互功能的網站界面。它包含成千上萬的用戶貢獻的 PKGBUILD,來提供Arch官方倉庫中沒有的軟體。如果需要編譯官方 Arch 樹之外的軟體包,AUR 中已經存在的可能性非常大。
警告: 官方PKGBUILD假定包是在乾淨的 chroot 環境中構建英語DeveloperWiki:Building in a clean chroot的。在「髒」的環境中構建可能會失敗或者在運行時有意外行為。 因為如果編譯系統動態檢查依賴的話,編譯結果會受到當前系統可用包的影響。

倉庫樹

core, extratesting 官方軟體倉庫 可從packages 倉庫checkout. 而communitymultilibcommunity倉庫。

每個包有各自的子目錄,其中又有repostrunk目錄。repos又進一步按倉庫名(如core)和架構細分。repos裡的PKGBUILD和其它文件用來構建官方包。trunk裡的文件是給開發者用的,並最終複製到repos中。

例如,acl的目錄結構是這樣的:

acl
acl/repos
acl/repos/core-x86_64
acl/repos/core-x86_64/PKGBUILD
acl/trunk
acl/trunk/PKGBUILD

原始碼並不直接包含在ABS目錄中,而是構建時從PKGBUILD裡指定的原始碼URL下載。

我為什麼要用ABS

常見的使用 ABS 的場景包括:

  • 需要編譯或重新編譯軟體包
  • 從原始碼編譯Arch官方源裡沒有的軟體(詳情請參照創建軟體包)
  • 定製現有的軟體包以滿足你的特定需求(比如開啟或禁用相關選項、打補丁)
  • 用你的編譯器的flags重新構建整個系統,「就像FreeBSD那樣」
  • 乾淨地編譯安裝你自己定製的內核。(參照內核編譯(簡體中文))
  • 使內核模塊(比如某些顯卡驅動)在你定製的內核下正常工作
  • 修改 PKGBUILD 中的版本就能方便地編譯和安裝新的、老的、beta 或者開發版本的 Arch 軟體包

使用 Arch Linux 不一定會用到 ABS,但 ABS 確實可以自動化進行許多源碼編譯工作。

如何使用 ABS

要想獲取從原始碼構建特定軟體包所需的PKGBUILD文件,可以使用 Svn英語SvnGit 方式。

通過 Git 獲取 PKGBUILD 源碼

使用 asp

先安裝 安裝 軟體包 aspAsp 是通過Git接口獲取Arch Linux的軟體包的原始碼文件的工具。另外可以參考Arch Linux BBS論壇帖子[1]

開始使用此工具::

$ asp export pkgname

這個命令會將 pkgname 加入 asp 追蹤列表,並將 pkgname 當局的編譯源文件下載到工作目錄的 pkgname 下,並自動執行

$ asp update pkgname

$ asp export pkgname

後續也可以選擇手動執行這兩個命令。編譯源文件是指 PKGBUILD 和其它一些需要的密碼文件等 ABS 必須的文件,而不是軟體包的 C 或 Python 等原始碼.

要克隆 git 倉庫並切換到最新版本:

$ asp checkout pkgname

這個命令不光會下載當前編譯文件,還會下載整個版本歷史,可以通過 git 命令查看之前的版本及變更歷史。

要更新 asp 追蹤的編譯文件,可以執行 asp update. 在 checkout 出的倉庫目錄執行 git pull 會更新倉庫到最新版本。

更多信息請閱讀 asp(1)

直接使用 git

只下載某個分支的文件:

$ git clone --branch branch/package --single-branch https://github.com/archlinux/svntogit-packages.git

要複製 apache 分支的文件:

$ git clone --branch packages/apache --single-branch https://github.com/archlinux/svntogit-packages.git

使用 SVN 獲取 PKGBUILD 源碼

安裝subversion包。

checkout倉庫

警告: 不要下載整個倉庫,請按下面的說明操作。整個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"而不創建文件。出現這種情況時:

提示:要check舊版本,參考#Checkout舊版本軟體包.

如果想在最新的版本進行編譯,定期執行:

$ svn update

構建軟體包

關於如何配置makepkg來從PKGBUILD構建軟體包,請參考makepkg#配置

PKGBUILD所在目錄複製到新的位置。在新目錄按需要進行修改。 並按照makepkg#使用來構建和安裝軟體包。

技巧

保留修改過的軟體包

Pacman 進行升級時會將修改後的軟體包升級到倉庫中的最新版本,可以通過下面方式避免這個行為:

在 PKGBUILD 中將軟體包加入 modified 組.

PKGBUILD
groups=('modified') 

然後將此組加入/etc/pacman.confIgnoreGroup

/etc/pacman.conf
IgnoreGroup = modified

當系統生升級發現官方倉庫中有新版本時,pacman會顯示軟體包因為在IgnoreGroup中而被忽略的提示,這時需要從 ABS 編譯更新的軟體包以防止部分升級。

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接口獲取新的源。