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-controllerhttp://common-lisp.net/project/asdf/