# VCS PKGBUILD Guidelines (日本語)

バージョン管理システムは通常の安定版のパッケージと最新の (trunk) 開発版のブランチ、どちらのソースコードの取得にも使うことができます。この記事では両方のケースを説明しています。

## プロトタイプ

Warning: The prototype files provided in the abs package and in the ABS Git repository are significantly out-of-date. Do not consider the prototypes to be authoritative in any way. See FS#34485.

Arch Build System の abs パッケージは CVS, SVN, Git, Mercurial, Darcs の PKGBUILD のプロトタイプを提供しています。abs をインストールしたら、`/usr/share/pacman` にプロトタイプが入っています。最新のバージョンは ABS Git リポジトリの prototypes ディレクトリにあります。

## ガイドライン

- `pkgname` の末尾に `-cvs`, `-svn`, `-hg`, `-darcs`, `-bzr`, `-git` などを付けて下さい。パッケージが特定のリリースを取得する場合は別です。

- 依存関係, URL, ソースなどの変更を行なったことで作られるパッケージが異なるようになった時は `pkgrel` の値を増やして下さい。`pkgver` を変える必要はありません。

- `--holdver` を使うことで makepkg が `pkgver` を更新するのを止めることができます (参照: makepkg(8))

- パッケージに conflicts と provides を含めて下さい (例えば fluxbox-git なら: `conflicts=('fluxbox')` と `provides=('fluxbox')`)。

- `replaces=()` は一般的に不必要な問題を起こすので使わないで下さい。

- cvsroot を使う場合、空のパスワードや `anonymous:password@` を入力するのを避けるために `anonymous@` ではなく `anonymous:@` を使って下さい。

- `makedepends=()` に適当な VCS ツールを含めて下さい (cvs, subversion, git, ...)。

### VCS ソース

Note: Pacman 4.1 は以下の VCS ソースをサポートしています: `bzr`, `git`, `hg`, `svn`。サポートされている VCS の一覧は `man PKGBUILD` の `fragment` セクションや PKGBUILD(5) を見て下さい。

pacman 4.1 から、VCS ソースは `source=()` に指定することになり他のソースと同じように扱われるようになりました。`makepkg` はリポジトリを `$SRCDEST` (makepkg.conf(5) の設定がない場合は `$startdir` と同じ) に複製・チェックアウト・ブランチして `$srcdir` にコピーします (それぞれの VCS に合わせた方法を使います)。ローカルリポジトリは変更がされないので、`-build` ディレクトリを作る必要はありません。

VCS の `source=()` の一般的なフォーマットは:

    source=('[folder::][vcs+]url[#fragment]')

- `folder` (任意) はデフォルトのリポジトリ名を (`trunk` など) 無関係な名前から他の名前に変更するため、もしくは以前のソースを維持するために使われます。
- `vcs+` は VCS のタイプを表さない URL で必要です (例: `git+http://some_repo`)。
- `url` はリモートやローカルのリポジトリの URL です。
- `#fragment` (任意) は特定のブランチやコミットを pull するのに必要です。各 VCS で使えるフラグメントの詳細は `man PKGBUILD` を見て下さい。

Git の source の例:

    source=('project_name::git+http://project_url#branch=project_branch')

### 関数 pkgver()

`pkgver()` 関数を使うことで `pkgver` を自動で更新することが可能です。これによって `pkgver` をより良くコントロールすることが出来るようになります。メンテナは `pkgver` を意味あるものに扱うことべきです。

次のバージョンフォーマットが推奨されています: RELEASE.rREVISION。REVISION はソースツリーの変更毎に増える番号です (VCS のリビジョンと同じ)。最新の VCS タグは RELEASE に使うことができます。公開リリースやリポジトリのタグがない場合、ゼロをリリース番号に使ったり RELEASE を完全に省いて rREVISION のようにバージョンを使って下さい。公開リリースが存在してリポジトリにタグがないときは開発者はプロジェクトファイルのパースなどによってリリースバージョンを取得します。

