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
Last modified : 2020/04/05 22:00:56 UTC