Gauche:gauche-statifier

Gauche:gauche-statifier

Rui(2006/12/03 04:18:02 PST): Gaucheスクリプトを単一の実行ファイルに変換するスクリプト。http://gauche.cvs.sourceforge.net/gauche/Gauche-statifier/

gauche-statifier hello-world.scm

このようにすると、Gaucheのインストールされていない環境で実行可能なバイナリファイルhello-worldができます。


仕組み

Gaucheスクリプト本体、それが読み込んでいるSchemeライブラリ、そしてDSOを、一つの疑似的に静的リンクされた実行可能バイナリファイルに変換します。変換されたバイナリはGaucheのインストールされていない環境で動かせます。

変換にはstatifierコマンドを使います。動作のステップは次のとおり。

  1. 依存しているライブラリとDSOのリストを得るために、goshに"-fload-verbose"オプションを付けて、指定されたスクリプトをロードする
  2. 依存しているSchemeライブラリとスクリプト本体を埋め込んだCプログラムを作成し、コンパイルする
  3. (2)の実行ファイルと、それが依存するDSOを、statifierで1つのファイルにまとめる

2では、Gaucheが*.scmファイルを探しにいかないよう、ライブラリを依存関係にしたがってソートし、常に依存関係を満たすような順番にSchemeコードを埋め込んでいます。

libgaucheのDSOを検索する関数(Scm_FindFile)を置き換えています。GaucheのScm_FindFileはDSOが見つからないとエラーを返すのですが、statifierで変換されたバイナリにはDSOがプリロードされているため実際はdlopenする必要がなく、ファイルを見つける必要がありません。ここで定義しているScm_FindFileは、プリロードされたDSOの検索に対して、見つかったという結果を常に返します。

あまりないと思いますが、実行時にライブラリをロードするスクリプトは、実行に失敗します。普通にライブラリをuseをしている限りは心配ありませんが、実際の環境に移す前に動作確認したほうがよいと思います。私は次の方法で確認しています。

動作はLinux (Ubuntu 6.06とRHEL4)で、gauche-statifier自身をgauche-statifierで変換することで確認しました。

ライセンスについての注意: statifierが生成した擬似的にスタティックリンクされたファイルは、依存しているDSOのライセンスに従う必要があるかもしれません。依存しているDSOは、動的リンクするすべてのもの、つまりlibcまで含みますし、Gaucheの拡張モジュールがロードするDSOも含みます。個人的に使うぶんには問題ないかと思いますが、一般に配布するときは注意してください。

参考


コメント


Last modified : 2012/01/24 19:45:08 UTC