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

From ArchWiki
Jump to: navigation, search
Line 19: Line 19:
 
[[zh-CN:Arch Build System]]
 
[[zh-CN:Arch Build System]]
 
{{Related articles start (正體中文)}}
 
{{Related articles start (正體中文)}}
{{Related|ABS FAQ}}
+
{{Related2|ABS FAQ|ABS 常見問題}}
{{Related|Arch Packaging Standards}}
+
{{Related2|Arch Packaging Standards|Arch 打包標準}}
{{Related|Creating Packages}}
+
{{Related2|Creating Packages|建立軟體包}}
{{Related|Kernel Compilation with ABS}}
+
{{Related2|Kernel Compilation with ABS|核心編譯與 ABS}}
 
{{Related|PKGBUILD}}
 
{{Related|PKGBUILD}}
 
{{Related|makepkg}}
 
{{Related|makepkg}}
 
{{Related2|pacman (正體中文)|pacman}}
 
{{Related2|pacman (正體中文)|pacman}}
 
{{Related2|Official Repositories (正體中文)|官方倉庫}}
 
{{Related2|Official Repositories (正體中文)|官方倉庫}}
{{Related|Arch User Repository}}
+
{{Related2|Arch User Repository (正體中文)|使用者倉庫}}
 
{{Related articles end}}
 
{{Related articles end}}
  
ABS 是什麼? =
+
本文提供 Arch 組建系統的概覽,以及帶領初學者進行一遍操作。此文非完整的參考指南!快速簡單的 ABS 簡介,請參閱 [[ABS FAQ|ABS 常見問題]]。如果需要更多資訊,請參考 man 手冊頁。
ABS (Arch Build System),Arch 構建系統。它是一套像(BSD)Ports 一樣的體系,能從 '''source(源代碼)''' 來構建一個軟件。Pacman 是 Arch 下特定的二進制安裝包管理工具(也包括管理那些從 ABS 構建的二進制安裝包),而 ABS 則是 Arch 下特定的編譯工具,將源代碼編譯為一個可供安裝的 .pkg.tar.gz 包。
+
{{註記|ABS 一天同步一次,因此它和軟體庫上的版本稍微會有一點差距。}}
 +
== 什麼是 Arch 組建系統? ==
  
==什麼是像(BSD)Ports 一樣的系統?==
+
Arch 組建系統 (Arch Build System),縮寫為 '''ABS''',是一套類似(BSD)ports 的系統,能從原始碼組建軟體並打包。[[pacman (正體中文)|Pacman]] 是 Arch 下特定的二進制安裝包管理工具(也包括管理那些從 ABS 組建的二進制安裝包),ABS 則是一組工具集,將原始碼編譯為一個可供安裝的 .pkg.tar.gz 軟體包。
'Ports' 體系被用於 FreeBSD (和其它 BSD 作業系統),它允許下載,解包,修補,編譯和安裝'''source(源代碼)''' 包。'' 'port' 僅僅是用戶電腦上,以要安裝的相應軟件來命名的一個小目錄,它包含一些文件,以指導從軟體的來源處下載安裝一個包,一般都是找到那個目錄/port,然後依次用命令 "make" 和 「make install」,'Ports' 體系就會開始下載,編譯和安裝那個軟體了。
+
  
=='''ABS''' 的概念==
+
=== 什麼是類似 ports 的系統? ===
'''ABS''' 是由目錄樹組成('''ABS Tree'''),位於  /var/abs 之下,包含了不少子目錄。這些子目錄都在某個類別裡面,並分別以其安裝包的名字來命名。你可以將這些以安裝包的名字來命名子目錄,稱為 'ABS',就如同這樣稱呼 'port' 一樣。這些 '''ABS''',或子目錄,'''並不包含軟體安裝包,也沒有它們的源代碼''',而是含有一個 '''PKGBUILD''' 文件 (有時也含有其它一些文件)。  PKGBUILD 是一個簡單的文本文件,含有編譯與打包的指令,也含有下載適當源碼包的URL地址。'' ABS 體系中最重要的組成部分就是 PKGBUILDs 了。''
+
  
