2011年1月10日月曜日

SBCL 実行バイナリの作成方法メモ


このエントリーをはてなブックマークに追加


やっとまともに動かせるCLのバイナリが作れたので、
UNIXのlsコマンド風なものをCommon Lispで実装する手順を例にメモっておく。
環境は、Windows7+SBCL

1. とりあえず、REPLでも何でもよいので実行する処理を記述する。
ls.lisp
(defun ls-current ()
  (loop for i in (directory (make-pathname
    :type :wild
    :name :wild
    :defaults (truename "./")))
       do (format t "~a~%" i)))

2. SBCLを単体で起動する。
c:\> set HOME=c:\emacs\home
c:\> set SBCL_HOME=C:\Program Files (x86)\Steel Bank Common Lisp\1.0.37\
c:\> sbcl
sbcl*

3.ソースをロードする
sbcl* (load "c:/emacs/clisp/ls.lisp")
T

4.実行テスト
sbcl* (ls-current)
c:\$Recycle.Bin\
c:\Documents and Settings\
c:\MSOCache\
 .
 .
 .

5.コンパイルする
sbcl* (save-lisp-and-die "ls.exe" :toplevel 'ls-current :executable t :purify t)
:toplevel バイナリを実行するときに最初に実行する関数を指定する。
:executable tを指定すると、作成するバイナリを実行可能にする
:purify tを指定すると、動的オブジェクトを静的オブジェクトに変換する(x86系では意味ないらしい?)

 参考>> Common Lisp クックブック 「現在のメモリイメージを再利用する」
c:> dir ls.exe
2011/01/10  12:32        31,703,064 ls.exe

c:> ls.exe
This is experimental prerelease support for the Windows platform: use
at your own risk.  "Your Kitten of Death awaits!"
c:\$Recycle.Bin\
c:\Documents and Settings\
c:\MSOCache\
c:\NVIDIA\
c:\PerfLogs\
c:\Program Files (x86)\
c:\Program Files\
c:\ProgramData\
c:\Recovery\
c:\System Volume Information\
c:\Users\
c:\Windows\
c:\emacs\
c:\hiberfil.sys
c:\ntbackup\
c:\pagefile.sys
c:\temp\
わかっちゃえば簡単だった。 作成したバイナリが他のライブラリ(dllとかsoとか)を使っている場合は、環境変数PATHに設定しておけば動かせるっぽい。

0 件のコメント:

コメントを投稿