# VCS package guidelines (正體中文)

This article or section needs to be translated.

Notes: please use the first argument of the template to provide more detailed indications. (Discuss in Talk:VCS package guidelines (正體中文)#)

## 用 makepkg 打包 CVS, SVN & GIT 文件

事實上，這個工作非常簡單，您不需要什麼特殊的知識。不管怎麼樣，您對CVS和SVN的知識懂得越多越好。很多人在 PKGBUILD 文件裏面引入了不必要（譯注：這個詞是譯者加的，在儘量不影響理解的前提下，譯者可能會不自覺的使用自己的語言，後面不再聲明）的自定義變數，這樣會使工作變得複雜。這些看起來很複雜的語句並不是必須的，但是對於使語法結構清洗，是很有幫助的。

### 一些小提示

- 給 `pkgname` 加上 `-cvs` 或者 `-svn` 或者 `-git` 這樣的尾碼 （where applicable， 這個不知道怎麼翻譯） - 這樣可以防止和非devel版本的包名混淆，比如 fluxbox-svn ， fvwm-cvs 對 fluxbox ， fvwm.
- 您還必須小心處理 pacman 的衝突（依賴關係衝突）。比如 fluxbox-svn will 與 fluxbox 衝突。這樣您就需要使用 `conflicts=` 欄位（field）

    conflicts=('fluxbox')

  您還應該使用 `provides=` 欄位，以便讓需要 fluxbox （作者這裏用fluxbox來舉例）的包知道 fluxbox-svn 就是 fluxbox

    provides=('fluxbox')

  您最好不要使用(your should avoid using) `replaces=` ，它可能會產生不必要的麻煩

- When using/defining the cvsroot use anonymous:@ rather than anonymous@ to avoid having to press enter to give blank password OR anonymous:password@ - if a password is required.
- cvs and svn PKGBUILDs may not require a source or md5sum array but these fields must be included in the PKGBUILD if you wish to submit it to the AUR, otherwise the pkg will be rejected. They may be left blank though.

    source=()
    md5sums=()

- 使用 CVS/SVN/GIT 的時候，我們極少用到 pkgrel 欄位，因為原始檔案時有改動，所以我們通常用 pkgver 來標記改動（假定我們用 pkgver 來保存日期）（英文原文：It is rarely necessary to use the pkgrel field when building CVS/SVN/GIT pkgs - any changes to the pkg will often be on another day and so are usually accounted for by a change in pkgver (assuming pkgver is used to hold a date format)，英語不到家，有人會翻譯的mail:fluke at sfcube.net）
- 不要忘記把 svn 或者 cvs 包含在 `makedepends=` 裏面，如果必須的話（譯注：如果你要從 svn 來 checkout 源碼包，自然要要保證你有 svn 用戶端）
- 為了保證 check out(譯注：cvs和svn的術語，就不翻譯了) 下來的 code 的完整性，我們建立一個獨立的 build 目錄，比如你已經在 $startdir 把代碼 ckeck out 到了 src/$_cvsmod 目錄你可以:

      mkdir src/$_cvsmod-build

      cd src/$_cvsmod-build
      ../$_cvsmod/configure

萬一 這種方法失敗了，你可以嘗試：

      cp -r src/$_cvsmod src/$_cvsmod-build
      cd src/$_cvsmod-build

- AUR的介紹中說最重要的是不要使用 backtick 擴展去創建 pkg 變數(With the introduction of the AUR it is most important to avoid using backtick execution to create pkg variables)
  - 對於 cvs 包 您應該避免 `pkgver=`date +%y%m%d`` - （譯注：this also inteferes with the functionality of the AUR.，這句話不好翻譯，我不知道inteferes什麼意思） 作為替代的方案，還可以用日期格式的 $pkgver 變數，並且使用 cvs -D 去獲取從那個日期起的代碼 （看下面）
  - 對於 svn 您可以使用修正號(revision number)。下面是一種簡易的獲取修正號的方法：

    svn log $_svntrunk --limit 1 | grep -m 1 -o "r.*" | cut -d \| -f 1 | sed s@r@@g

這條命令從 svn repo (譯注：就是 svn 的源)最近額記錄裏面取得修正號--修正號的前面帶有r字母。下面的來自於 fluxbox 的 svn 記錄，修正號就在左上角，r4084。

    ------------------------------------------------------------------------
    r4084 | mathias | 2005-07-20 19:29:01 +0100 (Wed, 20 Jul 2005) | 16 lines

    Changed some *Focus options, just to make some things a bit more clear.
    the "Sloppy" was always a bit .. unprecise.

### CVS PKGBUILD 樣例

這裏用一個 bmp-cvs 的 PKGBUILD 來說明上面的一些技巧（一些小提示）

    # Contributor:  Lukas Sabota <punkrockguy318@comcast.net>
    # Contributor: dibblethewrecker dibblethewrecker.at.jiwe.dot.org
    pkgname=bmp-cvs
    pkgver=20050728
    pkgrel=1
    pkgdesc="BeepMP is a multimedia player that uses the WinAmp 2.x UI, GTK2, and is based on XMMS. This will checkout and package the latest CVS version."
    url="http://beepmp.sourceforge.net/"
    license=
    depends=('gtk2' 'libvorbis' 'alsa-lib' 'audiofile' 'libglade' 'id3lib' 'x-server')
    provides=('bmp')
    conflicts=('bmp')
    makedepends=('cvs')
    install=$pkgname.install

    _cvsroot=":pserver:anonymous:@cvs.sourceforge.net:/cvsroot/beepmp"
    _cvsmod="bmp"

    build() {
      cd $startdir/src
      msg "Connecting to $_cvsmod.sourceforge.net CVS server...."
      cvs -z3 -d $_cvsroot co -D $pkgver -f $_cvsmod
      cd $_cvsmod
      ./autogen.sh

      msg "CVS checkout done or server timeout"
      msg "Starting make..."

      cp -r ../$_cvsmod ../$_cvsmod-build
      cd ../$_cvsmod-build

      ./configure --prefix=/usr
      make || return 1
      make DESTDIR=$startdir/pkg install || return 1

      mkdir -p $startdir/pkg/usr/share/xmms/Skins
      mv $startdir/pkg/usr/share/bmp/Skins/* $startdir/pkg/usr/share/xmms/Skins
      rmdir $startdir/pkg/usr/share/bmp/Skins

      rm -r $startdir/src/$_cvsmod-build
    }
    # vim:syntax=sh

### SVN PKGBUILD 樣例

假如您第一次對 PKGBUILD 使用 `source` 命令，它會填充(store) _svntrunk 和 _svnmod 變數。所以如果您運行：

    source PKGBUILD
    svn log $_svntrunk --limit 1 | grep -m 1 -o "r.*" | cut -d \| -f 1 | sed s@r@@g

你可以得到用於 pkgver 的修正號

    # Contributor:  Lukas Sabota <punkrockguy318@comcast.net>
    # Contributor: dibblethewrecker dibblethewrecker.at.jiwe.dot.org
    pkgname=fluxbox-svn
    pkgver=4084
    pkgrel=1
    pkgdesc="Fluxbox-svn is the bleeding edge version of a lightweight yet \
    customizable windowmanager for X. This will checkout and package the latest SVN version."
    url="http://www.fluxbox.org"
    depends=('bash' 'x-server')
    makedepends=('subversion')
    conflicts=('blackbox' 'fluxbox' 'fluxbox-devel' 'fluxbox-cvs')
    replaces=('fluxbox-cvs')
    provides=('fluxbox')

    _svntrunk=svn://svn.berlios.de/fluxbox/trunk
    _svnmod=fluxbox

    build() {
      cd $startdir/src

      svn co $_svntrunk --config-dir ./ -r $pkgver $_svnmod
      cd $_svnmod
      ./autogen.sh

      msg "SVN checkout done or server timeout"
      msg "Starting make..."

      mkdir ../$_svnmod-build
      cd ../$_svnmod-build

      # fix for crap fb issue
      mkdir data
      cp ../$_svnmod/data/keys data/

      ../$_svnmod/configure --prefix=/usr --enable-xinerama --enable-imlib2 --enable-debug
      #./configure --prefix=/usr --enable-xinerama --enable-imlib2 --enable-debug
      make || return 1
      make DESTDIR=$startdir/pkg/ install

      rm -r $startdir/src/$_svnmod-build
    }
    # vim:syntax=sh

### GIT PKGBUILD 樣例

    pkgname=compiz-git
    pkgver=20060707
    pkgrel=1
    pkgdesc="Composite and window manager for Xgl"
    url="http://en.opensuse.org/Compiz"
    license=""
    depends=('xgl-cvs' 'mesa-xgl-cvs' 'cairo-devel' 'libxevie' \
             'startup-notification' 'libpng'  'libxdamage' \
             'libxrandr' 'libwnck-compiz' 'gnome-desktop' 'control-center' \
             'libsvg-cairo' 'libxcomposite')
    makedepends=('git')
    conflicts=()
    replaces=()
    backup=()
    install=compiz.install
    source=(compiz-intel-copy-pixel-issue-workaround-1.diff)
    md5sums=('10a157b86d528bca2be6731c5eaff7b3')

    _gitroot="git://anongit.freedesktop.org/git/xorg/app/compiz"
    _gitname="compiz"
    build() {
    export CFLAGS="$CFLAGS -I/opt/mesa-xgl-cvs/include"
      cd $startdir/src
      msg "Connecting to git.freedesktop.org GIT server...."

      if [ -d $startdir/src/$_gitname ] ; then
      cd $_gitname && git-pull origin
      msg "The local files are updated."
      else
      git clone $_gitroot
      fi

      msg "GIT checkout done or server timeout"
      msg "Starting make..."

      cp -r $startdir/src/$_gitname $startdir/src/$_gitname-build
      cd $startdir/src/$_gitname-build
      patch -Np0 -i ${startdir}/src/compiz-intel-copy-pixel-issue-workaround-1.diff

      ACLOCAL="aclocal -I /opt/gnome/share/aclocal" ./autogen.sh --host=${CHOST} \
        --prefix=/usr \
        --infodir=/usr/share/info \
        --mandir=/usr/share/man \
        --sysconfdir=/opt/gnome/etc \
        --enable-gnome \
        --enable-libsvg-cairo \
        --enable-gconf-dump \
        --disable-kde || return 1
      make || return 1
      make DESTDIR=$startdir/pkg install

      find $startdir/pkg -type f -name '*.la' -exec rm {} \;
    }

如您所見，我在 pkgname 後面使用 "-git" 尾碼，另外兩個變數 -- _gitroot 和 _gitname 用來表示包的“源”和包名字。 我需要解釋一個 if 條件：

    if [ -d $startdir/src/$_gitname ] ; then
    cd $_gitname && git-pull origin
    msg "The local files are updated."
    else
    git clone $_gitroot
    fi

因為我們有兩個命令，一個用來更新，一個迎來取得代碼。我把源代碼 copy 到一個 "-build" 目錄（在 cvs 和 svn 版本的包裏面，我們也這樣做）。

### versionpkg - a `makepkg` wrapper for CVS/SVN builds

這是一個很簡單的腳本，它能夠讓你在不改動 PKGBUILD 檔裏面的日期或者修正號的前提下更新你的 CVS 或者 SVN 包。

簡單地在你的 build 目錄運行這個命令，代替 `makepkg`。這個腳本完全免除了用 backtick 擴展來設置 PKGBUILD 中的日期或者版本標記的必要。 （This script completely removes the need for backtick execution to set the date or tag version in PKGBUILDs.）

使用這個腳本之前;

- 確保在 PKGBUILD 的前10行的位置已經聲明了 pkgver， 否則這個腳本不會正常工作！
- 確保你的檔包含了下面的變數以及 checkout 命令：
- CVS

    _cvsroot=

  CVS 伺服器根目錄(The root of the CVS server) - 即的包含一個半形冒號 (:) 在用戶名後面，就像上面提到的一樣。

    _cvsmod=

  你要 check out 的 CVS 模組，如：

    _cvsroot=":pserver:anonymous:@mplayerhq.hu:/cvsroot/ffmpeg"
    _cvsmod="ffmpeg"

  下面這個 check out 的例子用到了上面提到的變來嗯。-D 選項對於正確使用 `versionpkg` 是必須的，它和 -f 選項是很好的組合. 在不使用 -f 選項的情況下使用 -D 可能會導致錯誤

    cvs -z9 -q -d $_cvsroot co -D $pkgver -f $_cvsmod

  -z 控制壓縮級別（1低9高）
  -D 指定 check out 的日期，這這個腳本裏面我們用 $pkgver 來在設置時間。
  -q 是 quiet （關閉詳細資訊）模式開關。

- SVN

    _svntrunk=

  SVN trunk 地址 （譯注，相當於 CVS root）

    _svnmod=

  在說一次，這個是你想要 ckeck out 的模組名，如：

    _svntrunk=svn://svn.berlios.de/fluxbox/trunk
    _svnmod=fluxbox

  下面這個例子使用了上面的變數。-r 選項對於正確使用 `versionpkg` 是必要的（譯注，這個是用來設置修改號的，顯然）.

    svn co $_svntrunk --config-dir ./ -r $pkgver $_svnmod

  這裏的 -r 指定修改號, 我們用 $pkgver 來表示修改號。

#### 看看這個腳本!

為了提高安全性， versionpkg 現在可以直接從 [community] 安裝，`pacman -S versionpkg`。 我強烈建議您這樣做（I strongly recommend that you use that. ）下面的腳本純粹用來解釋 :)
Changelog （修改記錄）:

- check for both CVS/SVN vars (檢查 SVN 和 CVS vars)
- 如果失敗了，就回退到上一個 pkgver ，以便允許正確的 gensync 操作（譯注，我不知道 gensync, 從名字看應該是和更新有關，英文原文：If build fails revert to previous pkgver to allow correct gensync operation）
- 加入了有色消息（coloured messages）的支援

    #!/bin/bash

    # versionpkg - a makepkg wrapper for building CVS/SVN pkgs
    # dibblethewrecker.at.jiwe.org

    # makepkg configuration
    [ -f /etc/makepkg.conf ] && source /etc/makepkg.conf

    # SUBROUTINES
    plain() {
    	if [ "$USE_COLOR" = "Y" -o "$USE_COLOR" = "y" ]; then
    		echo -e "    \033[1;1m$1\033[1;0m" >&2
    	else
    		echo "    $1" >&2
    	fi
    }
    msg() {
    	if [ "$USE_COLOR" = "Y" -o "$USE_COLOR" = "y" ]; then
    		echo -e "\033[1;32m==>\033[1;0m \033[1;1m$1\033[1;0m" >&2
    	else
    		echo "==> $1" >&2
    	fi
    }
    warning() {
    	if [ "$USE_COLOR" = "Y" -o "$USE_COLOR" = "y" ]; then
    		echo -e "\033[1;33m==> WARNING:\033[1;0m \033[1;1m$1\033[1;0m" >&2
    	else
    		echo "==> WARNING: $1" >&2
    	fi
    }
    error() {
    	if [ "$USE_COLOR" = "Y" -o "$USE_COLOR" = "y" ]; then
    		echo -e "\033[1;31m==> ERROR:\033[1;0m \033[1;1m$1\033[1;0m" >&2
    	else
    		echo "==> ERROR: $1" >&2
    	fi
    	return 1
    }

    source ./PKGBUILD
    oldpkgver=$pkgver

    if [ ! -z ${_cvsroot} ] && [ ! -z ${_cvsmod} ] ; then
    	cvsdate=`date +%Y%m%d`
    	sed -i "1,11 s|pkgver=$oldpkgver|pkgver=$cvsdate|" ./PKGBUILD
    	makepkg $@
    	if [ $? -gt 0 ] ; then
    		error "Reverting pkgver..."
    		sed -i "1,11 s|pkgver=$cvsdate|pkgver=$oldpkgver|" ./PKGBUILD
    	fi
    elif [ ! -z ${_svntrunk} ] && [ ! -z ${_svnmod} ] ; then
    	svnrevno=`svn log $_svntrunk --limit 1 | grep -m 1 -o "r.*" | cut -d \| -f 1 | sed s@r@@g`
    	msg "Current revision number is $svnrevno"
    	if [ "${1}" != "-f" ] && [ "${oldpkgver}" == "${svnrevno}" ] ; then
    		error "No new revision available.  (use -f to overwrite)"
    		exit
    	fi
    	sleep 3
    	sed -i "1,11 s|pkgver=$oldpkgver|pkgver=$svnrevno|" ./PKGBUILD
    	makepkg $@
    	if [ $? -gt 0 ] ; then
    		error "Reverting pkgver..."
    		sed -i "1,11 s|pkgver=$svnrevno|pkgver=$oldpkgver|" ./PKGBUILD
    	fi
    else
    	error "No SVN or CVS variables found! Aborting..."
    	exit
    fi

Categories:

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

Hidden category:

- Pages or sections flagged with Template:Translateme