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

From ArchWiki
Jump to: navigation, search
m (improve link)
(update interlanguage links)
(Tag: wiki-scripts)
 
(15 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[[Category:HOWTOs (正體中文)]]
+
[[Category:正體中文]]
[[Category:安裝包管理 (正體中文)]]
+
[[Category:About Arch (正體中文)]]
 +
[[Category:Package development (正體中文)]]
 +
[[Category:Package management (正體中文)]]
 
[[cs:Arch Build System]]
 
[[cs:Arch Build System]]
 
[[da:Arch Build System]]
 
[[da:Arch Build System]]
Line 12: Line 14:
 
[[ko:Arch Build System]]
 
[[ko:Arch Build System]]
 
[[pl:Arch Build System]]
 
[[pl:Arch Build System]]
 +
[[pt:Arch Build System]]
 
[[ro:ABS]]
 
[[ro:ABS]]
 
[[ru:Arch Build System]]
 
[[ru:Arch Build System]]
[[tr:Arch_derleme_sistemi]]
+
[[zh-hans:Arch Build System]]
[[zh-CN:Arch Build System]]
+
{{Related articles start (正體中文)}}
=  ABS 是什麼? =
+
{{Related2|Arch packaging standards|Arch 打包標準 (英)}}
ABS (Arch Build System),Arch 構建系統。它是一套像(BSD)Ports 一樣的體系,能從 '''source(源代碼)''' 來構建一個軟件。Pacman 是 Arch 下特定的二進制安裝包管理工具(也包括管理那些從 ABS 構建的二進制安裝包),而 ABS 則是 Arch 下特定的編譯工具,將源代碼編譯為一個可供安裝的 .pkg.tar.gz 包。
+
{{Related2|Creating packages|建立軟體包 ()}}
 +
{{Related2|Kernel Compilation with ABS|核心編譯與 ABS (英)}}
 +
{{Related2|PKGBUILD|PKGBUILD (英)}}
 +
{{Related2|makepkg|makepkg (英)}}
 +
{{Related2|pacman (正體中文)|pacman}}
 +
{{Related2|Official repositories (正體中文)|官方倉庫}}
 +
{{Related2|Arch User Repository (正體中文)|使用者倉庫}}
 +
{{Related articles end}}
 +
{{翻譯狀態|Arch_Build_System|2014-01-30|284196}}
  
==什麼是像(BSD)Ports 一樣的系統?==
+
本文提供 Arch 組建系統的概覽,以及帶領初學者進行一遍操作。此文非完整的參考指南!如果需要更多資訊,請參考 man 手冊頁。
'Ports' 體系被用於 FreeBSD (和其它 BSD 作業系統),它允許下載,解包,修補,編譯和安裝'''source(源代碼)''' 包。'' 'port' 僅僅是用戶電腦上,以要安裝的相應軟件來命名的一個小目錄,它包含一些文件,以指導從軟體的來源處下載安裝一個包,一般都是找到那個目錄/port,然後依次用命令 "make" 和 「make install」,'Ports' 體系就會開始下載,編譯和安裝那個軟體了。
+
{{註記|ABS 一天同步一次,因此它和軟體庫上的版本稍微會有一點差距。}}
 +
== 什麼是 Arch 組建系統? ==
  
=='''ABS''' 的概念==
+
Arch 組建系統 (Arch Build System),縮寫為 '''ABS''',是一套類似(BSD)ports 的系統,能從原始碼組建軟體並打包。[[pacman (正體中文)|Pacman]] 是 Arch 下特定的二進制安裝包管理工具(也包括管理那些從 ABS 組建的二進制安裝包),ABS 則是一組工具集,將原始碼編譯為一個可供安裝的 .pkg.tar.gz 軟體包。
'''ABS''' 是由目錄樹組成('''ABS Tree'''),位於  /var/abs 之下,包含了不少子目錄。這些子目錄都在某個類別裡面,並分別以其安裝包的名字來命名。你可以將這些以安裝包的名字來命名子目錄,稱為 'ABS',就如同這樣稱呼 'port' 一樣。這些 '''ABS''',或子目錄,'''並不包含軟體安裝包,也沒有它們的源代碼''',而是含有一個 '''PKGBUILD''' 文件 (有時也含有其它一些文件)。  PKGBUILD 是一個簡單的文本文件,含有編譯與打包的指令,也含有下載適當源碼包的URL地址。'' ABS 體系中最重要的組成部分就是 PKGBUILDs 了。''
 
  
==快速瀏覽==
+
=== 什麼是類似 ports 的系統? ===
以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/)
+
''Ports'' 是 *BSD 下從原始碼組建軟體的自動化系統。系統使用一個 ''port'' 下載、解壓縮、修補、編譯並安裝給定的軟體。一個 ''port'' 差不多就是使用者電腦上的一個小目錄,以要安裝的相對應軟體命名,內部有幾個檔案指示如何從原始碼組建、安裝軟體。這讓安裝軟體這回事和在 port 目錄下輸入 {{ic|make}} 或 {{ic|make install clean}} 一樣簡單。
  
