Arch Linux 軟件包制作入門
PKGBUILD 文件是為 Arch Linux 及其衍生版(如 Manjaro)構建和創建軟件包的方式。
如果你曾經使用過 AUR(即 Arch Linux 的用戶維護的 PKGBUILD 存儲庫),你甚至可能也遇到過它們。
但是,到底是如何從 PKGBUILD 到可安裝軟件包的呢?這兩者之間到底發生了什么,如何把自己的軟件制作成軟件包呢?你將在這篇文章中了解這些。
PKGBUILD 基礎知識
對于那些熟悉 Bash 或其他 shell 的人來說,你可能知道,PKGBUILD 就是一個帶有一些變量的 shell 腳本。
PKGBUILD 文件由變量和函數組成,所有這些都是用來定義軟件包本身,以及如何構建它。
為了從 PKGBUILD 中創建一個軟件包,需要使用 makepkg 命令行工具。在獲得 PKGBUILD 文件后,你只需在包含 PKGBUILD 的目錄中運行 `makepkg',就可以得到一個可安裝的軟件包了。
在本教程中,你將會看到我剛剛制作的軟件包,它在運行時打印出 “Hello World!”。
準備
為了繼續學習本教程,你需要創建幾個文件。
首先,你需要創建一個名為 PKGBUILD 的文件,它將作為構建你的軟件包的“配方”。
你需要做的另一個文件是一個叫 hello-world.sh 的文件。我稍后會解釋它的用途。
你也可以用一個命令來創建這兩個文件:
- touch PKGBUILD hello-world.sh
你可以用 ls 命令檢查這些文件是否被創建。
然后你就可以開始了!
設置你的 PKGBUILD 文件
我不會讓你復制粘貼整個文件,而是和你一起鍵入每一行,這樣你就能更好地理解每一行的目的。如果你不喜歡這種學習方式,我強烈推薦 Arch 維基 中為 Arch Linux 創建軟件包的文章。
這篇文章也沒有介紹 PKGBUILD 中可以設置的每一個選項,只是介紹了一些常用的選項,以便你能盡快上手。
說完了這些,打開你的文本編輯器,讓我們直接進入正題吧。
pkgname
首先是 pkgname 變量。這是安裝時定義軟件包名稱的東西,也是 Arch Linux 的軟件包管理器 pacman 跟蹤軟件包的方式。
這個變量(以及其他一些變量)的格式是 variable=value,變量名在左邊,變量的值在右邊,用等號隔開。
要設置包的名稱,請在 PKGBUILD 中輸入以下內容:
- pkgname="hello-world"
- 要設置一個不同的軟件包名稱,用你的軟件包的名稱替換 hello-world。
- 這并不設置用于運行程序的命令,這將在下面的 package() 部分中處理。
pkgver
正如變量名稱本身所述,它設置了你的軟件包的版本(即 1.0.0)。這在用戶更新他們的系統時很有用,因為設置更高的版本會提示用戶升級。
要設置版本號,請在 PKGBUILD 中輸入以下內容(在前一行之后):
- pkgver="1.0.0"
pkgrel
這與 pkgver 變量有關,通常不需要知道。不過和 pkgver 變量一樣,如果它被換到一個更高的數字,就將通知用戶進行升級。
它適用于任何需要保持 pkgver 不變的情況下,例如 PKGBUILD 本身發生了變化。如果你為一個你使用的程序創建了一個 PKGBUILD(并希望保持軟件包的版本相同),而你需要修復 PKGBUILD 本身的一個錯誤,這將是非常有用的。
要設置這個變量,請在 PKGBUILD 中輸入以下內容:
- pkgver="1"
這個變量應該 總是 從 1 開始,然后一次一次地向上移動。當 pkgver 本身向上移動時,這個變量可以(也應該)重置為 1,因為 pkgver 本身會通知用戶升級。
pkgdesc
這將設置軟件包的描述,用于幫助更好地識別該軟件包。
要設置它,只需將描述放在引號內:
- pkgdesc="Hello world in your terminal!"
arch
這個變量設置軟件包所兼容的 硬件架構。如果你不明白什么是架構,那也沒關系,因為在大多數情況下,這個變量幾乎是無用的。
無論如何,makepkg 仍然需要設置它,這樣它就知道這個軟件包與我們的系統是兼容的。
這個變量支持設置多個值,所以 makepkg 需要一個不同的語法,如下所示。
要設置它,請在 PKGBUILD 中輸入以下內容:
- arch=("x86_64")
如果你要設置多個值,需要用空格和引號分隔每個值,像這樣。arch=(“x86_x64" "arm")。
depends
這列出了提供了我們的軟件包所需功能的所有軟件包。與 arch 一樣,它也可以包含多個值,因此必須使用括號語法。
由于我們的軟件包沒有任何依賴關系,所以我們不需要在 PKGBUILD 中輸入這個字段。然而,如果我們的軟件包有依賴關系,我們就會使用與 arch 相同的語法。
optdepends
這里列出了那些并不是提供所需功能而是額外功能的軟件包。
這與 depends 的語法相同。
conflicts
這告訴 pacman 哪些軟件包會導致我們的軟件包出現問題,或者以我們不希望的方式行事。
這里列出的任何軟件包都會在我們的軟件包被安裝之前被卸載。
這與 depends 的語法相同。
license
這定義了你的程序所采用的 軟件許可證。如果你需要幫助你選擇一個許可證,Arch 維基 提供了一些信息。如果你不知道該怎么設置,將其設置為 custom 也可以。
這與 arch 和 depends 的語法相同:
- license=("custom")
source
這就是 makepkg 如何知道要用什么文件來構建我們的軟件包。它可以包含各種不同類型的源,包括本地文件和 URL。
在添加本地文件時,要輸入相對于 PKGBUILD 文件的文件路徑,比如以下目錄布局:
- PKGBUILD
- file.txt
- src/file.sh
如果你想在我們的 PKGBUILD 中包括 file.sh,你需要輸入 src/file.sh 作為其名稱。
當輸入 URL 時,你只需輸入完整的 URL,即 https://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png。
你的這個軟件包只需要 hello-world.sh 文件,由于它和 PKGBUILD 在同一個目錄中,你只需輸入它的名字作為 source 的值。
這個變量也使用與 arch 和 depends 相同的語法:
- source=("hello-world.sh")
sha512sums
這是用來驗證 source 中的文件沒有被修改或下載錯誤。如何獲得這個值的信息可以在 Arch 維基關于 PKGBUILD 的文章 中找到。
如果你寧愿不設置這個(或者你只是不需要,例如對于本地文件),你可以為 source 變量中的每個文件輸入 SKIP:
- sha512sums=("SKIP")
package()
這是最后一個,也是實際制作我們的包的最重要的部分。在處理這個問題時,知道兩個變量很重要。
- ${srcdir}:這是 makepkg 放置 source 變量中文件的地方。在這個目錄中,你可以與這些文件進行交互,并對文件進行任何其他需要的修改。
- ${pkgdir}:這是我們放置將被安裝在系統中的文件的地方。 ${pkgdir} 的文件夾結構是按照實際系統中的情況設置的(例如,使用 pacman 安裝時,${pkgdir}/usr/bin/hello-world 會創建文件 /usr/bin/hello-world)。
package() 包含一個用于創建軟件包的命令列表。
因此,如果(假設)你需要有個在 /usr/share/motto.txt 寫著 “Linux is superior to Windows ”的文件,你會運行這樣的東西:
- package() {
- mkdir -p "${pkgdir}/usr/share"
- echo "Linux is superior to Windows" | tee "${pkgdir}/usr/share/motto.txt"
- }
關于上述命令的一些說明:
- ${pkgdir} 里面最初是 不包含 目錄的。如果你跳過了 mkdir 命令,tee 會輸出一個錯誤,說這個目錄不存在。
- 在指定目錄時,總是 在它們前面加上 ${pkgdir} 或 ${srcdir} 變量。如果輸入 /usr/share/motto.txt,就會按照字面意義指向你當前運行的系統中的 /usr/share/motto.txt。
對于你的 PKGBUILD,你將把 hello-world.sh 文件放在目標系統的 /usr/bin/hello-world 中。你還將使該文件在運行時說 “Hello to you!”。
要做到這一點,請在 PKGBUILD 中輸入以下內容:
- package() {
- echo 'Hello to you!' > "${srcdir}/hello-world.sh"
- mkdir -p "${pkgdir}/usr/bin"
- cp "${srcdir}/hello-world.sh" "${pkgdir}/usr/bin/hello-world"
- chmod +x "${pkgdir}/usr/bin/hello-world"
- }
然后就完成了!用 makepkg -si 構建和安裝軟件包,然后在終端運行 hello-world,查看其輸出。
總結
就這樣,你已經制作了你的第一個 PKGBUILD!你走在了為自己甚至是為 AUR 制作實際的軟件包的路上。
有什么問題,或者有什么地方不對嗎?請隨時在下面的評論區發表。