Gauche:複数バージョンの共存
Shiro(2017/08/25 06:02:27 UTC) 元々複数バージョン併存してインストールって運用を見越して、バージョン依存バイナリのディレクトリをバージョン毎に分けたりしてたんだけど、肝心のgoshとlibgauche.soが${bindir}と${libdir}に上書きインストールされるので今までは何の役にも立ってなかった。そろそろ何とかしたい。
ひとつ考えてるのは、rpath頼みの方法。
- goshのリンク時にrpathを${libdir}でなく${ARCH_INSTALL_DIR}にする。${libdir}のlibgauche-${ABIVERSION}.soが上書きされても、そのバージョンのgoshは同じバージョンのlibgauche-${ABIVERSION}.soを読むので無問題。
- ${bindir}に、goshと同時にgosh-${VERSION}をインストールする。もしくはgosh-${VERSION}が本体でgoshをsymlink。
- ${libdir}にも最新のlibgauche-${ABIVERSION}.soをインストールする。これは拡張ライブラリコンパイル用。
こうしとくと、goshで最新版、gosh-${VERSION}で特定のバージョンが使える。 多分使い勝手としては一番いい。 Gaucheアプリをバージョンロックで配る場合にも書きやすいし。
必須条件はrpathが動くこと。これ、昔はいまいちあてに出来なかったんだけど、今なら当てにできるだろうか? configure.acでは今でもなにやらごちゃごちゃしたチェックを残してるんだけど。
${bindir}の下にgosh-*が増殖するのが気持ち悪いと言えなくはない。今は年1回リリースくらいのペースだからそうひどいことにはならないとは思うけれど。これに対する別解としては、${bindir}の下はgoshだけにしといて、gosh自身が環境変数か何か見て特別なのがセットされてたら指定バージョンの${ARCH_INSTALL_DIR}下のgoshをexecする、という手がある。古いバージョンのgoshを使う時に一段fork/execが余分に噛むのがオーバヘッドではあるけれど。(オーバヘッドが嫌ならPATHに${ARCH_INSTALL_DIR}追加、という手も。)
2017/09/02 08:42:50 UTC: 色々見直してたら、なんだか今の設定は妙だぞ。何でこうしたんだっけか。
libgauche.soリンク時のsonameに、マイクロバージョンまで含めた名前 (libgauche-0.9.so.0.6とか) を指定してるから、0.9.6のgoshは0.9.6のlibgauche (libgauche-0.9.so.0.6) しかリンクしないし、0.9.5のgoshは0.9.5のlibgauche (libgauche-0.9.so.0.5) しかリンクしない。現状、libgauche-0.9.so.0.Z は上書き更新されないので、goshをgosh-X.Y.Zにリネームして取っとけばバージョン毎に使えることになる。
ただ、sonameの趣旨からすると、マイクロバージョンまで固定してしまうのはおかしい。 0.9の間はABIを完全にコンパチに保つのが難しいってことでこうしたんだったかな。
2017/09/03 22:43:58 UTC: 実験的にこうしてみた。
- rpathで、goshは$ARCH_INSTALL_DIR/libgauche とリンク。
- gosh -v VERSION で起動すると、VERSION相当のgoshを探してそれをexec
これで、少なくとも「前のバージョンで走るかどうか試したい」みたいなちょっとした起動はカバーできる。-v VERSIONではトランポリンのオーバヘッドが入るから、頻繁に起動する運用に使うのはおすすめしない。
完全にgaucheの複数バージョンの環境を分けて並行して使いたいという場合は、gauche-config等も分けなければならないので、PATHで切り替えるのが一番だろう。$ARCH_INSTALL_DIR以下に一式入っているので。