Difference between revisions of "Arch Build System (正體中文)"

From ArchWiki
Jump to: navigation, search
(如何使用 ABS)
Line 19: Line 19:
 
[[zh-CN:Arch Build System]]
 
[[zh-CN:Arch Build System]]
 
{{Related articles start (正體中文)}}
 
{{Related articles start (正體中文)}}
{{Related2|ABS FAQ|ABS 常見問題}}
+
{{Related2|ABS FAQ|ABS 常見問題 (英)}
{{Related2|Arch Packaging Standards|Arch 打包標準}}
+
{{Related2|Arch Packaging Standards|Arch 打包標準 (英)}}
{{Related2|Creating Packages|建立軟體包}}
+
{{Related2|Creating Packages|建立軟體包 (英)}}
{{Related2|Kernel Compilation with ABS|核心編譯與 ABS}}
+
{{Related2|Kernel Compilation with ABS|核心編譯與 ABS (英)}}
{{Related|PKGBUILD}}
+
{{Related2|PKGBUILD|PKGBUILD (英)}}
{{Related|makepkg}}
+
{{Related2|makepkg|makepkg (英)}}
 
{{Related2|pacman (正體中文)|pacman}}
 
{{Related2|pacman (正體中文)|pacman}}
 
{{Related2|Official Repositories (正體中文)|官方倉庫}}
 
{{Related2|Official Repositories (正體中文)|官方倉庫}}
 
{{Related2|Arch User Repository (正體中文)|使用者倉庫}}
 
{{Related2|Arch User Repository (正體中文)|使用者倉庫}}
 
{{Related articles end}}
 
{{Related articles end}}
 +
{{翻譯狀態|Arch_Build_System|2014-01-30|284196}}
  
 
本文提供 Arch 組建系統的概覽,以及帶領初學者進行一遍操作。此文非完整的參考指南!快速簡單的 ABS 簡介,請參閱 [[ABS FAQ|ABS 常見問題]]。如果需要更多資訊,請參考 man 手冊頁。
 
本文提供 Arch 組建系統的概覽,以及帶領初學者進行一遍操作。此文非完整的參考指南!快速簡單的 ABS 簡介,請參閱 [[ABS FAQ|ABS 常見問題]]。如果需要更多資訊,請參考 man 手冊頁。
Line 142: Line 143:
 
=== /etc/makepkg.conf ===
 
=== /etc/makepkg.conf ===
  
{{ic|/etc/makepkg.conf}} specifies global environment variables and compiler flags which you may wish to edit if you are using an SMP system, or to specify other desired optimizations. The default settings are for i686 and x86_64 optimizations which will work fine for those architectures on single-CPU systems. (The defaults will work on SMP machines, but will only use one core/CPU when compiling -- see [[makepkg.conf]].)
+
{{ic|/etc/makepkg.conf}} 指定了全域環境變數與編譯器旗標,若您使用 SMP (對稱多處理) 系統,或打算做其他優化的話,可以編輯這個檔案。預設設定值會對 i686 x86_64 作優化,在這類型架構的單核 CPU 系統下運作良好。(預設值也適用於 SMP 機器,但編譯時只會使用一個核心/CPU -- 參閱 [[makepkg.conf]])
  
 
==== 設定 /etc/makepkg.conf 的 PACKAGER 變數 ====
 
==== 設定 /etc/makepkg.conf 的 PACKAGER 變數 ====
  
Setting the PACKAGER variable in {{ic|/etc/makepkg.conf}} is an optional but ''highly recommended'' step.  It allows a "flag" to quickly identify which packages have been built and/or installed by YOU, not the official maintainer!  This is easily accomplished using {{Pkg|expac}} available from the community repo:
+
{{ic|/etc/makepkg.conf}} 的 PACKAGER 變數設定是選用但'''強烈建議'''的步驟。它可以快速偵測哪個軟體包是由您組建/安裝,而非官方維護者!使用來自 community 庫的 {{Pkg|expac}} 可以輕易達成:
  
 
===== 顯示所有軟體包 (包含 AUR 軟體包) =====
 
===== 顯示所有軟體包 (包含 AUR 軟體包) =====
Line 204: Line 205:
 
這樣就完成了。您已經從原始碼組建了 slim,並用 pacman 安裝到您的系統,毫無瑕疵。軟體包移除也可以用 pacman 處理:{{ic|pacman -R slim}}。
 
這樣就完成了。您已經從原始碼組建了 slim,並用 pacman 安裝到您的系統,毫無瑕疵。軟體包移除也可以用 pacman 處理:{{ic|pacman -R slim}}。
  
The ABS method adds a level of convenience and automation, while still maintaining complete transparency and control of the build and installation functions by including them in the PKGBUILD.
+
ABS 方法導入了方便性與自動化,也為組建與安裝函式維持完整的透明度和控制 (它們被包進 PKGBUILD 裡面)。
  
 
==== fakeroot ====
 
==== fakeroot ====
Essentially, the same steps are being executed in the traditional method (generally including the {{ic|./configure, make, make install}} steps) but the software is installed into a ''fake root'' environment. (A ''fake root'' is simply a subdirectory within the build directory that functions and behaves as the system's root directory. In conjunction with the '''fakeroot''' program, makepkg creates a fake root directory, and installs the compiled binaries and associated files into it, with '''root''' as owner.) The ''fake root'', or subdirectory tree containing the compiled software, is then compressed into an archive with the extension {{ic|.pkg.tar.xz}}, or a ''package''. When invoked, pacman then extracts the package (installs it) into the system's real root directory ({{ic|/}}).
+
基本上,傳統方法 (一般包含 {{ic|./configure, make, make install}} 步驟) 也會執行相同的步驟,但軟體會被安裝到 ''fake root'' (偽根目錄) 環境下。(''fake root'' 只是組建目錄下一個子目錄,其作用和表現像是系統的根目錄。和 '''fakeroot''' 程式不同,makepkg 會建立一個假根目錄,並將編譯的二進位檔與相關檔案安裝進來,以 '''root''' 為檔案擁有者。) 這個 ''fake root'',或包含編譯軟體的子目錄樹,接著會被壓縮為副檔名 {{ic|.pkg.tar.xz}} 的封存檔,又稱「軟體包」。pacman 接著會解壓縮這個軟體包 (安裝) 至系統真正的根目錄 ({{ic|/}})

Revision as of 13:15, 30 January 2014

翻譯狀態: 本文章是 Arch_Build_System 的翻譯版本。最近一次的翻譯時間:2014-01-30。點擊本連結查看英文頁面之後的變更。

本文提供 Arch 組建系統的概覽,以及帶領初學者進行一遍操作。此文非完整的參考指南!快速簡單的 ABS 簡介,請參閱 ABS 常見問題。如果需要更多資訊,請參考 man 手冊頁。

註記: ABS 一天同步一次,因此它和軟體庫上的版本稍微會有一點差距。

什麼是 Arch 組建系統?

Arch 組建系統 (Arch Build System),縮寫為 ABS,是一套類似(BSD)ports 的系統,能從原始碼組建軟體並打包。Pacman 是 Arch 下特定的二進制安裝包管理工具(也包括管理那些從 ABS 組建的二進制安裝包),ABS 則是一組工具集,將原始碼編譯為一個可供安裝的 .pkg.tar.gz 軟體包。

什麼是類似 ports 的系統?

Ports 是 *BSD 下從原始碼組建軟體的自動化系統。系統使用一個 port 下載、解壓縮、修補、編譯並安裝給定的軟體。一個 port 差不多就是使用者電腦上的一個小目錄,以要安裝的相對應軟體命名,內部有幾個檔案指示如何從原始碼組建、安裝軟體。這讓安裝軟體這回事和在 port 目錄下輸入 makemake install clean 一樣簡單。

ABS 是類似的概念

ABS 由目錄樹組成 (ABS tree),位於 /var/abs 之下。這個樹包含了許多子目錄,每個子目錄有各自的分類與相對應的軟體包命名。這顆樹表示 (但不包含) 所有官方 Arch 軟體,可以透過 SVN 系統取得。您可以將這些以軟體包的名字命名的子目錄稱作 'ABS',就如同這樣稱呼 'port' 一樣。這些 ABS (或子目錄) 不包含軟體包,也不包含原始碼,只有一份 PKGBUILD 檔案 (有時還會有其他檔案)。PKGBUILD 只是一個 Bash 組建腳本 -- 這份文字檔包含編譯與打包指令,以及下載適合來源封存包的 URL。(ABS 最重要的組件就是 PKGBUILD。) 呼叫 ABS 的 makepkg 指令後,首先軟體會被編譯,接著在組建目錄下打包。之後您便可以使用 pacman 這個 Arch Linux 軟體包管理員來安裝、升級、移除您的新軟體包。

ABS 快速瀏覽

'ABS' 包含並依賴數個其他組件,因此可被當作這些組件的總稱;雖然在技術上並非完全準確,'ABS' 可以指以下工具所構成的完整工具集:

ABS 樹
ABS 目錄架構;(本地) 機器 /var/abs/ 目錄下的 SVN 階層。包含數個子目錄,以所有 /etc/abs.conf 下指定軟體庫中可用的官方 Arch Linux 軟體命名,但不存放軟體包本身。以 pacman 安裝 abs 軟體包,並執行 abs 腳本,這顆樹才會被建立。
PKGBUILD
包含原始碼 URL、編譯與打包指令的 Bash 腳本。
makepkg
ABS shell 指令工具,會閱讀 PKGBUILD、自動下載並編譯原始碼,並根據 makepkg.confPKGEXT 行建立 .pkg.tar*。您也可以使用 makepkg 建立來自 AUR 或第三方來源的自訂軟體包。(參閱建立軟體包 wiki 文章。)
pacman
pacman 和 ABS 完全切割,但若需要的話,可以由 makepkg 呼叫或手動執行。用途為安裝、移除組建軟體包與抓取相依軟體包。
AUR
Arch 使用者倉庫和 ABS 基本上無關,但 (未受支援的) AUR PKGBUILD 可透過 makepkg 組建,編譯和打包軟體。與位於您本地機器上的 ABS 樹不同,AUR 基於網站介面。它包含數千個由使用者貢獻的 PKGBUILD,這些是無法從官方 Arch 軟體庫獲取的軟體。如果您需要組建官方 Arch 樹以外的軟體包,到 AUR 會有機會找得到。

我為什麼要用到 ABS?

Arch 組建系統被用來:

  • 編譯或重新編譯軟體包,不論任何原因
  • 若沒有可用的軟體包,可以從軟體原始碼建立並安裝新軟體包 (參閱建立軟體包)
  • 已存在軟體包可以自訂以符合您的需求 (啟用或停用選項、修補程式)
  • 使用您的編譯器旗標重新組建整套系統,「和 FreeBSD 一樣」 (例如使用 pacbuilder)
  • 乾淨的組建安裝您自訂的核心 (參閱核心編譯)
  • 讓核心模組在您自訂的核心下可以運作
  • 簡單編譯安裝 Arch 較新、較舊、測試或開發版本的軟體包,只需編輯 PKGBUILD 的版本號

ABS 並非 Arch Linux 下必需功能,但它是相當好用的原始碼編譯自動化工具。

如何使用 ABS

使用 abs 組建軟體包由以下步驟組成:

  1. pacman 安裝 abs 軟體包。
  2. 以 root 身分執行 abs,和 Arch Linux 伺服器同步以建立 ABS 樹。
  3. 將組建檔案 (通常位於 /var/abs/<倉庫>/<軟體包名稱>) 複製到組建目錄。
  4. 到組建目錄編輯 PKGBUILD (若想要/需要的話),並執行 makepkg
  5. 根據 PKGBUILD 的指令,makepkg 將下載適當的原始碼壓縮包、解壓縮、若有指定則套用修補、根據 makepkg.conf 指定的 CFLAGS 編譯,最後將組建檔案壓縮為副檔名 .pkg.tar.gz.pkg.tar.xz 的軟體包。
  6. 簡單一步 pacman -U <.pkg.tar.xz 檔案> 完成安裝。軟體包移除也交給 pacman 負責。

安裝工具

要使用 ABS,首先需要從官方軟體庫安裝 abs

將會抓取 abs 同步腳本、各種組建腳本以及 rsync (若沒有的話會以相依軟體安裝)。

在真正組建任何東西之前,您還需要基本的編譯工具。這些工具被收集於 base-devel 這個軟體群組。用 pacman 安裝這個群組。

/etc/abs.conf

以 root 身分編輯 /etc/abs.conf,將您想要的軟體庫包含近來。

移除適當軟體庫前面的 !。舉例來說:

REPOS=(core extra community !testing)

ABS 樹

ABS 樹是 /var/abs 下的 SVN 目錄階層,長得像這樣:

| -- core/
|     || -- acl/
|     ||     || -- PKGBUILD
|     || -- attr/
|     ||     || -- PKGBUILD
|     || -- abs/
|     ||     || -- PKGBUILD
|     || -- autoconf/
|     ||     || -- PKGBUILD
|     || -- ...
| -- extra/
|     || -- acpid/
|     ||     || -- PKGBUILD
|     || -- apache/
|     ||     || -- PKGBUILD
|     || -- ...
| -- community/
|     || -- ...

ABS 樹的架構和軟體包資料庫的架構完全一模一樣:

  • 第一層:軟體庫名稱
  • 第二層:軟體包名稱的目錄
  • 第三層:PKGBUILD (包含組建軟體包所需資訊) 和其他相關檔案 (修補程式,和其他組建軟體包所需檔案)

ABS 目錄下並沒有軟體包的原始碼。PKGBUILD 檔案包含了原始碼的下載 URL,在組建軟體包時才會下載過來。因此 abs 樹其實相當小。

下載 ABS 樹

以 root 身分執行:

# abs

現在,您的 ABS 樹已經建立在 /var/abs 下。在 /etc/abs.conf 指定的軟體庫,在 ABS 樹下也出現相對應的分支。

abs 指令應該定期執行,以和官方軟體庫同步。單一的 ABS 軟體包檔案也可以用下列指令下載:

# abs <倉庫>/<軟體包>

這樣您在組建一份軟體包時,就不需要檢查整個 abs 樹。

/etc/makepkg.conf

/etc/makepkg.conf 指定了全域環境變數與編譯器旗標,若您使用 SMP (對稱多處理) 系統,或打算做其他優化的話,可以編輯這個檔案。預設設定值會對 i686 和 x86_64 作優化,在這類型架構的單核 CPU 系統下運作良好。(預設值也適用於 SMP 機器,但編譯時只會使用一個核心/CPU -- 參閱 makepkg.conf。)

設定 /etc/makepkg.conf 的 PACKAGER 變數

/etc/makepkg.conf 的 PACKAGER 變數設定是選用但強烈建議的步驟。它可以快速偵測哪個軟體包是由您組建/安裝,而非官方維護者!使用來自 community 庫的 expac 可以輕易達成:

顯示所有軟體包 (包含 AUR 軟體包)
$ grep myname /etc/makepkg.conf
PACKAGER="myname <myemail@myserver.com>"
$ expac "%n %p" | grep "myname" | column -t
archey3 myname
binutils myname
gcc myname
gcc-libs myname
glibc myname
tar myname
只顯示軟體庫下的軟體包

這個範例只顯示存在於 /etc/pacman.conf 所定義軟體庫的軟體包:

$ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1)
binutils
gcc
gcc-libs
glibc
tar

建立組建目錄

建議另外建立一個組建目錄,作為實際編譯使用;您不應直接在 ABS 樹組建,動到 ABS 樹,否則在每次 ABS 升級時會有資料遺失 (被覆寫)。使用自己的家目錄是個好辦法,有些 Arch 使用者會偏好在 /var/abs/ 下建立一個 'local' 目錄,由一般使用者擁有。

建立您的組建目錄。例如:

$ mkdir -p $HOME/abs

從 (/var/abs/<倉庫>/<軟體包名稱>) 樹複製 ABS 到組建目錄。

組建軟體包

在這個範例,我們將組建 slim 顯示管理員。

將 ABS 樹的 slim ABS 複製到組建目錄:

$ cp -r /var/abs/extra/slim/ ~/abs

切換到組建目錄:

$ cd ~/abs/slim

修改 PKGBUILD 可新增和移除組件的支援、做修補或更改軟體包版本 (選用):

$ nano PKGBUILD

以一般使用者身分執行 makepkg (-s 選項會自動處理安裝相依性):

$ makepkg -s
註記: 若出現缺少的 (make) 相依性,請記得,預設假定所有的 Arch Linux 系統已經安裝 base 群組。當使用 makepkg 組建時也假定已安裝 base-devel 群組。參閱#安裝工具

以 root 身分安裝:

# pacman -U slim-1.3.0-2-i686.pkg.tar.xz

這樣就完成了。您已經從原始碼組建了 slim,並用 pacman 安裝到您的系統,毫無瑕疵。軟體包移除也可以用 pacman 處理:pacman -R slim

ABS 方法導入了方便性與自動化,也為組建與安裝函式維持完整的透明度和控制 (它們被包進 PKGBUILD 裡面)。

fakeroot

基本上,傳統方法 (一般包含 ./configure, make, make install 步驟) 也會執行相同的步驟,但軟體會被安裝到 fake root (偽根目錄) 環境下。(fake root 只是組建目錄下一個子目錄,其作用和表現像是系統的根目錄。和 fakeroot 程式不同,makepkg 會建立一個假根目錄,並將編譯的二進位檔與相關檔案安裝進來,以 root 為檔案擁有者。) 這個 fake root,或包含編譯軟體的子目錄樹,接著會被壓縮為副檔名 .pkg.tar.xz 的封存檔,又稱「軟體包」。pacman 接著會解壓縮這個軟體包 (安裝) 至系統真正的根目錄 (/)。