Arch 構建系統 - Arch Linux 中文维基

跳至內容

# Arch 構建系統

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Arch Build System，最近一次同步於 2026-01-19，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Arch 打包準則
- Arch 用戶軟體倉庫
- 創建軟體包
- 內核/Arch 構建系統
- 官方倉庫
- 軟體包補丁

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

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

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

## 用例

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

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

## 用法

### 獲取 PKGBUILD 源碼

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

#### 使用 pkgctl 工具

如需使用 pkgctl，請先安裝 devtools包。pkgctl 是一個幫助為 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.conf` 的 `IgnoreGroup`：

    /etc/pacman.conf

    IgnoreGroup = modified

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

分類：​

- 關於 Arch
- 包開發
- 包管理

Arch 構建系統
新增話題