diary/Kojima

・How to make packages? その 1

以前から書かないといけないと思いつつ放置していたPlamoBuildスクリプトの使い方の話を書いてみた。 MLに流すのは長すぎるし、修正等も入ると思うのでとりあえずこちらで公開。コメント等を反映したら 公式サイトの方に登録してもらおう。

====================================================

Plamo Linux が採用している tgz 形式のパッケージは, インストールするファイルを適切なディレクトリに配置して tar + gzip で圧縮しているだけなので, rpm や deb のような専用のスクリプトを使わなくても容易に作成することができます. しかしながら,configure 時に指定したオプションやパッケージの入手元を記録しておくために, PlamoBuild と呼ばれるシェルスクリプトを使って作成し,そのスクリプトをパッケージのドキュメント ディレクトリ(/usr/share/doc 以下)に保存しておくことが推奨されています.

最近のソフトウェアでは,たいてい GNU autoconf/automake に対応して configure スクリプトが 用意されています.この configure スクリプトが用意されているソフトウェアでは, 必要な作業がほぼ決まっているので,ビルド用スクリプトも汎用的なテンプレートを作って それを使い回すことができます.

PlamoBuild スクリプトは,統一された書式が決まっているわけではありませんが, 私が使っているテンプレートは

ftp://plamo.linet.gr.jp/pub/Plamo-src/admin/PlamoBuild.template

に置いています.このスクリプトでは先頭部分の各種設定を書き替えるだけで, たいていのソフトウェアに対応できるようになっています.

######################################################################
url=""
pkgbase=
vers=
arch=i586
build=P1
src=$pkgbase-$vers
OPT_CONFIG=""
DOCS="README"
######################################################################

以下,この定義部分の各行について,zsh-4.3.4 を例にして紹介します.

url=".." の部分は,パッケージのソースコードの入手元を記述します. このデータは必須ではありませんが,記述しておけば備忘録としても便利です.

pkgbase=.. の部分はパッケージのベース名を記述します.zsh-4.3.4 をパッケージ化する場合, pkgbase=zsh となります.

vers=.. はパッケージのバージョン名を記述します.zsh-4.3.4 をパッケージ化する場合, vers=4.3.4 となります.

arch はパッケージの対応CPUを示します.i586 になっているパッケージは,Pentium 以前の CPU では動かない可能性がありますが,どこまで依存性があるのかの確認はしていません. このフィールドは現在のインストーラではチェックしていませんので, 古い CPU 環境にインストールする際はユーザー自身が注意してください.

build はパッケージのビルド番号を示します.configure スクリプトのオプション指定を変更した際など, 同じバージョンのソフトウェアを再ビルドした際の区別に使いますが,インストーラではチェックしていないので, ユーザー自身が注意してください.

src はソースコードが展開されているディレクトリ名の指定です.最近のソフトウェアでは, たいてい上記のように $pkgbase-$vers(zsh の例では zsh-4.3.4)がソースコードのあるディレクトリ名に なっていますが,中にはこのルールに従っていないソフトウェアもあるので,必要に応じて修正してください.

OPT_CONFIG=.. の部分は configure スクリプトに渡したいオプションを指定します. 汎用的な --prefix=/usr 等のオプションはスクリプト中であらかじめ定義されているので, ここで記述するのはそのパッケージに独自の configure オプションになります. zsh の場合,--enable-multibyte というオプションでマルチバイト対応になるので, OPT_CONFIG="--enable-multibyte" としておきます.

DOC="README" の部分はインストールするドキュメントファイルを指定します. デフォルトでは README だけを指定していますが, パッケージによって ChangeLog や INSTALL 等,インストールしておいた方がいい ドキュメントファイルがありますので,それらを適宜指定します. zsh の場合,ソースコードに含まれる以下のドキュメントファイルをインストールすることにしました.

DOCS="ChangeLog FEATURES INSTALL LICENCE MACHINES META-FAQ NEWS README"

以上の修正を施した結果,PlamoBuild.zsh-4.3.4 の先頭部分は以下のようになりました.

