setup.rb/install.rb は Ruby プログラムのパッケージを対象とした コマンドラインベースのインストーラです。
install.rb は単体パッケージ用のインストーラです。ひとまとまりの Ruby スクリプト、拡張モジュール、コマンド、データをインストールできます。 これはようするに「ライブラリ」ひとつ分に相当します。
一方 setup.rb はそのパッケージをさらに複数たばねて扱うことができます。 一部のパッケージだけを選択してインストールしたりすることも可能です。
ユーザが setup.rb/install.rb を使ってインストールする過程を説明します。 通常は次の三行で十分です。(# はスーパーユーザ)
config は設定の変更・調整で、setup が主にコンパイル、install が 実際のインストールです。$ ruby setup.rb config $ ruby setup.rb setup # ruby setup.rb install
以下、もう少し詳細に説明します。setup.rb にはグローバルオプションと コマンド、そしてコマンド専用のオプションがあります。組みあわせとしては 以下のようになります。
CVS を知っている人は cvs コマンドに似たようなものと言うと わかるかもしれません。まずグローバルオプションとしては次の 三種類が使えます。ruby setup.rb グローバルオプション ruby setup.rb コマンド ruby setup.rb コマンド コマンドオプション
続いて順次コマンドのオプションを解説します。
すべて --opt=value の形で指定します。途中に空白があってはいけません。 各オプションのデフォルト値は ruby setup.rb --help で見られます。
さらに setup.rb では以下のオプションも使えます。
--with と --without には ',' で区切って複数の値をあたえられます。
また install.rb/setup.rb のどちらでも、次のように -- に続けて オプションを指定することで extconf.rb に引数を渡すことができます。
ruby install.rb config -- --with-tklib=/usr/lib/libtk-ja.so.8.0
他のコマンドにはオプションはありません。
まず install.rb はパッケージが以下のようなディレクトリ構造になっていることを 前提にしています。
アーカイブのトップ/ install.rb bin/ コマンド類 lib/ Ruby ライブラリ ext/ 拡張モジュール data/ データ
bin lib ext data の下には各々インストールされるイメージそのままに ファイルを配置します。たとえば lib/tmail/header.rb というファイルを 置くと RUBYLIB/tmail/header.rb としてインストールされます。 (bin/ lib/ などは中身が空のときには省略して構いません)
ただし ext だけはちょっと特殊で、複数のファイルからひとつのシェアード ライブラリができるので、.so ができるべき場所にディレクトリを作り、 その中に必要なファイルを入れます。たとえば RUBYLIB/ARCH/tmail/scanmail.so が必要ならば、ディレクトリ ext/tmail/scanmail/ を作ってその中に scanmail.c や extconf.rb depend MANIFEST を入れます。
[注意] install.rb/setup.rb は MANIFEST があるディレクトリだけをコンパイル 対象にします。拡張モジュールのディレクトリには必ず MANIFEST を置いてください。
setup.rb は install.rb のディレクトリ構造を利用します。
アーカイブのトップ/ setup.rb packages/ tmail/ bin/ lib/ ext/ data/ raccrt/ bin/ : strscan/ : amstd/ :
つまり packages/*/ の下にそれぞれのパッケージのディレクトリツリーを そのまま配置します。packages/ の下にあるディレクトリ名がそのまま パッケージ名となり、--with や --without でインストールするかどうか 選択できるようになります。
ファイルを上記のとおり配置しておけばあとは install.rb/setup.rb が 済ませてくれます。しかし場合によってはインストール時になにか作ったり したいこともあるでしょう。そのような場合は特別なファイルを置くことで 動作を追加することができます。
たとえば 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 ですが、 setup と clean だけにしておくのが無難でしょう。 ちなみにフックスクリプトの実行中に例外が起きた場合はインストーラ 全体が即座に失敗します。逆に言うと、処理失敗の時は例外を投げればよい ということです (exit はだめです)。
またここで srcdir_root や curr_srcdir というメソッドを使っている ことに注意してください。setup.rb/install.rb には作ったファイルだけを 別のディレクトリに置く仕組みがある (srcdir、objdir が区別されている) ので、
しなければいけません。
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/ を「current srcdir」、 OBJ/ext/tmail/scanmail/ を「current objdir」と呼びます。
こうしておくと、srcdir に対しては読み出ししか行われないので、 clean などしなくても常に srcdir を最小限のファイルのきれいな 状態に保てます。またマニアックなところでは複数のクロスコンパイルを 同時に行ったりもできるようになります。そこまでいかなくとも、 コンパイルオプションだけを変えていくつものバージョンを作ったりする ことはあるでしょう。この仕組みはそのような場合に便利なのです。
srcdir/objdir 対応は絶対必要というわけではありませんが、対応して おいて損はありません。pre-*.rb post-*.rb を書くときには この仕組みへの対応を容易にするために以下の API が利用できます。
インストーラというものの特殊性を考え、 互換性はまったく保っていません。2.0 以前とは別物と思ってください。 前バージョンの動作が必要ならばそのバージョンを使いましょう。
互換性がない点
このシステムはなんだか複雑に思えます。それでも setup.rb を使うメリットは 何でしょうか。それは、「統一された設定のためのインターフェイスを提供できる」 という一点につきます。
setup.rb は、コマンドラインオプションを与えることで lib や ext の インストール先を変更できるようになっています。またパッケージごとに インストールするかしないかを選択することもできます。特にひとつの アーカイブにたくさんのパッケージが入っている場合は、全部まとめて設定を 行えるのは非常に便利です。また同時に README などを簡潔にすることができ、 慣れない (慣れてるかもしれないけど…) 英語で書く量を減らすこともできます。
GNU Lesser General Public License (LGPL) version 2 です。 詳細はファイル LGPL を見てください。また、setup.rb/install.rb を使って インストールするプログラムが LGPL である必要はありません。
Copyright (c) 2000,2001 Minero Aoki <aamine@loveruby.net>