「シングルパッケージアーカイブ」とは、以下のファイルが 一組だけ入ったプログラムパッケージのことです。
Ruby ライブラリRuby 拡張ライブラリつまり普通のプログラムパッケージのことです。
シングルパッケージアーカイブを作るには、アーカイブを 以下のルールに従ってレイアウトしてください。
アーカイブのトップ/
setup.rb
bin/
コマンド類
lib/
Ruby ライブラリ
ext/
拡張モジュール
data/
その他のデータ
bin lib ext data の下には各々インストールされるイメージそのままに
ファイルを配置します。例えば lib/tmail/header.rb というファイルを
置くと RUBYLIB/tmail/header.rb としてインストールされます。
bin/ lib/ などは中身が空のときには省略できます。
ext だけは配置ルールが少し特殊です。複数のファイルからひとつの共有
ライブラリ anyname.so ができるので、.so ができるべき場所にディレク
トリを作り、その中に必要なファイルを入れます。例えば
RUBYLIB/ARCH/tmail/parser.so が必要ならば、ディレクトリ
ext/tmail/parser/ を作ってその中に parser.c や extconf.rb depend
MANIFEST などを置きます。
[注意] setup.rb は MANIFEST があるディレクトリだけをコンパイル対象に
します。拡張モジュールのディレクトリには必ず MANIFEST を置いてください。
setup.rb は複数のパッケージを一つのアーカイブにまとめて、それを
同時に扱うことができます。例えば依存関係のあるパッケージを全部
まとめて配布したりするのに使えます。
マルチパッケージアーカイブを作るには、まずトップに setup.rb と
ディレクトリ packages/ を作り、その下にパッケージ名のディレクトリ
を作ります。そしてその中にシングルパッケージアーカイブと同じ
ディレクトリツリーを配置します。つまり全体像は以下のようになります。
アーカイブのトップ/
setup.rb
packages/
tmail/ # tmail パッケージ
bin/
lib/
ext/
data/
raccrt/ # raccrt パッケージ
bin/
lib/
ext/
data/
strscan/ # strscan パッケージ
bin/
lib/
ext/
data/
amstd/ # amstd パッケージ
bin/
lib/
ext/
data/
packages/ の下にあるディレクトリ名がパッケージ名です。
このパッケージ名は setup.rb のヘルプメッセージに表示され、
インストールするパッケージを --with や --without でユーザが
選択するときに使われます。
またデフォルトだとパッケージはソート順にインストールされます。
順番を変更したいときは metaconfig API の declare_packages を
使ってください。
ファイルを上記のとおり配置しておけばあとは setup.rb が自動的に
それなりの動作をしてくれます。具体的には、setup のときに以下の
ことを実行します。
bin/ 以下にあるファイルが #! で始まっていてかつ文字列 ruby を含む場合は #! 行を --ruby-path に置き換えるext/ 以下の拡張モジュールをコンパイルする
install では以下のことを実行します。
bin/ 以下のファイルを --bin-dir にインストールlib/ 以下の *.rb を --rb-dir にインストールext/ 以下の *.so を --so-dir にインストールdata/ 以下のファイルを --data-dir にインストールデフォルトの動作でもたいていの場合には通用します。しかし場合によっては インストール時になにか特別な作業をしたいこともあるでしょう。その 場合は特別なファイルを置くことで動作を追加することができます。
たとえば setup のタイミングに lib/tmail/ でなにかをしたいとしたら、
lib/tmail/pre-setup.rb を作ってその中にやりたいことを書きます。
# pre-setup.rb
# racc の文法ファイルをその場でコンパイル (普通、やらない)
system "racc #{srcdir_root + '/src/mp.y'} -o mailp.rb"
# require 'tmail' で tmail/ の中身を全部 require できるようにする
list = Dir.glob(curr_srcdir + '/*.rb').collect {|n| File.basename(n) }
File.open( '_loadlib.rb', 'w' ) {|f|
f.puts list.collect {|n| "require 'tmail/" + n + "'" }
}
File.open( '../tmail.rb', 'w' ) {|f|
f.puts "require 'tmail/_loadlib'"
}
一般には、ディレクトリに入った直後に pre-TASK.rb を、
ディレクトリを出る直前に post-TASK.rb を実行します。
TASK の部分に使えるもの(フック可能なタスク)は
config setup install clean distclean の五つです。
またフックスクリプトの実行中に例外が起きた場合はインストーラ
全体が即座に失敗します。逆に言うと、処理失敗の時は例外を投げれば
よいということです。exit はしないでください。
またフックファイルの例で srcdir_root や curr_srcdir という
メソッドを使っていることに注意してください。setup.rb には、
作ったファイルだけを別のディレクトリに置く仕組みがある
(srcdir と objdir が区別されている)ので、カレントディレクトリから
読めばよいとは限りません。フックファイル中では以下のルールに従って
ください。
srcdir (curr_srcdir) から行う。
srcdir/objdir の仕組み
archive_top/ srcdir は変更しないで
ext/tmail/scanmail/
MANIFEST
depend
extconf.rb
scanmail.c
OBJ/ 対応する objdir に作ったものを置く
ext/tmail/scanmail/
Makefile
scanmail.o
scanmail.so
この場合 archive_top/ を「srcdir のルート」、
OBJ/ を「objdir のルート」と言います。
また archive_top/ext/tmail/scanmail/ を「カレント srcdir」、
OBJ/ext/tmail/scanmail/ を「カレント objdir」と呼びます。
こうしておくと、srcdir に対しては読み出ししか行われないので、
clean などしなくても常に srcdir を最小限のファイルのきれいな
状態に保てます。またマニアックなところでは複数のクロスコンパイルを
同時に行ったりもできるようになります。そこまでいかなくとも、
コンパイルオプションだけを変えていくつものバージョンを作ったりする
ことはあるでしょう。この仕組みはそのような場合に便利なのです。
srcdir/objdir 対応は絶対必要というわけではありませんが、対応して
おいて損はありません。
また curr_srcdir や srcdir_root など
フックファイル中で使える API については別ページの
フック API リファレンス
を参照してください。
setup.rb では、config のタスクオプションを増やすことができます。
このために使うのが metaconfig ファイルです。
例えば、libc のパスを指定するための config オプション --libc と、
win32 サポートのオンオフを指定するためのオプション --win32 を
追加してみましょう。setup.rb を置くのと同じディレクトリに metaconfig
というファイルを作り、この中に以下のような Ruby スクリプトを書きます。
add_path_config 'libc', '/lib/libc.so', 'path to the C standard library' add_bool_config 'win32', false, 'compile with Win32 support'
これで、パスを指定するオプション --libc と、真偽値を取る
オプション--win32 が追加されました。以下のように config
のときに使うことができます。
ruby setup.rb config --libc=/lib/libc-devel.so --win32
また setup.rb のヘルプメッセージにも自動的に表示されます。
metaconfig で使える API については
metaconfig API リファレンスマニュアル
を参照してください。
インストーラというものの特殊性を考え、
互換性はまったく保っていません。2.0 以前とは別物と思ってください。
前バージョンの動作が必要ならばそのバージョンを使いましょう。
以前のバージョンとは以下の点で非互換です。
PATHCONV がないshare/ → data/dryrun コマンドがない → --prefix 使ってインストールしてください。
setup.rb 自体は GNU Lesser General Public License (LGPL) version 2
に従って配布します。詳細はファイル LGPL を見てください。また、setup.rb
を使ってインストールするプログラムが LGPL である必要はありません。
このアーカイブに含まれている Usage_*.txt は自由にコピー・編集
して自分のパッケージに使ってください。Copyright 表示が入って
いますが、これは単に自動化が楽だから入っているだけなので消しても
構いません。