跳至內容

Arch 構建系統

出自 Arch Linux 中文维基

Arch 構建系統(Arch build system,ABS)是一套從源碼構建並打包軟體包的系統。在 Arch 中,pacman 專門管理二進制軟體包(包括那些由 ABS 創建的);而 ABS 則是一系列工具,負責把原始碼編譯成可安裝的 .pkg.tar.zst 軟體包。

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

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

工具鏈

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

Arch 構建系統包含並依賴於數個組件和工具,分別用於從源碼到構建出軟體包的各個步驟中:

倉庫樹
目錄樹包含構建所有官方軟體包所需的文件,但不包括軟體包本身和原始碼。這些倉庫以 Git 倉庫的形式託管在 gitlab.archlinux.org 上。更多詳細信息請參閱#倉庫結構
PKGBUILD
Bash 腳本,包含軟體的原始碼的 URL 和編譯打包指令。
makepkg
一個 shell 命令工具,會讀取 PKGBUILD,自動下載源碼、編譯並創建 .pkg.tar* 包(拓展名由 makepkg.conf 中的 PKGEXT 指定)。makepkg 也可以用來從 AUR 或第三方代碼構建你自己的自定義軟體包,具體細節請參考創建軟體包
pacman
pacman 是完全獨立的一個系統,但是它在通過 makepkg 或手動安裝或移除軟體包、解決依賴關係時都是必需的。
pkgctl/devtools
devtools 是用於為 Arch Linux 發行版構建和維護官方倉庫軟體包的一系列工具。pkgctl(1) 是一個高層級工具,用於幫助從軟體源碼倉庫構建 Arch Linux 軟體包並發布到二進制軟體倉庫中。
AUR
Arch 用戶軟體倉庫(AUR)的 PKGBUILD 獨立於官方倉庫,但其中的軟體包同樣可以使用 ABS 的工具進行打包構建。它包含成千上萬的用戶貢獻的 PKGBUILD,來提供 Arch 官方倉庫中沒有的軟體。如果需要編譯官方 Arch 樹之外的軟體包,AUR 中已經存在的可能性非常大。
警告:官方 PKGBUILD 假定包是在乾淨的 chroot 環境中構建的。在「髒」的環境中構建可能會失敗或者在運行時有意外行為。因為如果編譯系統動態檢查依賴的話,編譯結果會受到當前系統可用包的影響。

倉庫結構

每個軟體包在 Arch Linux GitLab 伺服器archlinux/packaging/packages 命名空間下都有其獨立的源碼倉庫。每個倉庫都包含了官方打包所使用的 PKGBUILD 等文件。另外,這裡還存放了開發者在打包過程中所使用的一些文件。

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

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

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

在構建完官方軟體包後,它會被發布到官方倉庫之一:coreextramultilib 或是先放到測試倉庫中。這些倉庫存放著二進制文件,並不存放在 GitLab 上,而是由鏡像源進行分發。

用例

Arch 構建系統可以將從源碼構建出軟體包的一些工作自動化,常見用法包括:

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

用法

獲取 PKGBUILD 源碼

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

使用 pkgctl 工具

如需使用 pkgctl,請先安裝 devtoolspkgctl 是一個幫助為 Arch Linux 構建軟體包源文件的工具。

要使用 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 編譯更新的軟體包以防止部分升級