######################################################################
url="http://downloads.sourceforge.net/zsh/zsh-4.3.4.tar.bz2
pkgbase=zsh
vers=4.3.4
arch=i586
build=P1
src=$pkgbase-$vers
OPT_CONFIG="--enable-multibyte"
DOCS="ChangeLog FEATURES INSTALL LICENCE MACHINES META-FAQ NEWS README"
######################################################################

PlamoBuild.template を元にした PlamoBuild スクリプトは config, build, package の 3つの引数を取ります.何も引数を指定しないと,config, build, package を指定したものとして実行します. なお,package は build に,build は config に依存しているので,config せずに build はできませんし, build せずに package しても正しいパッケージは作成されません.

config を指定すると,作業用の build ディレクトリをクリアした上で src で指定された $pkgbase-$vers ディレクトリ以下のファイルを build ディレクトリにコピーし,build ディレクトリに cd して, OPT_CONFIG に指定したパラメータを用いて configure スクリプトを実行します. build ディレクトリは,config を実行する度にクリア(rm -rf build)されますので, ソースコードに修正を加えたり,大規模なソフトウェアをパッケージ化する際にはご注意ください.

build を指定すると,build ディレクトリに cd して make を実行します. make でエラーが出る際は,build 以下に展開されているソースコードを修正し, build ディレクトリで make を実行するか,元のディレクトリで PlamoBuild.XXX build を再実行すれば 続きからビルドが進行します.この際,config すると修正したコードとも build ディレクトリが 削除されるのでご注意ください.

加えた修正はそのままでは次回以降に反映されないので,パッチファイルや sed スクリプトにして PlamoBuild スクリプトに組み込んでしまうのがいいでしょう.その方法については稿を改めて紹介します.

package を指定すると build ディレクトリに移動した上で,prefix=`pwd`/work を指定して make install が実行されます.その際,root 権限で実行するかどうかが問われるので, テスト時は一般ユーザーで実行してインストール先が正しいかを確認してください. ソフトウェアによっては make install 時に prefix 指定を見ずに,直接 /usr/local/bin 等に インストールしようとするもの散見されますが,make install を一般ユーザーで実行すれば /usr/local/bin に 書き込もうとするとエラーになりますので,チェック可能です.

そのようなソースコードでは,build ディレクトリの Makefile を修正することでインストール先を
調整するか,PlamoBuild スクリプト中で cp コマンド等でパッケージをコピーすることになります.

インストールされるパッケージが全て prefix に指定したディレクトリ以下に インストールされることが確認できたら,PlamoBuild.XXX package を再実行し, 今度は root 権限を指定し,インストールされるファイルの所有者が正しく設定されるようにしてください.

以下に,libcap-2.16 というソフトウェアを元に,PlamoBuild.template を使ってパッケージ化する 手順を紹介します.

1) パッケージ作成用のディレクトリ(Libcap)を作る

% mkdir Libcap ; cd Libcap

2) 必要なソースコードのダウンロードと展開

% wget http://www.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.6/libcap-2.16.tar.gz ; 
 tar xvf libpcap-2.16.tar.gz

3) PlamoBuild スクリプトの作成

% cp ~/PlamoBuild.template ./PlamoBuild.libpcap-2.16 ; vi PlamoBuild.libpcap-2.16

修正後のヘッダー部分はこんな感じ

##############################################################
url=http://www.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.6/libcap-2.16.tar.gz
pkgbase=libcap
vers=2.16
arch=i586
build=P1
src=libcap-2.16
OPT_CONFIG=''
DOCS='CHANGELOG License README'
##############################################################

4) PlamoBuild.libcap-2.16 の実行

% ./PlamoBuild.libcap-2.16
rm -f *~ core
make -C libcap clean
make[1]: ディレクトリ `/home/kojima/Libcap/build/libcap' に入ります
rm -f *~ core
...
make[1]: ディレクトリ `/home/kojima/Libcap/build/progs' に入ります
gcc -O2 -Dlinux -fPIC -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wcast-align \
  -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wshadow -g  \
  -I/home/kojima/Libcap/build/progs/../libcap/include \
  -I/home/kojima/Libcap/build/progs/../libcap/include -c getpcaps.c -o getpcaps.o
