跳至內容

Arch 構建系統

出自 Arch Linux 中文维基

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

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

ABS的概念與Ports相似。它由為每個 Arch Linux 可用軟件包提供的 git 倉庫組成。每個目錄中並不包含二進制包或原始碼,而是包含一個PKGBUILD文件(有時也會有其它文件)。在有PKGBUILD文件的目錄裡運行makepkg命令,系統就會在目錄中下載軟件的原始碼、編譯並打包在build文件夾裡。然後就可以通過pacman進行安裝或升級了。

ABS概覽[編輯 | 編輯原始碼]

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

倉庫樹
目錄樹包含所有官方軟件包的構建所需的文件,但不包括軟件包本身和原始碼。這些倉庫以Git倉庫的形式託管在gitlab.archlinux.org上。更多詳細信息請參閱#倉庫結構
PKGBUILD
Bash腳本,包含軟件的原始碼的URL和編譯打包指令。
makepkg
ABS的 shell 命令工具,讀取 PKGBUILD,下載源碼,編譯並創建 .pkg.tar*包(拓展名由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的。在「髒」的環境中構建可能會失敗或者在運行時有意外行為。 因為如果編譯系統動態檢查依賴的話,編譯結果會受到當前系統可用包的影響。

倉庫結構[編輯 | 編輯原始碼]

coreextracore-testingextra-testing官方軟件倉庫託管在Arch Linux GitLab實例上。

每個包在archlinux/packaging/packages下都有其獨立的倉庫,倉庫中包含PKGBUILD和用於官方構建的文件。此外,開發人員在構建過程中使用的一些文件也可以在那裏找到。

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

acl
├── keys
│   └── pgp
│       ├── 259B3792B3D6D319212CC4DCD5BF9FEB0313653A.asc
│       ├── 600CD204FBCEA418BD2CA74F154343260542DF34.asc
│       └── B902B5271325F892AC251AD441633B9FE837F581.asc
└── PKGBUILD

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

我為什麼要用ABS[編輯 | 編輯原始碼]

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

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

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

如何使用 ABS[編輯 | 編輯原始碼]

獲取 PKGBUILD 源碼[編輯 | 編輯原始碼]

要想獲取從原始碼構建特定軟件包所需的PKGBUILD文件,可以使用pkgctl工具,或者直接使用Git

使用 pkgctl 工具[編輯 | 編輯原始碼]

如需使用pkgctl,請先安裝 devtools

要使用pkgctl獲取包含軟件包pkgname最新構建文件的git倉庫,請使用以下命令:

$ pkgctl repo clone pkgname
提示:默認情況下通過SSH獲取,如果沒有在Arch GitLab賬户中設置SSH密鑰,則需要通過HTTPS獲取:pkgctl repo clone --protocol=https pkgname

請注意,這裏所説的構建文件是指PKGBUILD,可能還包括一些其他必要的文件,如密鑰。也就是説,是ABS所需的基本文件,而不是由包的開發團隊編寫的原始碼文件,例如C或Python文件。

該命令不僅會提供當前的構建文件,還會提供它的歷史版本。此外,還可以使用其他git命令來簽出舊版本或跟蹤更改。

如果想獲取特定版本,可以使用以下命令:

$ pkgctl repo clone --switch="2:1.19.5-1" go

如需獲取更多詳細信息以及其他可用命令,請閱讀 pkgctl-repo-clone(1)

直接使用 git[編輯 | 編輯原始碼]

使用以下命令來獲取:

$ git clone https://gitlab.archlinux.org/archlinux/packaging/packages/pkgname.git

例如獲取Apache的構建文件:

$ git clone https://gitlab.archlinux.org/archlinux/packaging/packages/apache.git

構建軟件包[編輯 | 編輯原始碼]

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

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

技巧[編輯 | 編輯原始碼]

保留修改過的軟件包[編輯 | 編輯原始碼]

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

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

PKGBUILD
groups=('modified') 

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

/etc/pacman.conf
IgnoreGroup = modified

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

其它工具[編輯 | 編輯原始碼]

  • pbget - 從web接口直接獲取某個包的PKGBUILD,支持AUR.