FrontPage  Index  Search  Changes  RSS  wikifarm  Login

asdf + asdf-install on windows no-cygwin

cygwinを使わないwindows上のcommonLisp処理系での、 ライブラリ周り環境構築に関する覚書です。 つっこみ修正歓迎。

<asdf>

http://common-lisp.net/project/asdf/asdf/FAQ.html

2010年現在、asdf2ができていて、旧asdfと仕様が変わっている。 asdf2では、ライブラリのロードは以下の様になる。

(asdf:load-system :cl-ppcre)

     

処理系の初期設定ファイル(.clisprcなど) に書くなどして、あらかじめ落としておいたasdf.lispをロードするようにしておく。

(load "C:/Lisp/lisp-library/asdf/asdf.lisp")

ライブラリフォルダを格納するディレクトリを決めておく。 (例えば、C:/Lisp/lisp-library/)

それからasdfにライブラリの在り処を示さなければならない。

http://common-lisp.net/project/asdf/asdf/Configuring-ASDF.html#Configuring-ASDF

ここでは、asdf:*central-registry* を設定する方法を選ぶ。

各ライブラリ(hoge)のhoge.asdファイルの在るディレクトリ、または hoge.asdファイルにリンクする同名の (hoge.asd)ショートカットを溜め込むディレクトリ、 を、asdf:*central-registry* へ、setfやpushする。

処理系初期設定の例:

(setf asdf:*central-registry*
      #+(or :clisp :sbcl)
        (directory #P"C:/Lisp/lisp-library/*/")
      #+:ccl
        (directory #P"C:/Lisp/lisp-library/*/"
                   :directories t :files nil))
;; ↓ショートカットリンクを使う場合
(push #P"C:/Lisp/asd-link-firm/"
       asdf:*central-registry*)

webより落として解凍したライブラリフォルダ、あるいは asdファイルへのショートカットリンクを、先の格納ディレクトリに入れれば、 これで、使えるようになる。

(asdf:load-system :cl-ppcre)

を評価すると、asdf2がデフォルトでディレクトリを作り、 キャッシュを保存する。 カスタマイズしたい人は、asdfマニュアル参照のこと。

<asdf-install>

簡単なライブラリなら問題ないが、 多数の別ライブラリに依存したものをインストールしようとすると、 いくつもwebから探し、落として、展開してを繰り返さなければならない。

asdf-installがこのようなインストールを簡易にする, 便利なライブラリである。

しかしwindowsだと動作しないことも多い。

二つ原因が知られている。

一つはコードのバグ。 asdf-install/port.lisp の201行目辺り。 windowsかつclispの場合の適用コード。 formatの括弧が閉じてないので閉じる、あと、wait tが良いようだ。

(defun return-output-from-program (program args)
 (with-output-to-string (out-stream)
   (let ((stream
          (ext:run-shell-command
    (format nil "~A~{ ~A~}" program args)
                   :output :stream
                   :wait t)))
     (loop for line = (ignore-errors
(read-line stream nil))
           while line
           do (write-line line out-stream)))))

二つ目はtarballで固めてあるライブラリの展開時 外部のtar展開プログラム とのやりとりで、失敗する。

これの解決として、

asdf-install:*tar-extractor*

を設定して、asdf-installをカスタマイズする方向がある。

http://common-lisp.net/project/asdf-install/tutorial/reference.html

asdf-installのカスタマイズのための新たな関数が要る。 commonLispで完結するような、例えば以下のコードが有効だが、 このコードのために、gzip-stream と archive という 二つのライブラリが必要。 それらライブラリも外部の別ライブラリに依存している。 インストールが煩雑だが、これが最後の煩雑さである。 (と祈ろう)

(asdf:load-system :asdf-install)
(asdf:load-system :gzip-stream)
(asdf:load-system :archive)
(defun asdf-install-extractor (to-dir tarball)
(let ((name nil))
 (gzip-stream:with-open-gzip-file (ins tarball)
   (archive:with-open-archive (archive ins)
     (let
((*default-pathname-defaults* (pathname to-dir)))
       (archive:do-archive-entries
         (entry archive name)
         (archive:extract-entry archive entry)
         (unless name
          (setf name (archive:name entry)))))))
 ;; we use string instead of namestring because
 ;; asdf-install searches for /'s and not \'s
 ;; which will break on windows
 (string name)))
(setf asdf-install:*tar-extractor* 'asdf-install-extractor)

これでうまく動くと思う。

最後に asdf-installによるインストールディレクトリを、 前に決めておいたライブラリ本体格納場所を使うように カスタマイズする。 例えば、

(push
'(#P"C:/Lisp/lisp-library/"
#P"C:/Lisp/asdf-install/systems/"
"My installation") asdf-install:*locations*)

asdf2デフォルトだと、 上の設定での

#P"C:/Lisp/asdf-install/systems/"

ディレクトリは結局使わないようなので、適当に。

終えたら、 テストしてみよう。

(asdf-install:install 'drakma)

さらに

(asdf:load-system :drakma)
(do-external-symbols (s :drakma) (print s))

インストールできてるでしょうか?

Last modified:2010/07/20 20:29:37
Keyword(s):[windows] [asdf] [asdf-install] [clisp]
References: