Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-11-08


asdf-addonsで楽をする

| 20:00 |  asdf-addonsで楽をする - わだばLisperになる を含むブックマーク はてなブックマーク -  asdf-addonsで楽をする - わだばLisperになる

asdfasdf-installはとても便利で、単一の実装を単一のOSで使う分には最高なんですが、素のasdfでは、faslファイルをasdfのソースのディレクトリに出力するので、そのディレクトリを異なるプラットホームで共有させようと思うとちょっと厄介だったりします。

Lispのソースファイルはアーキテクチャに依存しないので各種OS/lisp間で共有のNFSディレクトリ等に設置し、アーキテクチャに依存したfaslファイル等は、は別ディレクトリに格納したらもっと楽に共有できるのになあとずっと考えていましたが、common-lisp.netのプロジェクトをつらつらと眺めていたら、asdf-addons projectがまさにこの問題を解決するもののようだったので早速試してみることにしました。

設定

今のところ、asdf-addonsが提供しているものは、asdf-cacheというものだけのようです。これが、faslファイルの出力先を変更するという機能を実現します。

各ファイルの配置方針は、

  • /share/sys/cl/src
    • asdfインストール可能なファイルも可能でないファイルもソースファイルはこの場所に置く
  • /share/sys/cl/asdf
    • asdfのasdファイルを置く
  • /share/sys/cl/fasls
    • 各アーキテクチャに依存したfaslファイルが格納される

という風に決めて、adsfや、adsf-installのパス設定等を変更してみます。

ちなみに、これが正しい方法かどうかは不明です…。

asdf::*central-registry*にasdファイルが置かれたパスを設定するので、

(setq asdf::*central-registry* '(#p"/share/sys/cl/asdf/" その他~))

として上記のパスを一番最初に検索するようにします。

asdf-install:*locations*がadsf-installでインストールする先を設定しているようなので、上記のパスをシステムグローバルなパスとして設定します。

(setq asdf-install:*locations* 
      '((#P"/share/sys/cl/src/" #P"/share/sys/cl/asdf/" "System-wide install")
	(#Pホームディレクトリ等~ "Personal installation"))

asdf-installの際にシステム全体か、ホームディレクトリかを訊かれますが、この変数を参照しているようです。

リスト内部の各項目がインストール先の場所で、

'((ソースの場所 asdファイルの場所 名前) ~繰り返し~)

の様になっていて、任意の数の場所を設定します。

(setq asdf-cache:*asdf-cache* #p"/share/sys/cl/")

これが、今回導入したasdf-addonsのasdff-cacheがfaslファイルを出力する場所になります。asdf-cache内部で、このディレクトリをベースディレクトリとして、.faslsというディレクトリを作成し、そこにさらにOSや処理系のバージョンごとに異なるディレクトリを作成しファイルを配置してくれます。デフォルトでは、.faslsですが、自分の環境では隠す必要もないので、ソースを変更してfaslsという名前で作るようにしました。

asdf-cacheのインストール

asdf-cacheのインストールは、直接ファイルを読み込ませて行ないます。

(load "/share/sys/cl/src/asdf-cache.lisp")

動作の確認

まず、自分のメインの処理系である、SBCL/Linuxで試してみました。

sbclは、asdfasdf-installも完備しているので楽です。

(asdf-install:install :foo)

とすると、上記で設定したインストール先を訊かれ、設定した場所にソースファイルが展開され、asdディレクトリにリンクが張られます。

この後は、asdf-installは、asdfを呼び出してコンパイル等が始まりますがasdf-cacheの働きで、

/share/sys/cl/fasls/sbcl-linux-x86-1.0.10/share/sys/cl/src/foo

というようなディレクトリが作成され、その下にfaslファイルが出力されます。

そして、faslファイルの読み出しもasdf-cacheの働きで、指定したディレクトリより読み出すようになります。

adsf-cacheが便利なところ

共有している場合、どこか一つのマシンで、asdf-installすると、共有しているasdのディレクトリにもasdファイルがリンクされるため、他のマシンでも、

(asdf:oos 'asdf:load-op :foo)

とすれば、コンパイルとロードが完了するため、asdf-installは一回で済みます。これが案外便利です。

また、asdfに対応したソースならば、asdf::*central-registry*にリンクを張るだけでasdfで導入できますが、この場合ソースディレクトリにfaslファイルがばら蒔かれることもないので快適です。

今のところ、処理系は、SBCL、CLISP、CMUCL、Allegro 8.1試用版、Lispworks 5.0.1試用版、ECL、OSはLinux、MacOSXで試してみましたが、全部の環境を簡単に揃えることができるので結構お勧めです。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20071108