Next: , Previous: , Up: ASDFがコンパイルされたファイルを保持する場所を設定する   [Contents][Index]


9.3 アウトプットトランスレーションを設定するDSL

アウトプットトランスレーションの設定は、S式によるDSLで行います。以下はその文法です:

;; 設定の1単位は1つのS式であり、S式はキーワード:source-registryから
;; 始まって1つ以上のディレクティブが続きます。
CONFIGURATION := (:output-translations DIRECTIVE ...)

;; ディレクティブは次のいずれかです:
DIRECTIVE :=
    ;; 継承ディレクティブ:
    ;; CONFIGURATIONは必ず次の2つのディレクティブのいずれかを含ま
    ;; なければなりません。
    :inherit-configuration |
    ;; 継承した設定をその位置に挿入するディレクティブで、多くの場合、
    ;; 最後に指定されます。(48)
    :ignore-inherited-configuration |
    ;; 継承した設定を除外します。どこに指定してもかまいません。

    ;; 前方互換性のためのディレクティブ(ASDF 2.011.4)以降です。新し
    ;; い設定機能を使いたいが、その機能をサポートしていない古いASDFか
    ;; ら新しいASDFをブートストラップして使っているという場合には、こ
    ;; のディレクティブが必要でしょう。
    :ignore-invalid-entries |

    ;; 別の設定ファイルまたは設定ディレクトリをインクルードします。
    (:include PATHNAME-DESIGNATOR) |

    ;; ユーザーキャッシュを有効にします。環境に応じて、例えば
    ;; ~/.common-lisp/cache/sbcl-1.0.45-linux-amd64/や
    ;; C:/Users/foo/AppData/Local/cache/common-lisp/sbcl-1.4.2-win-x64/
    ;; などが使われるでしょう。デフォルトでは有効です。
    :enable-user-cache |
    ;; ユーザーキャッシュを無効にします。/が/にマップされることになり
    ;; ます。
    :disable-cache |

    ;; 1つのマッピングを(入力指示子 出力指示子)として追加します。
    (DIRECTORY-DESIGNATOR DIRECTORY-DESIGNATOR)

    ;; 1つのマッピングを追加します。入力パスの変換は関数で行われます。
    (DIRECTORY-DESIGNATOR (:function TRANSLATION-FUNCTION))

DIRECTORY-DESIGNATOR :=
    NIL | ; 入力に指定した場合: このエントリをスキップします。
          ; 出力に指定した場合: 入力されたパス名を同じパス名にマップします。
    T | ; 入力に指定した場合: あらゆる入力パスに対応します。
        ; 出力に指定した場合: 入力されたパス名を同じパス名にマップします。
    ABSOLUTE-COMPONENT-DESIGNATOR ; → ソースレジストリを設定するDSL

TRANSLATION-FUNCTION :=
    ;; 入力パスを出力パスに変換する関数です。この関数は2つの引数を取
    ;; り、1つ目は変換するべきパス名であり、2つ目は入力に指定した
    ;; DIRECTORY-DESIGNATOR(から導出されたワイルドカードを含むパス名)
    ;; です。
    SYMBOL |
    LAMBDA

ABSOLUTE-COMPONENT-DESIGNATORの末尾のコンポーネントがパス名でない場合、/**/*.*が加わっているものとみなされます。末尾のコンポーネントにパス名を使うと、#p"some/path/**/foo*/bar-*.fasl"のようにより細かいパターンを指定することができます。(→ ソースレジストリを設定するDSL

#+フィーチャーのようなフィーチャー表現も設定ファイル中で使うことが出来ます。

入力指示子がtである場合、すべてのパスにマッチします。入力指示子が:rootから始まる場合、すべてのホストとデバイスにマッチします。いずれの場合も(出力指示子がtでなく:rootから始まるのでもなければ)apply-output-translationsで入力パスが変換される際に、出力指示子のホストとデバイスが入力パスにマージされることになります。

出力指示子がt(またはnil)である場合、マッピングは恒等写像であり、入力パスがそのまま出力パスになります。

出力指示子が:rootから始まる場合、マッピングは入力パスのホストとデバイスを保持します。ファイルが存在するディレクトリのサブディクレトリにマッピングしたい場合にはこの機能を使って実現できますが、旧来の構文は次のようにやや複雑なものでした。

#.(let ((wild-subdir
          (make-pathname :directory '(:relative :wild-inferiors)))
        (wild-file
          (make-pathname :name :wild :version :wild :type :wild)))
   `((:root ,wild-subdir ,wild-file)
     (:root ,wild-subdir :implementation ,wild-file)))

しかし、ASDF 2.011.4からは次のように簡単に書けるようになりました。49

(:root (:root :**/ :implementation :*.*.*))

また、ASDF-Binary-Locationsを使いたい方は、enable-asdf-binary-locations-compatibility:centralize-lisp-binaries nilオプションで呼び出しても内部では同じ動作をすることになります。(→ 後方互換性のための機能(アウトプットトランスレーション)

:includeディレクティブでインクルードされる設定ファイル、設定ディレクトリについては再帰的に処理が適用されることになります。

入力パスから出力パスへの変換はcl:translate-pathname(をポータブルにラップしたuiop:translate-pathname*)で行われますが、望む変換ができない場合は、ユーザーは自ら変換アルゴリズムを書いて関数として指定することも出来ます。このような関数は出力指示子で:functionキーワードの後に指定します。関数を指すシンボルでも、ラムダ式でもかまいません。この関数は2つの引数を取り、変換されたパス名を返さなければなりません。1つ目の引数は入力ファイルのパス名であり、2つ目は入力指示子(から導出されたワイルドカードを含むパス名)です。

:inherit-configurationは次の設定について再帰的に処理を適用します。次の設定とは、アウトプットトランスレーションの設定のリストにおいて下で処理される設定のことです。

ユーザーキャッシュに関するディレクティブは以下の通りです:


Footnotes

(48)

[訳注] 継承した設定(inherited configuration)とは、アウトプットトランスレーションの一連の設定において、で処理される設定を指します。:ignore-inherited-configurationの指定があると、アウトプットトランスレーションの設定がそこで終わることになります。

(49)

[訳注] 入力指示子の:root(:root :**/ :*.*.*)の略であり、すべてのホスト、デバイスのすべてのファイルにマッチします。このマッピングが適用されると、例えば#P"C:/Users/foo/common-lisp/bar.lisp"#P"C:/Users/foo/common-lisp/sbcl-1.4.2-win-x64/bar.lisp"などに変換されます。

(50)

[訳注] asdf:*user-cache*はデフォルトでは(uiop:xdg-cache-home "common-lisp" :implementation)にセットされます。(→ XDGベースディレクトリ