Lisp 包指南

来自 ArchWiki
Arch 软件包指南

32 位CLRCMake交叉编译DKMSEclipse 插件Electron字体Free PascalGNOMEGoHaskellJavaKDE内核模块LispMesonMinGWNode.js非自由软件OCamlPerlPHPPythonRRubyRust - 安全ShellVCSWeb 应用程序Wine

目前,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(这是hackish的,并且同样远非理想)。欢迎其他想法。

另请注意,如果需要 ASDF 来安装/编译/加载软件包,则在依赖关系方面可能会变得很尴尬。SBCL 和 CMUCL 都安装了 asdf,但 clisp 没有(但有一个 AUR 软件包)。

目前维护不需要 lisp 特定的 lisp 软件包的人员应考虑至少执行以下操作之一

  • 编辑他们的 PKGBUILD 以实现跨平台,前提是没有其他人已经在为不同的 lisp 维护相同的软件包。
  • 主动接管或帮助维护针对不同 lisp 的相同软件包,然后将它们合并为一个软件包。
  • 将他们的软件包提供给不同 lisp 版本的相同软件包的维护者,以便允许该人员将它们合并为一个软件包。

您可以做的事情

  • 遵循这些指南维护 Lisp 软件包
  • 更新和修复这些指南中的问题
  • 关注此处的变化
  • 对本文档和人们的工作提供(礼貌的)想法、反馈和建议。
  • 翻译此页面和此页面的未来更新。