...
Do you want to package as root? [y/N] n
make -C libcap install
make[1]: ディレクトリ `/home/kojima/Libcap/build/libcap' に入ります
...
pruning symlink in /home/kojima/Libcap/work/usr/share/man/man8
pruning symlink in /home/kojima/Libcap/work/usr/share/man/man9
pruning symlink in /home/kojima/Libcap/work/usr/share/man/mann
Making ../libcap-2.16-i586-P1.tgz...

Do you want to keep work files? [y/N] n
%

エラーが出なければ,カレントディレクトリの work/ 以下のディレクトリに 必要なファイルがインストールされた上でパッケージ(libcap-2.16-i586-P1.tgz)化されているはずなので, work 以下のディレクトリを確認したり,tar tvf でパッケージの中身を確認しておきます.

5) PlamoBuild.libcap-2.16 package の実行

インストールされたパッケージに問題がないようでしたら,再度 PlamoBuild.libcap スクリプトを package オプションを付けて実行します.今度は root になってパッケージ化します.

% ./PlamoBuild.libcap-2.16 package
Do you want to package as root? [y/N] y
パスワード: XXXXXXX
make -C libcap install
make[1]: ディレクトリ `/home/kojima/Libcap/build/libcap' に入ります
....
Making ../libcap-2.16-i586-P1.tgz...

Do you want to keep work files? [y/N] y
%

最後の質問に y と答えれば,work や pivot,i.et, i.st と言う作業用に使ったファイルやディレクトリが 削除されます.

こうして作ったパッケージは,通常のパッケージと同様,installpkg でインストール, removepkg でアンインストールできるので,個人で使うソフトウェアでもいったんパッケージ化してから インストールするようにすれば管理が楽になります.

url=".." の部分は,パッケージのソースコードの入手元を記述します.
このデータは必須ではありませんが,記述しておけば備忘録としても便利です.

上記の手順にあるように,パッケージ作成用のディレクトリ上に,あらかじめ 必要なソースコードのダウンロードと展開を済ませておけば,url=の定義部分 が使われることはありませんが,ダウンロードと展開が未だの場合は,url=に 記述されている入手元から,資材(パッチ含む)を自動的に引っ張ってきます。 すなわち,パッケージ作成用のディレクトリとPlamoBuildスクリプトさえあれ ば,ビルド可能となります。なお,PlamoBuildスクリプトの引数にdownloadを 指定すると,url=の定義部分に記述された資材のダウンロードと展開まで行い ます。

DOC="README" の部分はインストールするドキュメントファイルを指定します.
デフォルトでは README だけを指定していますが,
パッケージによって ChangeLog や INSTALL 等,インストールしておいた方がいい
ドキュメントファイルがありますので,それらを適宜指定します.
package を指定すると build ディレクトリに移動した上で,prefix=`pwd`/work を指定して
make install が実行されます.

prefix=`pwd`/workではなく,DESTDIR=`pwd`/workですね。:-)

あと,関連した小さい複数のソフトウェアをまとめて一つのパッケージを作り たい場合には,定義部分のsrc,OPT_CONFIG,DOCSについて,それぞれ配列変数 として記述すれば良いです。修正後のヘッダ部分はこんな感じ。

######################################################################
url="http://jaist.dl.sourceforge.net/sourceforge/hoge/hoge-1.0.0.tar.gz
    http://jaist.dl.sourceforge.net/sourceforge/fuga/fuga-1.0.0.tar.gz
    http://jaist.dl.sourceforge.net/sourceforge/piyo/piyo-1.0.0.tar.gz"
pkgbase=hogehoge
vers=1.0.0
arch=i386
build=P1
src[0]=hoge-1.0.0
src[1]=fuga-1.0.0
src[2]=piyo-1.0.0
OPT_CONFIG[0]="--enable-hoge"
OPT_CONFIG[1]="--enable-fuga"
OPT_CONFIG[2]="--enable-piyo"
DOCS[0]="README AUTHORS COPYING ChangeLog INSTALL NEWS"
DOCS[1]="NEWS README AUTHORS INSTALL ChangeLog COPYING"
DOCS[2]="NEWS TODO README THANKS AUTHORS INSTALL ChangeLog COPYING"
######################################################################

-- tamu 2009-02-05 (木) 17:00:00



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:41