Gauche:インストールディレクトリの取得
Shiro(2020/03/25 12:57:22 UTC):実行中のGaucheプロセスからインストールされた場所を取得する話。場合分けがややこしいので整理する。
関連issue: https://github.com/shirok/Gauche/issues/644
目的
- a. コンパイル済みバイナリのディレクトリツリーを任意の場所に展開してすぐ実行できるようにしたい
(アプリケーションへのバンドルとか、ちょっと試しに使ってもらう時とか)
- OSXのFrameworkコンパイルはそもそもそういう仕様(アプリ内にツリーごとコピーされる)なので既に対応済
- Windowsもバイナリで配るので対応済。
- Unix系の場合、今のところgoshの方にrpathでlibgaucheのパスが埋め込まれちゃうので単純にはいかない。
- b. 実行時情報を取るsrfiへの対応
-- https://github.com/shirok/Gauche/pull/640
- これはexecutableのパスなのでライブラリを探す起点のパスとちょっと違う
- c. 任意の場所においたソースツリーからインストールせずに起動
場合分け
- ディレクトリ構成の違い
- インストール前:
- バイナリ:
src/libgauche*
,src/gosh
、 - ライブラリパス:
lib/
およびsrc/
.
- バイナリ:
- Windows:
- バイナリ:
$prefix/bin/gosh.exe
、prefix/bin/libgauche*.dll
. - ライブラリパス:
$prefix/lib
.
- バイナリ:
- Unix:
- バイナリ:
$prefix/bin/gosh
もしくは$prefix/lib/gauche-$ABI/$VERSION/$ARCH/gosh
、$prefix/lib/gauche-$ABI/$VERSION/$ARCH/libgauche*.so
. - ライブラリパス:
$prefix/share/gauche-$ABI/$VERSION/lib
.
- バイナリ:
- Framework:
- バイナリ:
Gauche.framework/Versons/Current/bin/gosh
,Gauche.framework/Versions/Current/lib/libgauche*.dylib
. - ライブラリパス: """Gauche.framework/Versions/Current/share/gauche-$ABI/$VERSION/
- バイナリ:
- インストール前:
実装
paths.cの中でプラットフォームごとに次の3つの基本関数を実装。 いずれも情報が取れない場合はNULLを返してよい。
- const char *get_libgauche_path() - 実行中のlibgaucheのパス。static linkの場合はNULL
- const char *get_executable_path() - 実行中のプログラムのパス
- const char *get_install_dir() - 実行中のプロセスのトップディレクトリ ($prefixに相当するものだが、実行中のライブラリやプログラムの位置から算出される)。Schemeライブラリや拡張モジュールの位置はここを基準に求められる
libgaucheをリンクしたプログラムの場合、バイナリはいろんな場所に存在し得るが、 Schemeライブラリはlibgaucheの位置を基準にできる
実行中のプログラムのパスは、static linkの場合の次善の策 (その場合、Schemeライブラリ自体 存在しない可能性が高いが) である他、単独でバイナリの位置を取りたい場合にも使える
Public C APIとしては次の3つ。情報が取れない場合は#fが返る。
- ScmObj Scm_LibgauchePath()
- ScmObj Scm_ExecutablePath()
- ScmObj Scm_RuntimeDirectory()
Schemeレベルでは、gauche.internalに以下の手続きとして見える。非公開。
- %gauche-libgacuhe-path
- %gauche-executalbe-path
- %gauche-runtime-directory