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