openSUSE:打包 Lisp
Lisp 打包指南
本文档旨在记录在 openSUSE 发行版中正确打包 Common Lisp 实现和库的约定和习惯。本文档不描述用 Common Lisp 编写的应用程序程序的约定和习惯。
简介
大多数 Common Lisp 实现提供一个编译器来生成其源代码的二进制表示形式。这些二进制文件通常以 .fasl(代表快速加载)结尾。这些 .fasl 文件在 Common Lisp 实现之间不兼容,甚至在同一实现的不同的版本之间也不兼容。这种独特的属性需要在打包方面提供特殊支持。
Common Lisp 社区目前围绕一种称为 asdf(另一个系统定义格式)的通用打包和部署技术。使用 asdf 部署的项目包括一个系统定义文件。这些文件包含有关项目依赖项、许可和作者的信息。项目通常不分发二进制文件,而是依赖于 asdf 工具来按需编译 Lisp 源代码。当您运行依赖于由 asdf 管理的库的程序时,asdf 系统将自动按需编译依赖的 Lisp 代码并缓存结果。
Debian Lisp 社区已经开发了用于在 Linux 系统上打包和维护由 asdf 管理的库的工具和指南。他们的工具称为 common-lisp-controller,结合 asdf,它可以确保系统上正确管理 .fasl 文件。例如,当 Common Lisp 实现升级时,使用旧实现构建的所有包的 .fasl 文件都会被删除,以便可以按需生成新的文件。
本打包指南的其余部分旨在描述如何打包 Common Lisp 实现、库和程序,以利用 asdf 和 common-lisp-controller。
命名
Lisp 库的包名称应以“cl-”为前缀,除非库名称已经以“cl-”开头。
理由:Lisp 库名称与现有的 openSUSE 包之间存在一些重叠。为 Lisp 库创建一个特殊的命名空间应该简化每个人的生活。
-devel 子包
纯 Lisp 库不需要 -devel 子包,因为它们默认安装源代码。
使用 asdf
库应由 asdf 管理,asdf 是 Common Lisp 库的打包格式(有关详细信息,请参阅 cl-asdf 包)。大多数现代 Lisp 库已经附带 asdf 系统定义文件(文件名通常以“.asd”结尾)。如果不存在,则需要编写一个。这些文件的内容与 RPM .spec 文件不太一样,因此对于精通 Lisp 的打包人员来说不应该太难。
安装位置和与 common-lisp-controller 的关联
Common Lisp 实现应依赖 common-lisp-controller 包。
Common Lisp 实现应在 %{_libdir}/common-lisp/bin/<impl>.sh 中安装一个脚本,该脚本支持命令行上的单个命令:“install-clc”。这应该加载 %{_datadir}/common-lisp/source/common-lisp-controller/common-lisp-controller.lisp,调用 (common-lisp-controller:init-common-lisp-controller-v4 <implementation>) 然后将结果图像保存为系统的默认图像。
%post 部分应调用“%{_sbindir}/register-common-lisp-implementation <implementation>”。%preun 部分应调用“%{_sbindir}/unregister-common-lisp-implementation <implementation>”
这些脚本以及 %{_libdir}/common-lisp/bin 目录由 common-lisp-controller 包提供和拥有。
所有实现都应修改为在启动时加载 common-lisp-controller 的 %{_sysconfdir}/lisp-config.lisp。
示例 spec 文件
# # spec file for package <name_of_your_package> # # Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via http://bugs.opensuse.org/ Name: # see normal package guidelines Version: # see normal package guidelines Release: 1%{?dist} Summary: # see normal package guidelines (SNPG) Group: # SNPG License: # SNPG URL: # SNPG Source0: # SNPG BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %description %prep %setup -q %build %install # Replace @NAME@ below with the Common Lisp library name, which may be different from the package name if it is not already prefixed with "cl-". mkdir -m 755 -p %{buildroot}%{_datadir}/common-lisp/source/@NAME@ mkdir -m 755 -p %{buildroot}%{_datadir}/common-lisp/systems for s in *.lisp; do install -m 644 $s %{buildroot}%{_datadir}/common-lisp/source/@NAME@; done; for s in *.asd; do install -m 644 $s %{buildroot}%{_datadir}/common-lisp/source/@NAME@; done; cd %{buildroot}%{_datadir}/common-lisp/source/@NAME@ for asd in *.asd; do ln -s %{_datadir}/common-lisp/source/@NAME@/$asd ../../systems; done %post %preun %clean %{__rm} -rf %{buildroot} %files %doc %{_datadir}/common-lisp/source/@NAME@ %{_datadir}/common-lisp/systems/@NAME@.asd %changelog
更多阅读
有关 common-lisp-controller 和 asdf 的更多详细信息,请参阅 http://www.cliki.net/common-lisp-controller 和 http://common-lisp.net/project/asdf/。