跳转至内容

Lisp 包指南

来自 ArchWiki
Arch 软件包指南

32位CLRCMake交叉编译DKMSEclipseElectron字体Free PascalGNOMEGoHaskellJavaKDE内核模块LispMesonMinGWNode.js非自由OCamlPerlPHPPythonRRubyRust - 安全ShellVCSWebWine

目前,Arch 仓库中可用的 Lisp 包相对较少。这意味着在某个时候,可能会出现更多。因此,在包还很少的时候,弄清楚它们应该如何打包是有益的。

目录结构和命名

基础仓库中至少有一个包(libgpg-error)包含 lisp 文件,这些文件被放置在 /usr/share/common-lisp/source/gpg-error。与此保持一致,其他 lisp 包也应该将它们的文件放置在 /usr/share/common-lisp/source/pkgname

包目录应该是 lisp 包的名称,而不是它在 Arch 官方仓库(或 AUR)中的名称。这同样适用于单文件包。

例如,一个名为 "cl-ppcre" 的 Lisp 包在 AUR 中应该称为 cl-ppcre,并存放在 /usr/share/common-lisp/source/cl-ppcre。一个名为 "alexandria" 的 Lisp 包在 AUR 中应该称为 cl-alexandria,并存放在 /usr/share/common-lisp/source/alexandria

ASDF

尽量避免使用 Lisp 的 ASDF-Install 作为将这些包安装到系统范围的方式。

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 特定的是合适的。

如果包是实现无关的,它应该依赖于 common-lisp。如果包支持多个但不全部实现,你可以(a)不让你的包依赖于*任何* lisp,并在 package.install 文件中包含一个声明,告知用户确保他们安装了受支持的 lisp(不理想),或者(b)借鉴 sbcl PKGBUILD 的方向,包含一个条件语句来确定需要哪个 lisp(这是 hacky 的,再次,远非理想)。欢迎其他想法。

另请注意,如果 ASDF 是安装/编译/加载包所必需的,那么在依赖关系方面可能会变得棘手。SBCL 和 CMUCL 自带 asdf,但 clisp 没有(但有一个 AUR 包)。

目前维护非必需 lisp 特定包的人员应该考虑至少执行以下一项操作:

  • 编辑他们的 PKGBUILDs 以实现跨平台,前提是其他人尚未为不同的 lisp 维护相同的包。
  • 主动接管维护或协助为不同 lisp 维护相同的包,然后将它们合并到一个包中。
  • 将他们的包提供给相同包的不同 lisp 版本的维护者,以便该人员可以将它们合并到一个包中。

作为读者的你可以做些什么

  • 遵循这些指南维护 Lisp 包
  • 更新并修复这些指南中的问题
  • 跟上这里的变化
  • 就本文件以及人们的工作提供(礼貌的)想法、反馈和建议。
  • 将此页面和本页面的未来更新翻译成中文。

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.