有了'''ABS樹'''後,Arch的使用者可以在彈指間快速地從源代碼(source)編譯想要的套件(package)。
+
=== ABS 是類似的概念 ===
  
==ABS重要特色==
+
ABS 由目錄樹組成 (ABS tree),位於 {{ic|/var/abs}} 之下。這個樹包含了許多子目錄,每個子目錄有各自的分類與相對應的軟體包命名。這顆樹表示 (但不包含) 所有'''官方 Arch 軟體''',可以透過 SVN 系統取得。您可以將這些以軟體包的名字命名的子目錄稱作 'ABS',就如同這樣稱呼 'port' 一樣。這些 ABS (或子目錄) 不包含軟體包,也不包含原始碼,只有一份 [[PKGBUILD]] 檔案 (有時還會有其他檔案)。PKGBUILD 只是一個 Bash 組建腳本 -- 這份文字檔包含編譯與打包指令,以及下載適合'''來源'''封存包的 URL。(ABS 最重要的組件就是 PKGBUILD。) 呼叫 ABS 的 [[makepkg]] 指令後,首先軟體會被編譯,接著在組建目錄下'''打包'''。之後您便可以使用 [[pacman (正體中文)|pacman]] 這個 Arch Linux 軟體包管理員來安裝、升級、移除您的新軟體包。
除了之前提到的功能,ABS還有兩大特色
 
