Lisp パッケージガイドライン

提供: ArchWiki
2016年11月10日 (木) 00:03時点におけるKusakata (トーク | 投稿記録)による版 (翻訳)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

現時点では、Arch のリポジトリに入っている Lisp のパッケージは比較的少数しかありません。つまり、今後パッケージを作成する余地が大いにあるということです。パッケージの数は少なくても、パッケージを作成する方法を知ることは役に立ちます。

ディレクトリの構造と命名

ベースリポジトリに入っているパッケージ (libgpg-error) は Lisp ファイルを /usr/share/common-lisp/source/gpg-error に配置しています。これに従って、他のパッケージでも Lisp ファイルは /usr/share/common-lisp/source/pkgname に配置してください。

パッケージディレクトリは Arch リポジトリAUR での呼称でなく Lisp パッケージの名前にしてください。このことはファイルがひとつしかないパッケージにも適用されます。

例えば、"cl-ppcre" という名前の Lisp パッケージは AUR でも cl-ppcre という名前で /usr/share/common-lisp/source/cl-ppcre に配置されます。"alexandria" という名前の Lisp パッケージで AUR での名前が cl-alexandria だったときは Lisp パッケージにあわせて /usr/share/common-lisp/source/alexandria に配置します。

ASDF

ASDF-Install を使用してシステム全体にパッケージをインストールするのは避けてください。

ASDF 自体はパッケージのコンパイル・ロードをするときに必須あるいは役に立つツールです。ASDF を使用する際は、中央レジストリ (*.asd のシンボリックリンクが全て置かれる場所) のディレクトリを使用することが推奨されています (/usr/share/common-lisp/systems/)。

しかしながら、パッケージの作成において asdf を使ってコンパイルを実行すると問題が発生します。ただし以下のような package.install ファイルを使用することでインストールすることができます:

cl-ppcre.install
# arg 1:  the new package version
post_install() {
    echo "---> Compiling lisp files <---"

    clisp --silent -norc -x \
        "(load #p\"/usr/share/common-lisp/source/asdf/asdf\") \
        (pushnew #p\"/usr/share/common-lisp/systems/\" asdf:*central-registry* :test #'equal) \
        (asdf:operate 'asdf:compile-op 'cl-ppcre)"

    echo "---> Done compiling lisp files <---"

    cat << EOM

    To load this library, load asdf and then place the following lines
    in your ~/.clisprc.lisp file:

    (push #p"/usr/share/common-lisp/systems/" asdf:*central-registry*)
    (asdf:operate 'asdf:load-op 'cl-ppcre)
EOM
}

post_upgrade() {
    post_install $1
}

pre_remove() {
    rm /usr/share/common-lisp/source/cl-ppcre/{*.fas,*.lib}
}

op=$1
shift

$op $*

もちろん、上記のファイルを使うには、asdf のシステムディレクトリに package.asd のシンボリックリンクが必要です。パッケージのコンパイル時に、以下のような操作をすることでシンボリックリンクを作成できます:

pushd ${_lispdir}/systems
ln -s ../source/cl-ppcre/cl-ppcre.asd .
ln -s ../source/cl-ppcre/cl-ppcre-test.asd .
popd

$_lispdir$pkgdir/usr/share/common-lisp に置き換えてください。絶対パスではなく相対パスでリンクすることで、インストール後にリンクが壊れてしまうことを防いでいます。

特定の Lisp に依存するパッケージ

できるかぎり、特定の Lisp 実装に依存するパッケージは作成しないでください。クロスプラットフォームで動作するようにしてください。ただし、パッケージ自体が特定の Lisp 実装にあわせて開発されていた場合 (開発者が他のプラットフォームをサポートを考えていなかったり、他の Lisp 実装には元から備わっている機能を追加する場合など)、Arch のパッケージを lisp に依存させるのが適当です。

パッケージを実装に依存させずに、全ての実装 (SBCL, cmucl, clisp) のパッケージが PKGBUILDcommon-lisp フィールドでビルドできるのが利用です。しかし、理想と現実は違います (そしてユーザーが複数の Lisp を使用している場合に問題が発生するでしょう)。また、あらゆる Lisp に依存するパッケージを作成することはできません。package.install ファイルで Lisp をインストールするようにメッセージを出すか、あるいは sbcl の PKGBUILD に焦点をあわせてどの Lisp が必要なのか確認する条件文を書くしかありません。どちらからも理想からは遠く、他にアイデアがあれば歓迎します。

パッケージのインストール・コンパイル・ロードに ASDF が必要な場合、事態はさらに厄介になります。SBCL には asdf が付属していますが、clisp では AUR のパッケージでインストールする必要があります (CMUCL についてはよく知りません)。

特定の Lisp 限定のパッケージをメンテナンスしていて、そのパッケージを特定の Lisp 実装に依存させる必要がない場合、以下のどれかができないか考慮してください:

  • PKGBUILD を編集してクロスプラットフォームにする。他の Lisp で同じパッケージを誰もメンテナンスしていない場合。
  • 別の Lisp 実装による同じパッケージのメンテナンスを手助け・交代できないか交渉して、パッケージをひとつにまとめる。
  • 別の Lisp 版の同一パッケージのメンテナにパッケージを譲り渡して、ひとつのパッケージにまとめられるようにする。

(このドキュメントを書いた joyfulgirl は現在 cl-ppcre と stumpwm の clisp バージョンをメンテナンスしています。SBCL バージョンのメンテナによろこんでパッケージを渡しますし、メンテナがそれを望まない場合、新しいクロスプラットフォームのパッケージが作られることを待望します)。

読者ができること

  • 上記のガイドラインに従って Lisp パッケージをメンテナンスをすること。
  • ガイドラインにあわせてアップデートしたり問題を解決すること。
  • 何か変更があったらそれに追従すること。
  • ドキュメントやメンテナンス作業について意見・提案すること。
  • このページを翻訳して更新すること。