保科です。

On Sat, Nov 14, 1998 at 12:31:28AM +0900,
Motoyuki Kasahara <m-kasahr / sra.co.jp> wrote:

> 笠原です。
> 
> あああ、これは私のパッチが原因だと思います。
> (詳しくは ChangeLog をご参照下さい。)

見てみました。笠原さんのパッチは今後ともずっとinstruby.rbに含まれて
いるべきものと思います。

> rbconfig.rb 自体には手は入れてないので、こっちは分かりません。

はい。ちょっと書き方が足りなかったのですが、rbconfig.rbそのものは
共通で1byteも変ってません。

ただ、instruby.rbの先頭で、
require "rbconfig"
include Config
というような記述があり、rbconfig.rbにズラッと書かれている
CONFIG["bindir"] = ...
の類が参照されているのですが、これらの代入文としての評価がすでに
終ってしまっているような感じでして、instruby.rb側で一生懸命なにかを
代入しても、CONFIG[]の内容が変化していないように見える、ということです。

ですので、例として、rbconfig.rb の方には
>   CONFIG["exec_prefix"] = "#{CONFIG[\"prefix\"]}" 
という記述があるのですが、instrubyの方で prefix になにかを代入
たとえば
prefix = "/tmp"
などとしたとしても、CONFIG["exec_prefix"] も /tmp になるか、というと
ならないようだ、と書きたかったのです。わかりにくいですね(笑)

> > -bindir = CONFIG["bindir"]
> > -libdir = CONFIG["libdir"] + "/" + ruby_install_name
> > +bindir = prefix + "/bin"
> > +libdir = prefix + "/lib/" + ruby_install_name
> >  archdir = libdir+"/"+CONFIG["arch"]
> > -mandir = CONFIG["mandir"] + "/man1"
> > +mandir = prefix + "/man/man1"
> 
> う〜ん。逆にこうしてしまうと、configure  の --libdir とか --mandir,
> --bindir が無効になってしまうのですよね。1.1c6 までがそうだったので、
> パッチ作って採用して貰ったのですが。

これにはRedHatというかrpm作成側の一方的な都合が絡んでいますから、
必ずしもrubyの配布物にパッチとして含めてくれ、というつもりはないです。

rpmをご存知ない方もいらっしゃるでしょうから、パッケージ作成作業の
簡単な流れを説明させてください。

rpmを作るには必ずspecファイルというものが必要です。レシピです。
通常は、ソースを展開し、パッチなどを(あれば)あて、普通に人手ですると
同じように、
./configure --prefix=/usr
make
などとしてconfigure、makeします。そしてインストールするわけですが、
この際には直接、目的の位置にインストールするのではなく/var/tmpなどの
一時的な位置にインストールします。仮想インストールなどと言うときも
あるようです。

無事にinstallが終わると、最終的に/var/tmp以下にできているusrだのlib
だのといったディレクトリ構成も含めて固め、rpmとなります。ですから
実際の位置である /usr/lib や /usr/bin にファイルを配置するのは、
作成されたrpmをインストールするrpmコマンド(ややこしい)の仕事に
なるのです。

tarballで通常配布されているソースに含まれたMakefileを使って、そのまま
make installで配置されるということにはならないのです。

で、こういった仮想的なinstallをruby-1.1c7で実行しようとすると、
make prefix=/var/tmp install
となるのですが、これができません。上記のような事情で、ruby 1.1c7の
instruby.rbではinstall時に指定されたprefixを読んではいますが、内部
ではどこにも反映されず、rbconfig.rbの内容をそのまま使ってしまう
からです。

かといって、./configure 時にprefix=/var/tmp などと指定してmake
しちゃうと、それらはrbconfig.rbに保存されますし、installした後でも
/var/tmp の下をrubyが見にきてしまいます。そこにはrpmの作成中しか
ものは置いてないので全然動かない、ということに…

結局、configure時のprefixと、make install時のprefixに異なるものが
指定されたときにも解釈してくれるようなinstruby.rbがrpm化の際には
都合が良い、というところに落着きます。

ということで最初にもどって、笠原さんのパッチをそのまま使ってて
ください(赤帽の都合は無視してもらっても結構です)と書いたのは、
普通にtarballからmakeしてデフォルト以外のディレクトリ構成で
installする人は、えぐち@エスアンドイーさんが別メールでおっしゃる
ように、configure時に調整済で、installは素直にそのままでしょうし、
rpm化する際には、specファイルの中で意識して、今回のようにパッチなりを
あててしまえば、閉じたものになりますから。

ただ1点だけ、libruby.so が今のinstruby.rbだと /usr/local/lib/ruby に
置かれます。1.1c6では/usr/local/lib に置かれていました。
通常、/usr/local/lib/rubyなどの固有なディレクトリは/etc/ld.so.conf
には書かれていないので、ldconfigは見にきませんよね。

これは何か事情があってこうなっているのですか? ruby-jedがlibruby.so
のDynamic Linkに失敗するので、rpmの方ではlib直下に入るように変えて
(というか戻して)しまいました。

-- 
Toru Hoshina
Network Associates,Inc.
Pacific Rim, Software Engineer.
http://www.best.com/~hoshina
PGP fingerprint : 95 73 1C 26 C6 9E 28 86  BA 32 34 CA FC 9B DC 6D