==快速瀏覽==
+
''Ports'' 是 *BSD 下從原始碼組建軟體的自動化系統。系統使用一個 ''port'' 下載、解壓縮、修補、編譯並安裝給定的軟體。一個 ''port'' 差不多就是使用者電腦上的一個小目錄,以要安裝的相對應軟體命名,內部有幾個檔案指示如何從原始碼組建、安裝軟體。這讓安裝軟體這回事和在 port 目錄下輸入 {{ic|make}} 或 {{ic|make install clean}} 一樣簡單。
以root執行「'abs'」創造ABS樹 (ABS tree)。舉例來說,如果你想要從'''source'''建造nano, 妳可以複製 /var/abs/core/base/nano 到一個建造目錄(build directory),導引(navigate)至該目錄並執行「'''makepkg'''」。事情就那麼簡單。Makepkg會嘗試去讀取並執行PKGBUILD中的指令。 source tarball 將會依照/etc/makepkg.conf中的CFLAGS被自動下載、解壓、編譯,最後擠進一個帶有.pkg.tar.gz副檔名的package,按照PKGBUILD中的指令。安裝也很簡單,執行「pacman -U nano.pkg.tar.gz」。Package的移除也由pacman處理。
+
  
PKGBUILD跟其他的檔案,當然,可以根據你的需求被調整,而你也可以選擇ABS的makepkg功能,從 sources outside the ABS樹 itself,來製作(make)你個人訂製的packages。 (See the prototype PKGBUILD and install files under /var/abs/core/)
+
=== ABS 是類似的概念 ===
  
有了'''ABS樹'''後,Arch的使用者可以在彈指間快速地從源代碼(source)編譯想要的套件(package)
+
ABS 由目錄樹組成 (ABS tree),位於 {{ic|/var/abs}} 之下。這個樹包含了許多子目錄,每個子目錄有各自的分類與相對應的軟體包命名。這顆樹表示 (但不包含) 所有'''官方 Arch 軟體''',可以透過 SVN 系統取得。您可以將這些以軟體包的名字命名的子目錄稱作 'ABS',就如同這樣稱呼 'port' 一樣。這些 ABS (或子目錄) 不包含軟體包,也不包含原始碼,只有一份 [[PKGBUILD]] 檔案 (有時還會有其他檔案)。PKGBUILD 只是一個 Bash 組建腳本 -- 這份文字檔包含編譯與打包指令,以及下載適合'''來源'''封存包的 URL。(ABS 最重要的組件就是 PKGBUILD。) 呼叫 ABS 的 [[makepkg]] 指令後,首先軟體會被編譯,接著在組建目錄下'''打包'''。之後您便可以使用 [[pacman (正體中文)|pacman]] 這個 Arch Linux 軟體包管理員來安裝、升級、移除您的新軟體包。
  
