Lisp/外部ライブラリ/ASDF/ASDF の設定
表示
ASDF の設定
[編集]ほとんどの場合あなたの lisp の実装の設定ファイルに asdf の設定を加えることになるでしょう。例えば、 sbcl は設定ファイルに ~/.sbclrc
を使用していますし、 cmucl では ~/.cmucl-init
を使用しています。最も重要な設定は下で説明する central registry です。他のほとんどの設定は任意となります。
asdf:*central-registry*
[編集]central-registry はシステム定義の .asd
のファイルを検索するファイルディレクトリのリストで、あなたが ASDF の設定について知らなければならない最低限のことです。 asdf:*central-registry を安全に修正するには pushnew を使うことで新しいディレクトリをリストに入れ込みます。
(pushnew "/Path/to/asd/files/" asdf:*central-registry*)
自動で古くなった fasl file をアップデートする
[編集];;; もし fasl の更新が必要になると、 fasl の再コンパイルとロードを一回だけ試みます。
;;; SBCL だけが偽のファイルのために異なった条件を持っていますが、他の lisp の実装では
;;; どんな古いエラーにもリトライを行います。実は Allegro は似たような条件を持っているのですが、
;;; 外部からの参照は出来ません。しかし、ACL7 のアップグレードにはうまく働きます。
;;; CMUCL 19c は不正な fasl の条件を持っています。
(defmethod asdf:perform :around ((o asdf:load-op) (c asdf:cl-source-file))
(handler-case (call-next-method o c)
(#+sbcl sb-ext:invalid-fasl
#+allegro excl::file-incompatible-fasl-error
#+lispworks conditions:fasl-error
#+cmu ext:invalid-fasl
#-(or sbcl allegro lispworks cmu) error ()
(asdf:perform (make-instance 'asdf:compile-op) c)
(call-next-method))))
シンボリックリンクの代案、ディレクトリを再帰的に検索する
[編集]ASDF にライブラリを追加する標準的な方法は次のどちらかを伴います。
asdf:*central-registry*
にリストされたディレクトリにある.asd
ファイルのためにシンボリックリンクを作成するasdf:*central-registry*
にディレクトリを追加する。
次のコードの断片は、どのようにして asdf パッケージのサブディレクトリの中を再帰的に検索するかと言うことを表しています。
;; 標準的な環境設定の検索の代わりを定義することが可能です。
;; 下のコードはあなたの Lisp の設定ファイルにたどり着き、カスタマイズすることが出来ます。
;; これは指示されたディレクトリのサブディレクトリにある全ての ASDF システムを検索します。
;; これによって、新しいパッケージを指定されたディレクトリに "落とし入れる" ことになります。
;; そして、これで余計な手順なしに読み込みが可能になります。
(in-package #:asdf)
(defvar *subdir-search-registry* '(#p"/my/lisp/libraries/")
"List of directories to search subdirectories within.")
(defvar *subdir-search-wildcard* :wild
"Value of :wild means search only one level of subdirectories; value of :wild-inferiors means search
all levels of subdirectories (I don't advise using this in big directories!)")
(defun sysdef-subdir-search (system)
(let ((latter-path (make-pathname :name (coerce-name system)
:directory (list :relative
*subdir-search-wildcard*)
:type "asd"
:version :newest
:case :local)))
(dolist (d *subdir-search-registry*)
(let* ((wild-path (merge-pathnames latter-path d))
(files (directory wild-path)))
(when files
(return (first files)))))))
(pushnew 'sysdef-subdir-search *system-definition-search-functions*)