PKGBUILD (正體中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Tango-view-refresh-red.pngThis article or section is out of date.Tango-view-refresh-red.png

Reason: please use the first argument of the template to provide a brief explanation. (Discuss in Talk:PKGBUILD (正體中文))

因為有 ABS,Arch 用戶可輕易將源代碼編譯為一個 .pkg.tar.gz 安裝包.

什麼是安裝包文件?

記住,ABS自動為你要編譯的那個軟體下載源代碼。然後解包,編譯,然後將編譯好的文件壓入一個安裝包中。
一般來說,得到的這個安裝包文件就是一個以 .pkg.tar.gz 結尾的文件,例如:foo.pkg.tar.gz.

事實上,它不僅僅是一個 gzip 壓縮過的 tar 檔案文件('tarball'),它含有:

  • 將要安裝的文件
  • .PKGINFO: 包含 pacman 要處理的安裝包,依賴性文件等所有的元數據。
  • .FILELIST: 該文件記錄了檔案中所有文件的列表。它被用於反安裝軟體,或檢查衝突文件。
  • .INSTALL: 該文件用在安裝/升級/刪除的階段之後執行命令(僅當 PKGBUILD 中創造出指定時,該文件才會存在)

因為 pacman 能管理 tar.gz 安裝包, 于是,用 ABS 創建的 ***.pkg.tar.gz 就能輕易被安裝或刪除了。

什麼是 PKGBUILD 文件,其內容是什麼?

前面解釋過了 PKGBUILD 文件,它記錄了一個安裝包的元數據。它是一個文本文件。這裡是一個例子:

# $Id: PKGBUILD,v 1.12 2003/11/06 08:26:13 dorphell Exp $
# Maintainer: judd <jvinet@zeroflux.org>
# Contributor: Judd Vinet <jvinet@zeroflux.org>
pkgname=foo
pkgver=0.99 # note: if the pkgver had been '0.99-10' then use an underscore, i.e. '0.99_10'
pkgrel=1
pkgdesc="short description of foo"
arch=(i686 x86_64)
url="http://www.foo.org"
license=('GPL')
groups=
provides=
depends=('qt' 'python')
makedepends=('guile')
conflicts=('yafoo')
replaces=('mffoo')
backup=('etc/foo/foo.conf')
install=('foo.install')
source=(http://www.foo.org/download/$pkgname-$pkgver.tar.gz)
md5sums=('2c0cca3ef6330a187c6ef4fe41ecaa4d35175bee593a7cc7d6205584a94d8625')

build() {
  cd $startdir/src/$pkgname-$pkgver
  ./configure --prefix=/usr
  make || return 1
  make prefix=$startdir/pkg/usr install
}

現在讓我們來逐條解釋一下:

  • # abc ... : 這是註釋文字
  • # $Id: PKGBUILD,v ...: 該安裝包的 cvs 標籤 (從 archlinux-cvs 系統創建)
  • # Maintainer: 在官方軟體庫中負責此安裝包的維護人
  • # Contributor: 寫出此安裝包 PKGBUILD 文件的第一人
  • pkgname: 安裝包名稱
  • pkgver: 安裝包的版本號
  • pkgrel: 此 Arch 安裝包的釋出號。它不同於版本號。當PKGBUILD 文件有改動時,釋出號就改變了。這種情況有多種原因,例如你為某個包開啟了編譯時間支援。
  • pkgdesc: 安裝包的簡明描述。這也是你瀏覽package database時會見到的。
  • arch: 表明它在哪種架構下構建和工作的,軟體移植的細節可參閱Arch64 FAQ
  • url: 軟體的主頁 (當你在安裝包數據庫中點擊它時候,就能出現了)
  • license: 基於哪種軟體發佈許可
  • groups: 這一倏用於為軟體分組;例如當你要安裝 KDE 時,它就會安裝屬於 KDE 軟體組的所有安裝包。
  • provides: 如果一個安裝包也提供了其它包的安裝,那就使用它。例如,kernel-scsi 也提供了 kernel 的安裝包。
  • depends: 它列出了安裝包運行時的依賴軟體 (必須有這些軟體才能正常工作)
  • makedepends: 在構建安裝包時需要的依賴性軟體,不過一旦已經構建好的,就不再需要了。
  • conflicts: 這些包不能被同時安裝。這裡 fooyafoo (另外一個 foo) 有衝突。它們不能共存。
  • replaces: 新安裝包代替了舊的。這裡, mffoo (第一個 foo) 不再受到支持了,被 foo 所代替。
  • backup: 當刪除安裝包時,用哪個文件作為備份文件(如 file.pacsave) 。
  • install: 指定一個特別安裝腳本,它將被包含在安裝包中(必須跟 PKGBUILD 在同一個目錄下)
  • source: 它指定了從何處下載該安裝包的源代碼包。它可以在本地電腦上,也可以是從 "http" 或 "ftp" 上取得的。它用 pkgver 來命名,以免每次源碼包變動時,源碼的名稱也要跟著變化。
  • md5sums: 計算源代碼包的 md5 值,以查驗完整性。

現在來解釋一下函數:

  • build: 構建一個安裝包時所需要的所有動作(稍候本文將作更詳細的說明)

好,你看到了 PKGBUILD 文件含有包管理器可能需要的所有資訊,它是 pacman 和 abs 的核心。

還會有些安裝文件。這個 PKGBUILD 指定了 'foo.install' 作為安裝包的安裝文件。這是例子:

post_install() {
/bin/true
}

post_upgrade() {
/bin/true
}

pre_remove() {
/bin/true
}

op=$1
shift

$op "$@"

其中的函數說明如下:

  • post_install: 文件一裝完,此腳本就運行。它跟了一行命令:
    • 對本安裝包版本操作
  • post_upgrade: 文件一升級完,此腳本就運行。它跟了兩行命令:
    • 對新安裝包版本操作
    • 對舊安裝包版本操作
  • pre_remove: 此腳本運行於文件刪除前(例如停止了一個守護進程)。它跟了一行命令:
    • 對本安裝包版本操作

底下的那三行是每一個安裝文件都需要的,以便安裝文件正常運行。

構建函數之解釋

那麼來看看上面例子中用到的 ABS 的構建函數。注意 build 一節:

build() {
  cd $startdir/src/$pkgname-$pkgver
  ./configure --prefix=/usr
  make || return 1
  make prefix=$startdir/pkg/usr install
}

發生了什麼:

  • 進入源代碼包的解壓目錄:
cd $startdir/src/$pkgname-$pkgver
  • 配置安裝包,並告訴它安裝到 /usr 這個目錄下:
./configure --prefix=/usr
  • 編譯
  make || return 1
  • 軟體不直接安裝到 /usr 下,而是裝到 $startdir/pkg/usr 下,以便 pacman 能控制這些文件。
make prefix=$startdir/pkg/usr install

我們想要做的是構建這個安裝包,而不是去安裝它。所以我們告訴 make 將所有的文件放到指定目錄下面 $startdir/pkg/usr ,而不是安裝到標準的位置 /usr
這樣一來, makepkg 就能查看到這個安裝包要安裝哪些個文件了,並將其壓縮成 Arch 安裝包。

注意: 有時候,Makefile 中並未使用 prefix ;經常是用了 DESTDIR 。如果此安裝包是用 autoconf/automake 來構建的,就用 DESTDIR 。這是在手冊中 詳細說明了的。檢查一下產生的 filelist 是否比平常小很多,如果是這樣的話,嘗試用 make DESTDIR=$startdir/pkg install 來構建。如果不能正常工作,那就要深入研究一下安裝命令了,它們位於 "make <...> install=" 中。

更多 ABS 相關資訊