==ABS重要特色==
+
=== ABS 快速瀏覽 ===
除了之前提到的功能,ABS還有兩大特色
+
* 你還可以使用'''[[makepkg]]''這項工具,去創造一個套件(package),然後在社群上分享。同樣的這個.pkg.tar.gz套件一樣,在你想要移除時,利用pacman乾淨地清除。
+
* ABS工具讓你可以利用[[AUR]],或者是其他Arch使用者貢獻的PKGBULDs,這是一個你使用上非常方便已經先行處理裡過的PKGBULDS。
+
  
==ABS 系統的概況==
+
'ABS' 包含並依賴數個其他組件,因此可被當作這些組件的總稱;雖然在技術上並非完全準確,'ABS' 可以指以下工具所構成的完整工具集:
'ABS'可以說是一個"保護傘",因為他包含而且相依很多其他的元件。雖然技術上來說不是那麼精確,但是它是一個完整的工具包(toolkit)且考慮了系統的結構和系統的工具。
+
  
關鍵名詞解釋:
+
; ABS 樹: ABS 目錄架構;(本地) 機器 {{ic|/var/abs/}} 目錄下的 SVN 階層。包含數個子目錄,以所有 {{ic|/etc/abs.conf}} 下指定軟體庫中可用的官方 Arch Linux 軟體命名,但不存放軟體包本身。以 [[pacman (正體中文)|pacman]] 安裝 {{Pkg|abs}} 軟體包,並執行 {{ic|abs}} 腳本,這顆樹才會被建立。
* '''ABS樹:'''ABS資料結構在'/var/abs/'下。他包含了很多以可取的Arch軟體包為名字的子資料夾,但並不包含真的軟體包。
+
* '''ABS:'''是ABS樹中的一個資料夾,資料夾的名字是一個Arch軟體包的名字,資料夾的內容是PKGBUILD。
+
* '''PKGBUILD:'''是位於ABS下的純文字檔案,其包含了ABS名字對應的軟體源代碼的URL。
+
* '''[[AUR]]:'''是Arch User Repository簡稱。AUR包含了很多非官方而是Arch的使用者自己提供的Arch套件。
+
* '''makepkg:'''一個Shell command,其會讀PKGBULID檔案,並按照檔案資訊自動製造.pkg.tar.gz檔案。
+
* '''Pacman:'''其與ABS是分開的軟體,但他可以手動執行或是藉由makepkg呼叫來安裝/移除建造好的套件,並且自動安裝所需相依的軟體。
+
(譯按:一個樹狀目錄,裏面存在很多軟體的訊息,每個軟體用一個資料夾裝起來,而資料夾名字和裏面裝的軟體同名,而資料夾稱做ABS,資料夾內的下載資訊稱做PKGBULID,而PKGBULID只是個簡單的文字檔,主要紀錄了其軟體的source的URL,提供了下載編譯的資訊。AUR是很多使用者自己上傳的Arch套件的地方,每個使用者都可以上去抓取別人做好的套件來用。而從AUR下載的套件可以用Pacman來協助安裝。makepkg即是做套件的工具,套件做好了也可以上傳到AUR分享給其他使用者。)
+
  
= 我為什麼要用到 ABS? =
+
; [[PKGBUILD]]: 包含原始碼 URL、編譯與打包指令的 [[Bash]] 腳本。
ABS主要是用於:
+
* 新的軟體出現後,官方還沒有提供該套件,因此可以從源代碼(source)製造新的套件(package),詳見[[Creating Packages]])
+
* 透過[[AUR]]建造而且分享套件
+
* 按照自己的特殊需求去製造一個為自己量身訂作的套件
+
* 利用compiler flags來重建整個系統,類似"FreeBSD"
+
* 乾淨的建造你個人特製的內核(詳見[[Kernel Compilation]])
+
* 針對你特製的內核製造適合的內核模組。
+
  
使用Arch Linux並不一定要用ABS,但是他是好用且自動化的編譯源代碼的工具。
+
; [[makepkg]]: ABS shell 指令工具,會閱讀 PKGBUILD、自動下載並編譯原始碼,並根據 {{ic|makepkg.conf}} 的 {{ic|PKGEXT}} 行建立 {{ic|.pkg.tar*}}。您也可以使用 makepkg 建立來自 [[AUR (正體中文)|AUR]] 或第三方來源的自訂軟體包。(參閱[[Creating Packages|建立軟體包]] wiki 文章。)
這個HOW-TO主要讓你對ABS和Arch套件有概括性的了解,但是內容不夠完整。如果你願意了解更多,建議閱讀使用者手冊(man)
+
  
= 首先:安裝二進制安裝包 =
+
; [[pacman (正體中文)|pacman]]: pacman 和 ABS 完全切割,但若需要的話,可以由 makepkg 呼叫或手動執行。用途為安裝、移除組建軟體包與抓取相依軟體包。
  
要使用ABS,請先從core repository安裝'''abs''',只需要打下列指令
+
; [[Arch User Repository (正體中文)|AUR]]: Arch 使用者倉庫和 ABS 基本上無關,但 (未受支援的) AUR PKGBUILD 可透過 makepkg 組建,編譯和打包軟體。與位於您本地機器上的 ABS 樹不同,AUR 基於網站介面。它包含數千個由使用者貢獻的 PKGBUILD,這些是無法從官方 Arch 軟體庫獲取的軟體。如果您需要組建官方 Arch 樹以外的軟體包,到 AUR 會有機會找得到。
<pre>
+
pacman -S abs</pre>
+
  
這將會自動抓取需要的軟體。
+
== 我為什麼要用到 ABS? ==
  
== /etc/abs.conf ==
+
Arch 組建系統被用來:
將你需要的軟體儲存庫(repository)加到 /etc/abs.conf 內(即編輯/etc/abs.conf):
+
* 編譯或重新編譯軟體包,不論任何原因
nano /etc/abs.conf
+
* 若沒有可用的軟體包,可以從軟體原始碼建立並安裝新軟體包 (參閱[[Creating Packages|建立軟體包]])  
移除在軟體儲存庫前的(repository)'!',表示採用其軟體儲存庫(repository)
+
* 已存在軟體包可以自訂以符合您的需求 (啟用或停用選項、修補程式)
REPOS=(core extra community !testing)
+
* 使用您的編譯器旗標重新組建整套系統,「和 FreeBSD 一樣」 (例如使用 [[pacbuilder]])
 +
* 乾淨的組建安裝您自訂的核心 (參閱[[Kernel Compilation|核心編譯]])
 +
* 讓核心模組在您自訂的核心下可以運作
 +
* 簡單編譯安裝 Arch 較新、較舊、測試或開發版本的軟體包,只需編輯 PKGBUILD 的版本號
  
== 創建 ABS 樹 ==
+
ABS 並非 Arch Linux 下必需功能,但它是相當好用的原始碼編譯自動化工具。
以root執行
+
abs
+
此指令會建立ABS樹在/var/abs下。此外,ABS樹會紀錄在/etc/abs/abs.conf
+
''週期性打abs這個指令,幫助您更新您ABS樹''
+
  
== /etc/makepkg.conf ==
+
== 如何使用 ABS ==
  
Edit /etc/makepkg.conf to specify environment variables and CFLAGS:
+
使用 abs 組建軟體包由以下步驟組成:
nano /etc/makepkg.conf
+
# 用 [[pacman (正體中文)|pacman]] 安裝 {{Pkg|abs}} 軟體包。
 +
# 以 root 身分執行 {{ic|abs}},和 Arch Linux 伺服器同步以建立 ABS 樹。
 +
# 將組建檔案 (通常位於 {{ic|/var/abs/<倉庫>/<軟體包名稱>}}) 複製到組建目錄。
 +
# 到組建目錄編輯 PKGBUILD (若想要/需要的話),並執行 '''makepkg'''。
 +
# 根據 PKGBUILD 的指令,makepkg 將下載適當的原始碼壓縮包、解壓縮、若有指定則套用修補、根據 {{ic|makepkg.conf}} 指定的 {{ic|CFLAGS}} 編譯,最後將組建檔案壓縮為副檔名 {{ic|.pkg.tar.gz}} 或 {{ic|.pkg.tar.xz}} 的軟體包。
 +
# 簡單一步 {{ic|pacman -U <.pkg.tar.xz 檔案>}} 完成安裝。軟體包移除也交給 pacman 負責。
  
== ABS 樹 ==
+
=== 安裝工具 ===
當你第一次執行abs指令,它會和arch的伺服器同步建造ABS樹,並且採用cvs系統。
+
那什麼是ABS樹呢?它其實是在/var/abs下建立的樹狀資料結構。
+
像下面這個:
+
  
<pre>
+
要使用 ABS,首先需要從[[Official Repositories (正體中文)|官方軟體庫]][[pacman (正體中文)|安裝]] {{Pkg|abs}}。
|-
+
 
 +
將會抓取 abs 同步腳本、各種組建腳本以及 [[rsync]] (若沒有的話會以相依軟體安裝)。
 +
 
 +
在真正組建任何東西之前,您還需要基本的編譯工具。這些工具被收集於 {{grp|base-devel}} 這個[[Pacman (正體中文)#安裝軟體群組|軟體群組]]。用 pacman 安裝這個群組。
 +
 
 +
=== /etc/abs.conf ===
 +
 
 +
以 root 身分編輯 {{ic|/etc/abs.conf}},將您想要的軟體庫包含近來。
 +
 
 +
移除適當軟體庫前面的 {{ic|!}}。舉例來說:
 +
REPOS=(core extra community !testing)
 +
 
 +
=== ABS 樹 ===
 +
 
 +
ABS 樹是 {{ic|/var/abs}} 下的 SVN 目錄階層,長得像這樣:
 +
 
 +
{{bc|<nowiki>
 
| -- core/
 
| -- core/
|-
+
|    || -- acl/
|    ||-- autoconf/
+
|     ||    || -- PKGBUILD
|-
+
|    || -- attr/
|    ||-- automake/
+
|     ||    || -- PKGBUILD
|-
+
|    || -- abs/
|    ||-- ...
+
|    ||    || -- PKGBUILD
|-
+
|    || -- autoconf/
| -- devel/
+
|    ||    || -- PKGBUILD
|-
+
|    || -- ...
| -- ...
+
|-
+
 
| -- extra/
 
| -- extra/
|-
+
|    || -- acpid/
|     || -- daemons/
+
|     ||    || -- PKGBUILD
|-
+
|    || -- apache/
|     ||     || -- acpid/
+
|     ||     || -- PKGBUILD
|-
+
|    || -- ...
|     ||      ||     || -- PKGBUILD
+
| -- community/
...   ...   ...   ...
+
|     || -- ...
</pre>
+
</nowiki>}}
 +
 
 +
The ABS tree has exactly the same structure as the package database:
 +
 
 +
* 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)
 +
 
 +
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 樹 ====
 +
以 root 身分執行:
 +
# 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}}.  
 +
 
 +
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 <repository>/<package>
 +
This way you do not have to check out the entire abs tree just to build one package.
 +
 
 +
=== /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]].)
 +
 
 +
==== 設定 /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:
 +
 
 +
===== 顯示所有軟體包 (包含 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
 +
 
 +
===== 只顯示軟體庫下的軟體包 =====
  
所以ABS樹和套件資料庫有完全相同的資料結構:
+
This example only shows packages contained in the repos defined in {{ic|/etc/pacman.conf}}:
* 第一階層的資料夾代表"種類"(categories)
+
* 第二階層的資料夾就是ABS,它的名字就是對應的套件的名字。
+
* 裏面的PKGBUILD檔案包含了該套件的訊息。
+
* 此外,ABS資料夾內可以包含補丁(patch)或是其他安裝套件需要的檔案
+
''請務必記得,ABS資料夾內並沒有真正的源代碼!!'' 取而代之的是'''PKGBUILD'''檔案,其含有可以被自動下載的URL來源。
+
=== 創建一個構建軟體的目錄===
+
你必須建造一個資料夾來進行編譯,且所有的動作都會在此進行。不建議你在ABS樹中建立此資料夾,一般來說建議你在家目錄下建立此資料夾(例:mkdir -r /home/yourusername/abs/local)。也有些Arch的使用者喜歡在/var/abs下令建立一個一般使用者權限的'local'資料夾。無論如何,接下來是複製一個你想建造的ABS資料夾從ABS樹到你建造的資料夾,以準備作軟體安裝的動作,在後面會有詳細介紹。(譯按:這就像你建立了一顆樹,樹上有各式各樣的水果,你指摘取你想要的水果下來到你家)
+
  
小提醒:第一次建造ABS樹的下載"數量"會很多,因為ABS樹很大。可能是連結的網路頻寬只能到56k,所以可能會下載很久。但是下載下來的只有純文字內容,此外也只有在鏡像站(mirror)有更新時才需要在下載,並不會佔用你很多空間,所以不要被下載的時間給嚇到了。
+
$ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1)
 +
binutils
 +
gcc
 +
gcc-libs
 +
glibc
 +
tar
  
閱讀到此你對ABS樹以及ABS應該有所概念了,但是我們要怎樣運用他呢?
+
=== 建立組建目錄 ===
  
== 構建軟體-傳統方法 ==
+
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建造軟體可以先跳到下一節去閱讀。)
+
如果你對從source編譯並不熟悉,那你可以藉此小節了解這個"傳統方法",且大部分的軟體都是藉由此方法編譯完成的。
+
(譯按:也是常說的make三步曲)
+
* 運用任何方法從遠端伺服器, ftp,或是利用網路瀏覽器、wget下載源代碼的tar壓縮檔(source tarbal)
+
* 解壓縮
+
  <pre>
+
  tar -xzf foo-0.99.tar.gz
+
  tar -xjf foo-0.99.tar.bz2</pre>
+
  
* 進入其資料夾
+
Create your build directory. e.g.:
  <pre>cd foo-0.99</pre>
+
  
* 建立正確的軟體配置:大部份的情況,資料夾內會有一個小腳本(script)叫作<code>configure</code>來協助你做軟體配置的動作(像是增加或減少東西,或是改變安裝的位置...等),此外,這個腳本會檢查你的電腦使否有該程式需要的其他程式。要執行這個腳本,用下列指令:(三步曲的第一步,對新手而言這是最困難的一大步,別放棄,此步成功剩下都很簡單)
+
  $ mkdir -p $HOME/abs
  <pre>./configure [[option]]</pre>
+
如果你是第一次使用建議你執行下列指令,去了解如何使用
+
  <pre>./configure --help</pre>
+
如果沒有--prefix選項在這腳本中(譯按:--prefix是安裝路徑的選項),"大部份"的狀況是使用/usr/local作為安裝路徑, 只有少數例外會在/usr。一般建議,安裝在/usr/local這個位置下,即--prefix=/usr/local。主要原因大部分的發行板套件管理程式(例:arch的pacman)都把軟體安裝在/usr下,因此傳統安裝建議裝到/usr/local下,此外也方便日後管理和區別。
+
  ./configure --prefix=/usr/local
+
  
* 編譯源代碼:(三部曲的第二步)
+
Copy the ABS from the tree ({{ic|/var/abs/<repository>/<pkgname>}}) to the build directory.
  <pre>make</pre>
+
  
* 安裝:(三部曲的第三步)
+
=== 組建軟體包 ===
  <pre>make install</pre>
+
* 如果需要進行反安裝則在此步進行:(譯按:反安裝也要進行前兩步驟,只在第三步不同)
+
make uninstall
+
  
然而,你應該癢良好習慣,每次去閱讀make生成的<code>INSTALL</code>檔案,去了解這是怎樣建造核安裝的。
+
In our example, we will build the ''slim'' display manager package.
特別注意!!並非所有軟體都採用<code>configure; make; make install</code>標準的安裝三部曲。
+
  
''以上是傳統方法,此方法可以從源代碼製造軟體,也適用於Arch Linux,但是ABS提供了一個有別於傳統方法且有效率、簡單而且精美的選擇''
+
Copy the slim ABS from the ABS tree to a build directory:
 +
$ cp -r /var/abs/extra/slim/ ~/abs
  
== 構建軟體-ABS方法 ==
+
Navigate to the build directory:
 +
$ cd ~/abs/slim
  
ABS是一個精美的工具,但同時也是協助你特製建造軟體強大的助手。接序之前從ABS樹上複製ABS到建立的資料夾,再來要製作package。
+
Modify the PKGBUILD to add or remove support for components, to patch or to change package versions, etc. (optional):
 +
$ nano PKGBUILD
  
接下來我們會用製作''slim''這個程式做範例。
+
Run makepkg as normal user (with {{ic|-s}} switch to install with automatic dependency handling):
 +
$ makepkg -s
  
#同於之前,先從ABS樹上找到Slim,再複製到建造資料夾。
+
{{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]].}}
cp -r /var/abs/extra/x11/slim /home/yourusername/abs/local
+
#進入建造資料夾
+
cd /home/yourusername/abs/local/slim
+
#利用makepkg這項工具,他會自動幫我們下載源代碼tar壓縮檔(source tarball),並且自動進行解壓縮、編譯和製造一個.pkg.tar.gz檔案。如果利用 -i 這個選項makepkg還會自動呼叫pacman完成後的安裝。
+
  makepkg -i
+
(譯按:利用makepkg -i可以從下載到安裝一次到位,若只需要中間的.pkg.tar.gz則不要加入-i選項)
+
  
完成了。如果你還想清除過程中的檔案可以利用pacman。如果想要移除則使用
+
Install as root:
  pacman -R slim
+
# pacman -U slim-1.3.0-2-i686.pkg.tar.xz
  
如果你剛剛忘記加入-i選項就直接執行makepkg,或是你以其他方式取得.pkg.tar.gz檔案(比如從AUR取得),你只需要執行下列指令去安裝
+
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}}.
  pacman -U slim.pkg.tar.gz
+
  
* ''ABS提供了方便自動的方法,但是他仍然讓安裝過程維持全程透明化給使用者,其實控制這些安裝流程的方法都記載在PKGBULID中''
+
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.
了解更多關於PKGBULID可以看 [[Creating Packages]],這裡有完整PKGBULID完整的範例
+
  
== 更多 ABS 相關資訊 ==
+
==== fakeroot ====
* [[Makepkg]]
+
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|/}}).
* [[Creating Packages]]
+
* [[Safe Cflags]]
+
* [[Kernel Compilation with ABS]]
+
* [[Arch User Repository]]
+
* [[Custom local repository with ABS and gensync]]
+

Revision as of 08:26, 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/
|     || -- ...

The ABS tree has exactly the same structure as the package database:

  • 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)

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 樹

以 root 身分執行:

# abs

Your ABS tree is now created under /var/abs. Note the appropriate branches of the ABS tree now exist and correspond to the ones you specified in /etc/abs.conf.

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 <repository>/<package>

This way you do not have to check out the entire abs tree just to build one package.

/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
只顯示軟體庫下的軟體包

This example only shows packages contained in the repos defined in /etc/pacman.conf:

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

建立組建目錄

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 /var/abs/, owned by a normal user.

Create your build directory. e.g.:

$ mkdir -p $HOME/abs

Copy the ABS from the tree (/var/abs/<repository>/<pkgname>) to the build directory.

組建軟體包

In our example, we will build the slim display manager package.

Copy the slim ABS from the ABS tree to a build directory:

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

Navigate to the build directory:

$ cd ~/abs/slim

Modify the PKGBUILD to add or remove support for components, to patch or to change package versions, etc. (optional):

$ nano PKGBUILD

Run makepkg as normal user (with -s switch to install with automatic dependency handling):

$ makepkg -s
Note: Before complaining about missing (make) dependencies, remember that the 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.

Install as root:

# 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 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 (/).