Lisp 包指南
32 位 – CLR – CMake – 交叉编译 – DKMS – Eclipse 插件 – Electron – 字体 – Free Pascal – GNOME – Go – Haskell – Java – KDE – 内核模块 – Lisp – Meson – MinGW – Node.js – 非自由软件 – OCaml – Perl – PHP – Python – R – Ruby – Rust - 安全 – Shell – VCS – Web 应用程序 – 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 软件包
- 更新和修复这些指南中的问题
- 关注此处的变化
- 对本文档和人们的工作提供(礼貌的)想法、反馈和建议。
- 翻译此页面和此页面的未来更新。