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

From ArchWiki
Jump to: navigation, search
(如何使用 ABS)
Line 121: Line 121:
 
</nowiki>}}
 
</nowiki>}}
  
The ABS tree has exactly the same structure as the package database:
+
ABS 樹的架構和軟體包資料庫的架構完全一模一樣:
  
* First-level: Repository name
+
* 第一層:軟體庫名稱
* Second-level: Package name directories
+
* 第二層:軟體包名稱的目錄
* Third level: PKGBUILD (contains information needed to build a package) and other related files (patches, other files needed for building the package)
+
* 第三層:PKGBUILD (包含組建軟體包所需資訊) 和其他相關檔案 (修補程式,和其他組建軟體包所需檔案)
  
The source code for the package is not present in the ABS directory. Instead, the '''PKGBUILD''' file contains a URL that will download the source code when the package is built. So the size of abs tree is quite small.
+
ABS 目錄下並沒有軟體包的原始碼。'''PKGBUILD''' 檔案包含了原始碼的下載 URL,在組建軟體包時才會下載過來。因此 abs 樹其實相當小。
  
 
==== 下載 ABS 樹 ====
 
==== 下載 ABS 樹 ====
Line 133: Line 133:
 
  # abs
 
  # abs
  
Your ABS tree is now created under {{ic|/var/abs}}. Note the appropriate branches of the ABS tree now exist and correspond to the ones you specified in {{ic|/etc/abs.conf}}.
+
現在,您的 ABS 樹已經建立在 {{ic|/var/abs}} 下。在 {{ic|/etc/abs.conf}} 指定的軟體庫,在 ABS 樹下也出現相對應的分支。
  
The abs command should be run periodically to keep in sync with the official repositories. Individual ABS package files can also be downloaded with:
+
abs 指令應該定期執行,以和官方軟體庫同步。單一的 ABS 軟體包檔案也可以用下列指令下載:
  
  # abs <repository>/<package>
+
  # abs <倉庫>/<軟體包>
This way you do not have to check out the entire abs tree just to build one package.
+
這樣您在組建一份軟體包時,就不需要檢查整個 abs 樹。
  
 
=== /etc/makepkg.conf ===
 
=== /etc/makepkg.conf ===
Line 162: Line 162:
 
===== 只顯示軟體庫下的軟體包 =====
 
===== 只顯示軟體庫下的軟體包 =====
  
This example only shows packages contained in the repos defined in {{ic|/etc/pacman.conf}}:
+
這個範例只顯示存在於 {{ic|/etc/pacman.conf}} 所定義軟體庫的軟體包:
  
 
  $ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1)
 
  $ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1)
Line 173: Line 173:
 
=== 建立組建目錄 ===
 
=== 建立組建目錄 ===
  
It is recommended to create a build directory where the actual compiling will take place; you should never modify the ABS tree by building within it, as data will be lost (overwritten) on each ABS update. It is good practice to use your home directory, though some Arch users prefer to create a 'local' directory under {{ic|/var/abs/}}, owned by a normal user.
+
建議另外建立一個組建目錄,作為實際編譯使用;您不應直接在 ABS 樹組建,動到 ABS 樹,否則在每次 ABS 升級時會有資料遺失 (被覆寫)。使用自己的家目錄是個好辦法,有些 Arch 使用者會偏好在 {{ic|/var/abs/}} 下建立一個 'local' 目錄,由一般使用者擁有。
  
Create your build directory. e.g.:
+
建立您的組建目錄。例如:
  
 
  $ mkdir -p $HOME/abs
 
  $ mkdir -p $HOME/abs
  
Copy the ABS from the tree ({{ic|/var/abs/<repository>/<pkgname>}}) to the build directory.
+
({{ic|/var/abs/<倉庫>/<軟體包名稱>}}) 樹複製 ABS 到組建目錄。
  
 
=== 組建軟體包 ===
 
=== 組建軟體包 ===
  
In our example, we will build the ''slim'' display manager package.
+
在這個範例,我們將組建 ''slim'' 顯示管理員。
  
Copy the slim ABS from the ABS tree to a build directory:
+
ABS 樹的 slim ABS 複製到組建目錄:
 
  $ cp -r /var/abs/extra/slim/ ~/abs
 
  $ cp -r /var/abs/extra/slim/ ~/abs
  
Navigate to the build directory:
+
切換到組建目錄:
 
  $ cd ~/abs/slim
 
  $ cd ~/abs/slim
  
Modify the PKGBUILD to add or remove support for components, to patch or to change package versions, etc. (optional):
+
修改 PKGBUILD 可新增和移除組件的支援、做修補或更改軟體包版本 (選用)
 
  $ nano PKGBUILD
 
  $ nano PKGBUILD
  
Run makepkg as normal user (with {{ic|-s}} switch to install with automatic dependency handling):
+
以一般使用者身分執行 makepkg ({{ic|-s}} 選項會自動處理安裝相依性)
 
  $ makepkg -s
 
  $ makepkg -s
  
{{Note|Before complaining about missing (make) dependencies, remember that the {{Grp|base}} group is assumed to be installed on all Arch Linux systems. The group "base-devel" is assumed to be installed when building with '''makepkg'''. See [[#Install tools]].}}
+
{{註記|若出現缺少的 (make) 相依性,請記得,預設假定所有的 Arch Linux 系統已經安裝 {{Grp|base}} 群組。當使用 '''makepkg''' 組建時也假定已安裝 {{Grp|base-devel}} 群組。參閱[[#安裝工具]]}}
  
Install as root:
+
root 身分安裝:
 
  # pacman -U slim-1.3.0-2-i686.pkg.tar.xz
 
  # pacman -U slim-1.3.0-2-i686.pkg.tar.xz
  
That's it. You have just built slim from source and cleanly installed it to your system with pacman. Package removal is also handled by pacman with {{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.
 
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.

Revision as of 09:42, 30 January 2014

本文提供 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 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.)

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

Setting the PACKAGER variable in /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 expac available from the community repo:

顯示所有軟體包 (包含 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

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.

fakeroot

Essentially, the same steps are being executed in the traditional method (generally including the ./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 .pkg.tar.xz, or a package. When invoked, pacman then extracts the package (installs it) into the system's real root directory (/).