# PKGBUILD (正體中文)

相關文章

- Arch packaging standards
- Arch 組建系統
- Creating packages
- 軟體包開發分類
- Custom local repository
- pacman tips
- Arch 使用者倉庫
- makepkg
- pacman

This article or section is out of date.

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: 這些包不能被同時安裝。這裡 foo 跟 yafoo (另外一個 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 相關資訊

- ABS The Arch Build System
- Creating packages
- Makepkg
- Safe Cflags
- Kernel Compilation with ABS
- Arch User Repository
- Custom local repository with ABS and gensync

Categories:

- 正體中文
- Package development (正體中文)

Hidden category:

- Pages or sections flagged with Template:Out of date