setup.rb ユーザマニュアル

簡単な解説

setup.rb/install.rb は Ruby プログラムのパッケージを対象とした コマンドラインベースのインストーラです。

install.rb は単体パッケージ用のインストーラです。ひとまとまりの Ruby スクリプト、拡張モジュール、コマンド、データをインストールできます。 これはようするに「ライブラリ」ひとつ分に相当します。

一方 setup.rb はそのパッケージをさらに複数たばねて扱うことができます。 一部のパッケージだけを選択してインストールしたりすることも可能です。

ユーザからの setup.rb の使い方

ユーザが setup.rb/install.rb を使ってインストールする過程を説明します。 通常は次の三行で十分です。(# はスーパーユーザ)

$ ruby setup.rb config
$ ruby setup.rb setup
# ruby setup.rb install
config は設定の変更・調整で、setup が主にコンパイル、install が 実際のインストールです。

以下、もう少し詳細に説明します。setup.rb にはグローバルオプションと コマンド、そしてコマンド専用のオプションがあります。組みあわせとしては 以下のようになります。

ruby setup.rb グローバルオプション
ruby setup.rb コマンド
ruby setup.rb コマンド コマンドオプション
CVS を知っている人は cvs コマンドに似たようなものと言うと わかるかもしれません。まずグローバルオプションとしては次の 三種類が使えます。
-q,--quiet
メッセージ出力を最小限にする
--verbose
実行中の状況を詳細に表示する (デフォルト)
-h,--help
setup.rb の使いかたなどを表示
-v,--version
setup.rb のバージョンを表示
--copyright
setup.rb の著作権を表示
コマンドは以下の 6 つです。
config
設定をチェックしたうえで保存する
show
現在の設定を表示する
setup
コンパイルなど、ファイル内容の変更を行うもの
install
インストール
clean
setup で作成したものを消す

続いて順次コマンドのオプションを解説します。

config のタスクオプション

--prefix
rbdir sodir などの共通部分のパス
--std-ruby
Ruby の標準ライブラリのパス
--site-ruby
site_ruby
--bin-dir
実行可能ファイル(コマンド)がインストールされるパス
--rb-dir
Ruby スクリプトがインストールされるパス
--so-dir
拡張モジュールがインストールされるパス
--data-dir
データがインストールされるパス
--ruby-path
#! 行にセットする ruby のパス
--ruby-prog
インストールに使う ruby のパス
--make-prog
make を指定
--rb-config
デフォルトの設定に使う rbconfig.rb

すべて --opt=value の形で指定します。途中に空白があってはいけません。 各オプションのデフォルト値は ruby setup.rb --help で見られます。

さらに setup.rb では以下のオプションも使えます。

--with
インストールするパッケージ
--without
インストールしないパッケージ

--with と --without には ',' で区切って複数の値をあたえられます。

また install.rb/setup.rb のどちらでも、次のように -- に続けて オプションを指定することで extconf.rb に引数を渡すことができます。

ruby install.rb config -- --with-tklib=/usr/lib/libtk-ja.so.8.0

install のタスクオプション

--no-harm
挙動を表示するだけで実行しません。

他のコマンドにはオプションはありません。

パッケージ配布者側からの使い方

install.rb の場合

まず 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 の場合

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 が利用できます。

srcfile(fname)
current srcdir のファイル fname を絶対パスに展開する。
srcexist?(fname)
current srcdir に fname があれば真。
srcdirectory?(fname)
current srcdir にディレクトリ fname があれば真。
srcfile?(fname)
current srcdir にノーマルファイル fname があれば真。
srcentries(relpath = '.')
current srcdir + '/' + relpath にあるファイル(ファイルエントリ)名 のリストを文字列の配列で返す。
srcfiles(relpath = '.')
current srcdir + '/' + relpath にあるファイル(ノーマルファイル)名 のリストを文字列の配列で返す。
srcdirectories(relpath = '.')
current srcdir + '/' + relpath にあるディレクトリの名前のリストを 文字列の配列で返す。
curr_srcdir
current srcdir
curr_objdir
current objdir
srcdir_root
srcdir のルート。setup.rb 使用時のルートは「各パッケージの」トップです。
objdir_root
objdir のルート。setup.rb 使用時のルートは「各パッケージの」トップです。
config(key)
ユーザのコンフィグを取得します。 たとえば --prefix なら config('prefix') で取ることができます。

以前のバージョンとの互換性

インストーラというものの特殊性を考え、 互換性はまったく保っていません。2.0 以前とは別物と思ってください。 前バージョンの動作が必要ならばそのバージョンを使いましょう。

互換性がない点

setup.rb を使うメリット

このシステムはなんだか複雑に思えます。それでも 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>