跳至內容

为应对本站因各种原因无法访问,建议用户安装 arch-wiki-docs-zh-cnCNRepo 或者 arch-wiki-docs-zh-twCNRepo 离线文档包备用,也可尝试使用经由Cloudflare CDN的替代版本aw.lilydjwg.me

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