2009年6月12日金曜日

ABSでjnethack

ABS - The Arch Build Systemを始めて体験してみた。
ソースからビルドしてパッケージングするための仕組みってのは、あちこちに書いてあるからうっすら知ってたんだけれど、具体的にどうやって使うのかイマイチ分からなかった。

そこで、Wikiを見ながら適当に実践してみたら、なんとなく理解。


1.PKGBUILDファイルの謎とパッケージabs
yaourtとか使ってAURを利用するとPKGBUILDファイルを使ってmakepkgがパッケージングを勝手にやってくれるってのが見ててわかったんだけれど、公式レポジトリ(っていうの?)のPKGBUILDファイルってどこにあるのかなぁ?って探したことがあった。ArchLinuxのTopページの右上の「Package Search」からパッケージを見つけると、説明ページからPKGBUILDファイル見れたりして、これをコピーして使うのかなぁ?とか思っていた。

しかし、実際にはそうじゃなくて、absというパッケージをダウンロードしてabsコマンドを発行すると、archlinuxのレポジトリに含まれるすべてのパッケージのPKGBUILDファイルの最新のものがダウンロードされる仕組みになっていた!!


2.ABS tree
absコマンドによってダウンロードされるPKGBUILDファイル等(パッケージによってはパッチファイルやインストール用の別のスクリプトファイルも入っている)は、/var/abs/以下にレポジトリ毎に区分されパッケージ毎のディレクトリに各々入っていて、「ABS tree」と呼ばれているらしい。また、このtree構造の中に配置された各パッケージ用のディレクトリの中にはソースファイルは入っていない。archlinuxのパッケージングは、ビルドの際にソース配布元から直接ダウンロードするようになっている。

で、このABS tree自体はPKGBUILDファイル群のデータベースみたいなもので、このtree以下の各パッケージディレクトリの中でビルドやパッケージングを行うものでは無い。このABS treeはrootになってabsコマンドを発行する度にサーバー側の最新のPKGBUILDファイルと同期してくれるんだと思う。


3.パッケージング作業の場所は、ホームディレクトリ内でする
そこで、実際のパッケージングは、/var/abs/以下のABS treeと全然関係なく、適当なディレクトリを作ってその中で行う。ABSのwikiをみるとホームディレクトリの中にabsとか名づけた適当なディレクトリを作っておき(自分で作るパッケージ用のディレクトリを作って整理するだけで別に必ずこういうディレクトリがいるわけではない。)その下に作りたいパッケージ毎のディレクトリを用意して作業をはじめる。

ABSの仕組みは、PKGBUILDファイルにビルド用の手順を書いて、makepkgコマンドを呼び出すだす。試しに、適当な作業ディレクトリを自分のホームディレクトリに作って、ABS tree内の適当なパッケージのPKGBUILDファイル(それ以外のパッチやスクリプトがあれば全て)を作業ディレクトリにコピーし、その作業ディレクトリに入って

$makepkg -s

してみるといい。勝手にソースファイルを配布元からダウンロードして来て、ビルド作業を行い、最終的にhogehoge.pkg.tar.gzというarchlinux用のパッケージファイルを作業ディレクトリに作ってくれる。


4.jnethackを作ってみる。
まずは、作業用のディレクトリを作成。

$mkdir ~/abs/
$mkdir ~/abs/jnethack/


jnethackは元のnethackにパッチをあてて日本語化したものなので、nethackパッケージ内のファイルを作業ディレクトリにコピーする。nethackの場合はPKGBUILDファイルのみ。

次にパッチファイル。JNetHack Projectからダウンロードして、作業ディレクトリに入れる。

ここで、PKGBUILDファイルの中身を見てみる。

build(){}内の部分で、元のソースからコンパイルがちゃんと通るようにソースファイルの適当な箇所に手がいれられている。
そこで、これをベースに新たな「jnethack」パッケージになるように、いくつかの修正をくわえてみる。

(1)パッケージネームをjnethackにして、バージョンナンバーを付ける。

pkgname=jnethack
pkgver=3.4.3_0.10
pkgrel=1

しかし、変数pkgnameとpkegverは元のnethackのソースファイルやディレクトリ名の指定に使われているので、これらの部分のために

orgpkgname=nethack
orgpkgver=3.4.3

とうい変数名を追加して、ソースファイルやディレクトリ名の指定の所をorgpkgnameとorgpkegverに書き換える。
具体的には、
 source=で始まる行
 cd $startdir/src/$pkgname-$pkgver/が含まれているいくつかの行

但し、最後の方のライセンスファイルの所はorgpkgnameには変えない

(2)パッチを当てる
build(){}の一番最初に

cd $startdir/src/$orgpkgname-$orgpkgver/
zcat $startdir/jnethack-3.4.3-0.10.diff.gz | patch -p1

を追加

(3)jnethackパッチがあたったことによる修正
次に、元々のファイルに対する訂正がjnethackパッチがあたったために上手く働かない部分を修正する。

sed -e '/define HACKDIR/ s|/usr/games/lib/nethackdir|/usr/share/nethack/|' \

と言う行を

sed -e '/define HACKDIR/ s|/usr/games/lib/jnethackdir|/usr/share/jnethack/|' \

に修正する。(nethackがjnethackになったため、ひっかからなくなっている)

もう一つ、jnethack起動スクリプトの部分

-i $startdir/pkg/usr/bin/nethack

という行を

-i $startdir/pkg/usr/bin/jnethack

に修正する。

(4)パッケージを作る
PKGBUILDの訂正が終わったら、makepkgコマンドでパッケージ作成。

$cd ~/abs/jnethack
$makepkg -s

そしてインストール

$sudo pacman -U jnethack-3.4.3_0.10-1-i686.pkg.tar.gz


多分、以上の修正で、素のnethackともコンフリクトしないjnethackパッケージが出きると思う。

最後にjnethackで遊ぶときはターミナルの設定をEUC-jpにしないとダメ!更に色に関しては、黒背景に白文字、gnome-terminal等の場合色のパレットをxtermにすると良いらしい。

1 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除