以下は意図した出力を行うサンプルです:

#### Git

最後のコミットの注釈付きタグを使う:

    pkgver() {
      cd "$srcdir/repo"
      git describe --long | sed -E 's/([^-]*-g)/r\1/;s/-/./g'
    }

    2.0.r6.ga17a017

最後のコミットの注釈が付かないタグを使う:

    pkgver() {
      cd "$srcdir/repo"
      git describe --long --tags | sed -E 's/([^-]*-g)/r\1/;s/-/./g'
    }

    0.71.r115.gd95ee07

タグが存在しない場合、最初から数えたリビジョンの数を使ってください:

    pkgver() {
      cd "$srcdir/repo"
      printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
    }

    r1142.a17a017

Note: SHA1 (この場合 `a17a017`) はバージョンの比較には使われないため省略することができますが、使っているリビジョンの確認が簡単にできるのでデバッグに役立ちます。

#### Subversion

    pkgver() {
      cd "$srcdir/repo"
      local ver="$(svnversion)"
      printf "r%s" "${ver//[[:alpha:]]}"
    }

    r8546

Note: プロジェクトにリリースがある場合は `0.` の代わりにそれを使って下さい。

#### Mercurial

    pkgver() {
      cd "$srcdir/repo"
      printf "r%s.%s" "$(hg identify -n)" "$(hg identify -i)"
    }

    r2813.75881cc5391e

#### Bazaar

    pkgver() {
      cd "$srcdir/repo"
      printf "r%s" "$(bzr revno)"
    }

    r830

#### Fallback

リポジトリから `pkgver` が全く得られない場合は、現在の日付を使うことができます:

    pkgver() {
      date +%Y%m%d
    }

    20130408

ソースツリーの状態を一意に示しているのではないので、出来る限り使わないで下さい。

## Tips

### Git の PKGBUILD のサンプル

    # Maintainer: Dave Reisner <d@falconindy.com>
    # Contributor: William Giokas (KaiSforza) <1007380@gmail.com>

    pkgname=expac-git
    pkgver=0.0.0
    pkgrel=1
    pkgdesc="Pacman database extraction utility"
    arch=('i686' 'x86_64')
    url="https://github.com/falconindy/expac"
    license=('MIT')
    depends=('pacman')
    makedepends=('git')
    conflicts=('expac')
    provides=('expac')
    # The git repo is detected by the 'git:' or 'git+' beginning. The branch
    # '$pkgname' is then checked out upon cloning, expediating versioning:
    #source=('git+https://github.com/falconindy/expac.git'
    source=("$pkgname"::'git://github.com/falconindy/expac.git'
            'expac_icon.png')
    # Because the sources are not static, skip Git checksum:
    md5sums=('SKIP'
             '020c36e38466b68cbc7b3f93e2044b49')

    pkgver() {
      cd "$srcdir/$pkgname"
      # Use the tag of the last commit
      git describe --long | sed -E 's/([^-]*-g)/r\1/;s/-/./g'
    }

    build() {
      cd "$srcdir/$pkgname"
      make
    }

    package() {
      cd "$srcdir/$pkgname"
      make PREFIX=/usr DESTDIR="$pkgdir" install
      install -Dm644 "$srcdir/expac_icon.png" "$pkgdir/usr/share/pixmaps/expac.png"
    }

### Git サブモジュール

Git サブモジュールは少しトリッキーなことをする必要があります。サブモジュールの URL を直接 source に加えて、それから prepare() でそれらを使うようにしてください。以下のようになります:

    source=("git://somewhere.org/something/something.git"
            "git://somewhere.org/mysubmodule/mysubmodule.git")

    prepare() {
        cd something
        git submodule init
        git config submodule.mysubmodule.url $srcdir/mysubmodule
        git submodule update
    }

Category:

- Package development (日本語)