* 你還可以使用'''[[makepkg]]''這項工具,去創造一個套件(package),然後在社群上分享。同樣的這個.pkg.tar.gz套件一樣,在你想要移除時,利用pacman乾淨地清除。
 
* ABS工具讓你可以利用[[AUR]],或者是其他Arch使用者貢獻的PKGBULDs,這是一個你使用上非常方便已經先行處理裡過的PKGBULDS。
 
  
==ABS 系統的概況==
+
=== ABS 快速瀏覽 ===
'ABS'可以說是一個"保護傘",因為他包含而且相依很多其他的元件。雖然技術上來說不是那麼精確,但是它是一個完整的工具包(toolkit)且考慮了系統的結構和系統的工具。
 
  
關鍵名詞解釋:
+
'ABS' 包含並依賴數個其他組件,因此可被當作這些組件的總稱;雖然在技術上並非完全準確,'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? =
+
; ABS 樹: ABS 目錄架構;(本地) 機器 {{ic|/�var/abs/}} 目錄下的 SVN 階層。包含數個子目錄,以所有 {{ic|/etc/abs.conf}} 下指定軟體庫中可用的官方 Arch Linux 軟體命名,但不存放軟體包本身。以 [[pacman (正體中文)|pacman]] 安裝 {{Pkg|abs}}{{Broken package link|package not found}} 軟體包,並執行 {{ic|abs}} 腳本,這顆樹才會被建立。
ABS主要是用於:
 
* 新的軟體出現後,官方還沒有提供該套件,因此可以從源代碼(source)製造新的套件(package),詳見[[Creating Packages]])  
 
* 透過[[AUR]]建造而且分享套件
 
* 按照自己的特殊需求去製造一個為自己量身訂作的套件
 
* 利用compiler flags來重建整個系統,類似"FreeBSD"
 
* 乾淨的建造你個人特製的內核(詳見[[Kernel Compilation]])
 
* 針對你特製的內核製造適合的內核模組。
 
  
使用Arch Linux並不一定要用ABS,但是他是好用且自動化的編譯源代碼的工具。
+
; [[PKGBUILD]]: 包含原始碼 URL、編譯與打包指令的 [[Bash]] 腳本。
這個HOW-TO主要讓你對ABS和Arch套件有概括性的了解,但是內容不夠完整。如果你願意了解更多,建議閱讀使用者手冊(man)。
 
  
= 首先:安裝二進制安裝包 =
+
; [[makepkg]]: ABS shell 指令工具,會閱讀 PKGBUILD、自動下載並編譯原始碼,並根據 {{ic|makepkg.conf}} 的 {{ic|PKGEXT}} 行建立 {{ic|.pkg.tar*}}。您也可以使用 makepkg 建立來自 [[AUR (正體中文)|AUR]] 或第三方來源的自訂軟體包。(參閱[[Creating packages|建立軟體包]] wiki 文章。)
  
要使用ABS,請先從core repository安裝'''abs''',只需要打下列指令
+
; [[pacman (正體中文)|pacman]]: pacman 和 ABS 完全切割,但若需要的話,可以由 makepkg 呼叫或手動執行。用途為安裝、移除組建軟體包與抓取相依軟體包。
<pre>
 
pacman -S abs</pre>
 
  
這將會自動抓取需要的軟體。
+
; [[Arch User Repository (正體中文)|AUR]]: Arch 使用者倉庫和 ABS 基本上無關,但 (未受支援的) AUR PKGBUILD 可透過 makepkg 組建,編譯和打包軟體。與位於您本地機器上的 ABS 樹不同,AUR 基於網站介面。它包含數千個由使用者貢獻的 PKGBUILD,這些是無法從官方 Arch 軟體庫獲取的軟體。如果您需要組建官方 Arch 樹以外的軟體包,到 AUR 會有機會找得到。
  
== /etc/abs.conf ==
+
== 我為什麼要用到 ABS? ==
將你需要的軟體儲存庫(repository)加到 /etc/abs.conf 內(即編輯/etc/abs.conf):
+
 
nano /etc/abs.conf
+
Arch 組建系統被用來:
移除在軟體儲存庫前的(repository)'!',表示採用其軟體儲存庫(repository)
+
* 編譯或重新編譯軟體包,不論任何原因
REPOS=(core extra community !testing)
+
* 若沒有可用的軟體包,可以從軟體原始碼建立並安裝新軟體包 (參閱[[Creating packages|建立軟體包]])
 +
* 已存在軟體包可以自訂以符合您的需求 (啟用或停用選項、修補程式)
 +
* 使用您的編譯器旗標重新組建整套系統,「和 FreeBSD 一樣」 (例如使用 [[pacbuilder]])
 +
* 乾淨的組建安裝您自訂的核心 (參閱[[Kernel Compilation|核心編譯]])
 +
* 讓核心模組在您自訂的核心下可以運作
 +
* 簡單編譯安裝 Arch 較新、較舊、測試或開發版本的軟體包,只需編輯 PKGBUILD 的版本號
 +
 
 +
ABS 並非 Arch Linux 下必需功能,但它是相當好用的原始碼編譯自動化工具。
 +
 
 +
== 如何使用 ABS ==
 +
 
 +
使用 abs 組建軟體包由以下步驟組成:
 +
# 用 [[pacman (正體中文)|pacman]] 安裝 {{Pkg|abs}}{{Broken package link|package not found}} 軟體包。
 +
# 以 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,首先需要從[[Official repositories (正體中文)|官方軟體庫]][[pacman (正體中文)|安裝]] {{Pkg|abs}}{{Broken package link|package not found}}。
 +
 
 +
將會抓取 abs 同步腳本、各種組建腳本以及 [[rsync]] (若沒有的話會以相依軟體安裝)
 +
 
 +
在真正組建任何東西之前,您還需要基本的編譯工具。這些工具被收集於 {{grp|base-devel}} 這個[[Pacman (正體中文)#安裝軟體群組|軟體群組]]。用 pacman 安裝這個群組。
 +
 
 +
=== /etc/abs.conf ===
  
== 創建 ABS 樹 ==
+
以 root 身分編輯 {{ic|/etc/abs.conf}},將您想要的軟體庫包含近來。
以root執行
 
abs
 
此指令會建立ABS樹在/var/abs下。此外,ABS樹會紀錄在/etc/abs/abs.conf
 
''週期性打abs這個指令,幫助您更新您ABS樹''
 
  
== /etc/makepkg.conf ==
+
移除適當軟體庫前面的 {{ic|!}}。舉例來說:
 +
REPOS=(core extra community !testing)
  
Edit /etc/makepkg.conf to specify environment variables and CFLAGS:
+
=== ABS 樹 ===
nano /etc/makepkg.conf
 
  
==  ABS 樹 ==
+
ABS 樹是 {{ic|/var/abs}} 下的 SVN 目錄階層,長得像這樣:
當你第一次執行abs指令,它會和arch的伺服器同步建造ABS樹,並且採用cvs系統。
 
那什麼是ABS樹呢?它其實是在/var/abs下建立的樹狀資料結構。
 
像下面這個:
 
  
<pre>
+
{{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>}}
 +
 
 +
ABS 樹的架構和軟體包資料庫的架構完全一模一樣:
 +
 
 +
* 第一層:軟體庫名稱
 +
* 第二層:軟體包名稱的目錄
 +
* 第三層:PKGBUILD (包含組建軟體包所需資訊) 和其他相關檔案 (修補程式,和其他組建軟體包所需檔案)
 +
 
 +
ABS 目錄下並沒有軟體包的原始碼。'''PKGBUILD''' 檔案包含了原始碼的下載 URL,在組建軟體包時才會下載過來。因此 abs 樹其實相當小。
 +
 
 +
==== 下載 ABS 樹 ====
 +
以 root 身分執行:
 +
# abs
 +
 
 +
現在,您的 ABS 樹已經建立在 {{ic|/var/abs}} 下。在 {{ic|/etc/abs.conf}} 指定的軟體庫,在 ABS 樹下也出現相對應的分支。
 +
 
 +
abs 指令應該定期執行,以和官方軟體庫同步。單一的 ABS 軟體包檔案也可以用下列指令下載:
 +
 
 +
# abs <倉庫>/<軟體包>
 +
這樣您在組建一份軟體包時,就不需要檢查整個 abs 樹。
 +
 
 +
=== /etc/makepkg.conf ===
 +
 
 +
{{ic|/etc/makepkg.conf}} 指定了全域環境變數與編譯器旗標,若您使用 SMP (對稱多處理) 系統,或打算做其他優化的話,可以編輯這個檔案。預設設定值會對 i686 和 x86_64 作優化,在這類型架構的單核 CPU 系統下運作良好。(預設值也適用於 SMP 機器,但編譯時只會使用一個核心/CPU -- 參閱 [[makepkg.conf]]。)
 +
 
 +
==== 設定 /etc/makepkg.conf 的 PACKAGER 變數 ====
 +
 
 +
{{ic|/etc/makepkg.conf}} 的 PACKAGER 變數設定是選用但'''強烈建議'''的步驟。它可以快速偵測哪個軟體包是由您組建/安裝,而非官方維護者!使用來自 community 庫的 {{Pkg|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
 +
 
 +
===== 只顯示軟體庫下的軟體包 =====
  
所以ABS樹和套件資料庫有完全相同的資料結構:
+
這個範例只顯示存在於 {{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應該有所概念了,但是我們要怎樣運用他呢?
+
=== 建立組建目錄 ===
  
== 構建軟體-傳統方法 ==
+
建議另外建立一個組建目錄,作為實際編譯使用;您不應直接在 ABS 樹組建,動到 ABS 樹,否則在每次 ABS 升級時會有資料遺失 (被覆寫)。使用自己的家目錄是個好辦法,有些 Arch 使用者會偏好在 {{ic|/var/abs/}} 下建立一個 'local' 目錄,由一般使用者擁有。
在真正從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>
 
  
* 進入其資料夾
+
建立您的組建目錄。例如:
  <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
 
  
* 編譯源代碼:(三部曲的第二步)
+
({{ic|/var/abs/<倉庫>/<軟體包名稱>}}) 樹複製 ABS 到組建目錄。
  <pre>make</pre>
 
  
* 安裝:(三部曲的第三步)
+
=== 組建軟體包 ===
  <pre>make install</pre>
 
* 如果需要進行反安裝則在此步進行:(譯按:反安裝也要進行前兩步驟,只在第三步不同)
 
make uninstall
 
  
然而,你應該癢良好習慣,每次去閱讀make生成的<code>INSTALL</code>檔案,去了解這是怎樣建造核安裝的。
+
在這個範例,我們將組建 ''slim'' 顯示管理員。
特別注意!!並非所有軟體都採用<code>configure; make; make install</code>標準的安裝三部曲。
 
  
''以上是傳統方法,此方法可以從源代碼製造軟體,也適用於Arch Linux,但是ABS提供了一個有別於傳統方法且有效率、簡單而且精美的選擇''
+
將 ABS 樹的 slim ABS 複製到組建目錄:
 +
$ cp -r /var/abs/extra/slim/ ~/abs
  
== 構建軟體-ABS方法 ==
+
切換到組建目錄:
 +
$ cd ~/abs/slim
  
ABS是一個精美的工具,但同時也是協助你特製建造軟體強大的助手。接序之前從ABS樹上複製ABS到建立的資料夾,再來要製作package。
+
修改 PKGBUILD 可新增和移除組件的支援、做修補或更改軟體包版本 (選用):
 +
$ nano PKGBUILD
  
接下來我們會用製作''slim''這個程式做範例。
+
以一般使用者身分執行 makepkg ({{ic|-s}} 選項會自動處理安裝相依性):
 +
$ makepkg -s
  
#同於之前,先從ABS樹上找到Slim,再複製到建造資料夾。
+
{{註記|若出現缺少的 (make) 相依性,請記得,預設假定所有的 Arch Linux 系統已經安裝 {{Grp|base}} 群組。當使用 '''makepkg''' 組建時也假定已安裝 {{Grp|base-devel}} 群組。參閱[[#安裝工具]]。}}
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。如果想要移除則使用
+
以 root 身分安裝:
  pacman -R slim
+
# pacman -U slim-1.3.0-2-i686.pkg.tar.xz
  
如果你剛剛忘記加入-i選項就直接執行makepkg,或是你以其他方式取得.pkg.tar.gz檔案(比如從AUR取得),你只需要執行下列指令去安裝
+
這樣就完成了。您已經從原始碼組建了 slim,並用 pacman 安裝到您的系統,毫無瑕疵。軟體包移除也可以用 pacman 處理:{{ic|pacman -R slim}}。
  pacman -U slim.pkg.tar.gz
 
  
* ''ABS提供了方便自動的方法,但是他仍然讓安裝過程維持全程透明化給使用者,其實控制這些安裝流程的方法都記載在PKGBULID中''
+
ABS 方法導入了方便性與自動化,也為組建與安裝函式維持完整的透明度和控制 (它們被包進 PKGBUILD 裡面)。
了解更多關於PKGBULID可以看 [[Creating Packages]],這裡有完整PKGBULID完整的範例
 
  
== 更多 ABS 相關資訊 ==
+
==== fakeroot ====
* [[Makepkg]]
+
基本上,傳統方法 (一般包含 {{ic|./configure, make, make install}} 步驟) 也會執行相同的步驟,但軟體會被安裝到 ''fake root'' (偽根目錄) 環境下。(''fake root'' 只是組建目錄下一個子目錄,其作用和表現像是系統的根目錄。和 '''fakeroot''' 程式不同,makepkg 會建立一個假根目錄,並將編譯的二進位檔與相關檔案安裝進來,以 '''root''' 為檔案擁有者。) 這個 ''fake root'',或包含編譯軟體的子目錄樹,接著會被壓縮為副檔名 {{ic|.pkg.tar.xz}} 的封存檔,又稱「軟體包」。pacman 接著會解壓縮這個軟體包 (安裝) 至系統真正的根目錄 ({{ic|/}})。
* [[Creating Packages]]
 
* [[Safe Cflags]]
 
* [[Kernel Compilation with ABS]]
 
* [[Arch User Repository]]
 
* [[Custom local repository with ABS and gensync]]
 

Latest revision as of 08:08, 13 December 2017

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

本文提供 Arch 組建系統的概覽,以及帶領初學者進行一遍操作。此文非完整的參考指南!如果需要更多資訊,請參考 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[broken link: package not found] 軟體包,並執行 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[broken link: package not found] 軟體包。
  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[broken link: package not found]

將會抓取 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 接著會解壓縮這個軟體包 (安裝) 至系統真正的根目錄 (/)。