「VCS パッケージガイドライン」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(Kusakata がページ「VCS PKGBUILD ガイドライン」を「VCS パッケージガイドライン」に移動しました)
(更新)
1行目: 1行目:
 
[[Category:パッケージ開発]]
 
[[Category:パッケージ開発]]
[[en:VCS PKGBUILD Guidelines]]
+
[[en:VCS package guidelines]]
[[it:VCS PKGBUILD Guidelines]]
+
[[it:VCS package guidelines]]
[[zh-CN:VCS PKGBUILD Guidelines]]
+
[[zh-cn:VCS package guidelines]]
[[zh-TW:VCS PKGBUILD Guidelines]]
+
[[zh-tw:VCS package guidelines]]
 
{{Package Guidelines}}
 
{{Package Guidelines}}
   
9行目: 9行目:
   
 
== プロトタイプ ==
 
== プロトタイプ ==
  +
{{Warning|[https://projects.archlinux.org/abs.git/tree/prototypes ABS Git リポジトリ] の {{Pkg|abs}} パッケージに含まれているプロトタイプファイルはかなり古くなっています。それらのプロトタイプファイルは使わないようにしてください。{{Bug|34485}} を参照。}}
{{Warning|The prototype files provided in the {{Pkg|abs}} package and in [https://projects.archlinux.org/abs.git/tree/prototypes the ABS Git repository] are ''significantly'' out-of-date. Do ''not'' consider the prototypes to be authoritative in any way. See {{Bug|34485}}.}}
 
   
[[Arch Build System|Arch Build System]] の {{Pkg|abs}} パッケージは [[CVS]], [[SVN]], [[Git]], [[Mercurial]], [[Wikipedia:Darcs|Darcs]] の [[PKGBUILD]] のプロトタイプを提供しています。{{Pkg|abs}} をインストールしたら、{{ic|/usr/share/pacman}} にプロトタイプが入っています。最新のバージョンは [https://projects.archlinux.org/abs.git/tree/prototypes ABS Git リポジトリの prototypes ディレクトリ]にあります。
+
[[Arch Build System]] の {{Pkg|abs}} パッケージは [[CVS]], [[SVN]], [[Git]], [[Mercurial]], [[Wikipedia:Darcs|Darcs]] の [[PKGBUILD]] のプロトタイプを提供しています。{{Pkg|abs}} をインストールしたら、{{ic|/usr/share/pacman}} にプロトタイプが入っています。最新のバージョンは [https://projects.archlinux.org/abs.git/tree/prototypes ABS Git リポジトリの prototypes ディレクトリ]にあります。
   
 
== ガイドライン ==
 
== ガイドライン ==
28行目: 28行目:
   
 
* {{Ic|1=makedepends=()}} に適当な VCS ツールを含めて下さい ({{pkg|cvs}}, {{pkg|subversion}}, {{pkg|git}}, ...)。
 
* {{Ic|1=makedepends=()}} に適当な VCS ツールを含めて下さい ({{pkg|cvs}}, {{pkg|subversion}}, {{pkg|git}}, ...)。
  +
  +
* ソースが固定されないので、チェックサムは {{ic|1=md5sums=()}} に {{ic|'SKIP'}} を追加してスキップしてください。
   
 
=== VCS ソース ===
 
=== VCS ソース ===
43行目: 45行目:
   
 
Git の source の例:
 
Git の source の例:
source=('project_name::git+http://project_url#branch=project_branch')
+
<nowiki>source=('project_name::git+http://project_url#branch=project_branch')</nowiki>
   
 
=== 関数 pkgver() ===
 
=== 関数 pkgver() ===
49行目: 51行目:
   
 
次のバージョンフォーマットが推奨されています: ''RELEASE.rREVISION''。''REVISION'' はソースツリーの変更毎に増える番号です (VCS のリビジョンと同じ)。最新の VCS タグは ''RELEASE'' に使うことができます。公開リリースやリポジトリのタグがない場合、ゼロをリリース番号に使ったり ''RELEASE'' を完全に省いて ''rREVISION'' のようにバージョンを使って下さい。公開リリースが存在してリポジトリにタグがないときは開発者はプロジェクトファイルのパースなどによってリリースバージョンを取得します。
 
次のバージョンフォーマットが推奨されています: ''RELEASE.rREVISION''。''REVISION'' はソースツリーの変更毎に増える番号です (VCS のリビジョンと同じ)。最新の VCS タグは ''RELEASE'' に使うことができます。公開リリースやリポジトリのタグがない場合、ゼロをリリース番号に使ったり ''RELEASE'' を完全に省いて ''rREVISION'' のようにバージョンを使って下さい。公開リリースが存在してリポジトリにタグがないときは開発者はプロジェクトファイルのパースなどによってリリースバージョンを取得します。
  +
  +
リビジョン番号の区分け (REVISION の前の "r") は重要です。開発元が初めてリリースを行うことを決めたり、別のバージョン方式によるバージョンを付けるようになった場合に問題を避けることができます。例えばリビジョン "455" で、上流がバージョン 0.1 をリリースした場合、リビジョンの区分けをしていれば問題なくバージョンアップが認識されます ({{ic|0.1.r456 > r454}})。区分けがないとバージョンアップと認識されません ({{ic|0.1.456 < 454}})。
   
 
以下は''意図した''出力を行うサンプルです:
 
以下は''意図した''出力を行うサンプルです:
57行目: 61行目:
   
 
{{hc|<nowiki>pkgver() {
 
{{hc|<nowiki>pkgver() {
cd "$srcdir/repo"
+
cd "$pkgname"
git describe --long | sed -E 's/([^-]*-g)/r\1/;s/-/./g'
+
git describe --long | sed 's/\([^-]*-g\)/r\1/;s/-/./g'
 
}</nowiki>|
 
}</nowiki>|
 
2.0.r6.ga17a017
 
2.0.r6.ga17a017
66行目: 70行目:
   
 
{{hc|<nowiki>pkgver() {
 
{{hc|<nowiki>pkgver() {
cd "$srcdir/repo"
+
cd "$pkgname"
git describe --long --tags | sed -E 's/([^-]*-g)/r\1/;s/-/./g'
+
git describe --long --tags | sed 's/\([^-]*-g\)/r\1/;s/-/./g'
 
}</nowiki>|
 
}</nowiki>|
 
0.71.r115.gd95ee07
 
0.71.r115.gd95ee07
  +
}}
  +
  +
git タグにダッシュが含まれていない場合、sed はもっとシンプルにできます: {{ic|sed 's/-/.r/;s/-/./'}}。
  +
  +
タグに {{ic|v}} やプロジェクト名などが付いている場合、取り除きます:
  +
  +
{{hc|<nowiki>
  +
pkgver() {
  +
cd "$pkgname"
  +
# cutting off 'foo-' prefix that presents in the git tag
  +
git describe --long | sed 's/^foo-//;s/\([^-]*-g\)/r\1/;s/-/./g'
  +
}</nowiki>|
  +
6.1.r3.gd77e105
 
}}
 
}}
   
75行目: 92行目:
   
 
{{hc|<nowiki>pkgver() {
 
{{hc|<nowiki>pkgver() {
cd "$srcdir/repo"
+
cd "$pkgname"
 
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
 
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
 
}</nowiki>|
 
}</nowiki>|
81行目: 98行目:
 
}}
 
}}
   
  +
バージョンとコミット/リビジョン番号のみ (SHA1 は省かれます。ただし、バージョンを忘れると実際のリビジョンがわからなくなります):
{{Note|SHA1 (この場合 {{ic|a17a017}}) はバージョンの比較には使われないため省略することができますが、使っているリビジョンの確認が簡単にできるのでデバッグに役立ちます。}}
 
  +
  +
git describe --long | sed -r 's/-([0-9,a-g,A-G]{7}.*)//' | sed 's/-/./'
  +
  +
両方を組み合わせて、タグが最初に付かないリポジトリに対応することもできます (bashism を使用):
  +
  +
{{hc|<nowiki>
  +
pkgver() {
  +
cd "$srcdir$pkgname"
  +
( set -o pipefail
  +
git describe --long 2>/dev/null | sed 's/\([^-]*-g\)/r\1/;s/-/./g' ||
  +
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
  +
)
  +
}</nowiki>|
  +
0.9.9.r27.g2b039da # if tags exist
  +
r1581.2b039da # else fallback
  +
}}
   
 
==== Subversion ====
 
==== Subversion ====
 
{{hc|<nowiki>pkgver() {
 
{{hc|<nowiki>pkgver() {
cd "$srcdir/repo"
+
cd "$pkgname"
 
local ver="$(svnversion)"
 
local ver="$(svnversion)"
 
printf "r%s" "${ver//[[:alpha:]]}"
 
printf "r%s" "${ver//[[:alpha:]]}"
96行目: 129行目:
 
==== Mercurial ====
 
==== Mercurial ====
 
{{hc|<nowiki>pkgver() {
 
{{hc|<nowiki>pkgver() {
cd "$srcdir/repo"
+
cd "$pkgname"
 
printf "r%s.%s" "$(hg identify -n)" "$(hg identify -i)"
 
printf "r%s.%s" "$(hg identify -n)" "$(hg identify -i)"
 
}</nowiki>|
 
}</nowiki>|
104行目: 137行目:
 
==== Bazaar ====
 
==== Bazaar ====
 
{{hc|<nowiki>pkgver() {
 
{{hc|<nowiki>pkgver() {
cd "$srcdir/repo"
+
cd "$pkgname"
 
printf "r%s" "$(bzr revno)"
 
printf "r%s" "$(bzr revno)"
 
}</nowiki>|
 
}</nowiki>|

2015年12月27日 (日) 14:44時点における版

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

プロトタイプ

警告: ABS Git リポジトリabs パッケージに含まれているプロトタイプファイルはかなり古くなっています。それらのプロトタイプファイルは使わないようにしてください。FS#34485 を参照。

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

ガイドライン

  • pkgname の末尾に -cvs, -svn, -hg, -darcs, -bzr, -git などを付けて下さい。パッケージが特定のリリースを取得する場合は別です。
  • 依存関係, URL, ソースなどの変更を行なったことで作られるパッケージが異なるようになった時は pkgrel の値を増やして下さい。pkgver を変える必要はありません。
  • --holdver を使うことで makepkgpkgver を更新するのを止めることができます (参照: makepkg(8))
  • パッケージに conflicts と provides を含めて下さい (例えば fluxbox-gitAUR なら: conflicts=('fluxbox')provides=('fluxbox'))。
  • replaces=() は一般的に不必要な問題を起こすので使わないで下さい。
  • cvsroot を使う場合、空のパスワードや anonymous:password@ を入力するのを避けるために anonymous@ ではなく anonymous:@ を使って下さい。
  • makedepends=() に適当な VCS ツールを含めて下さい (cvs, subversion, git, ...)。
  • ソースが固定されないので、チェックサムは md5sums=()'SKIP' を追加してスキップしてください。

VCS ソース

ノート: Pacman 4.1 は以下の VCS ソースをサポートしています: bzr, git, hg, svn。サポートされている VCS の一覧は man PKGBUILDfragment セクションや 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.rREVISIONREVISION はソースツリーの変更毎に増える番号です (VCS のリビジョンと同じ)。最新の VCS タグは RELEASE に使うことができます。公開リリースやリポジトリのタグがない場合、ゼロをリリース番号に使ったり RELEASE を完全に省いて rREVISION のようにバージョンを使って下さい。公開リリースが存在してリポジトリにタグがないときは開発者はプロジェクトファイルのパースなどによってリリースバージョンを取得します。

リビジョン番号の区分け (REVISION の前の "r") は重要です。開発元が初めてリリースを行うことを決めたり、別のバージョン方式によるバージョンを付けるようになった場合に問題を避けることができます。例えばリビジョン "455" で、上流がバージョン 0.1 をリリースした場合、リビジョンの区分けをしていれば問題なくバージョンアップが認識されます (0.1.r456 > r454)。区分けがないとバージョンアップと認識されません (0.1.456 < 454)。

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

Git

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

pkgver() {
  cd "$pkgname"
  git describe --long | sed 's/\([^-]*-g\)/r\1/;s/-/./g'
}
2.0.r6.ga17a017

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

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

git タグにダッシュが含まれていない場合、sed はもっとシンプルにできます: sed 's/-/.r/;s/-/./'

タグに v やプロジェクト名などが付いている場合、取り除きます:

pkgver() {
  cd "$pkgname"
  # cutting off 'foo-' prefix that presents in the git tag
  git describe --long | sed 's/^foo-//;s/\([^-]*-g\)/r\1/;s/-/./g'
}
6.1.r3.gd77e105

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

pkgver() {
  cd "$pkgname"
  printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
r1142.a17a017

バージョンとコミット/リビジョン番号のみ (SHA1 は省かれます。ただし、バージョンを忘れると実際のリビジョンがわからなくなります):

git describe --long | sed -r 's/-([0-9,a-g,A-G]{7}.*)//' | sed 's/-/./'

両方を組み合わせて、タグが最初に付かないリポジトリに対応することもできます (bashism を使用):

pkgver() {
  cd "$srcdir$pkgname"
  ( set -o pipefail
    git describe --long 2>/dev/null | sed 's/\([^-]*-g\)/r\1/;s/-/./g' ||
    printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
  )
}
0.9.9.r27.g2b039da  # if tags exist
r1581.2b039da       # else fallback

Subversion

pkgver() {
  cd "$pkgname"
  local ver="$(svnversion)"
  printf "r%s" "${ver//[[:alpha:]]}"
}
r8546
ノート: プロジェクトにリリースがある場合は 0. の代わりにそれを使って下さい。

Mercurial

pkgver() {
  cd "$pkgname"
  printf "r%s.%s" "$(hg identify -n)" "$(hg identify -i)"
}
r2813.75881cc5391e

Bazaar

pkgver() {
  cd "$pkgname"
  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
}