Paketbaurichtlinien für Lisp

Dieses Dokument beschreibt die Konventionen und Gepflogenheiten für die korrekte Paketierung von Common-Lisp-Implementierungen und -Bibliotheken in Fedora. Es beschreibt jedoch nicht Konventionen und Gepflogenheiten für Anwendungsprogramme, die in Common Lisp geschrieben sind.

Einführung

Die meisten Common-Lisp-Implementierungen stellen einen Compiler bereit, der eine eigene Binärdarstellung des Quellcodes erzeugt. Diese Binärdateien enden typischerweise auf .fasl (für Fast Load). Diese .fasl-Dateien sind nicht zwischen verschiedenen Common-Lisp-Implementierungen oder sogar zwischen verschiedenen Versionen derselben Implementierung kompatibel. Diese besondere Eigenschaft erfordert spezielle Unterstützung bei der Paketierung.

Die Common-Lisp-Community setzt aktuell auf eine gemeinsame Paketierungs- und Bereitstellungstechnologie namens asdf (Another System Definition Format). Projekte, die mit asdf bereitgestellt werden, enthalten eine Systemdefinitionsdatei. Diese Datei enthält Informationen zu Projektabhängigkeiten, Lizenzen und den Autoren. Projekte verteilen in der Regel keine Binärdateien, sondern nutzen die asdf-Dienstprogramme, um den Lisp-Quellcode bei Bedarf zu kompilieren. Wenn Sie ein Programm ausführen, das von einer von asdf verwalteten Bibliothek abhängt, kompiliert das asdf-System den abhängigen Lisp-Code automatisch und speichert die Ergebnisse im Cache.

Die Debian-Lisp-Community hat Werkzeuge und Richtlinien für die Paketierung und Wartung von asdf-verwalteten Bibliotheken auf Linux-Systemen entwickelt. Ihr Werkzeug heißt common-lisp-controller und stellt in Kombination mit asdf sicher, dass .fasl-Dateien im System korrekt verwaltet werden. Wird beispielsweise eine Common-Lisp-Implementierung aktualisiert, werden die .fasl-Dateien aller Pakete, die mit der alten Implementierung erstellt wurden, gelöscht, so dass bei Bedarf neue generiert werden können.

Der Rest dieser Paketbaurichtlinie beschreibt, wie Common-Lisp-Implementierungen, Bibliotheken und Programme paketiert werden können, um asdf und den common-lisp-controller optimal zu nutzen.

Richtlinien für Bibliotheken und Programme in Common Lisp

Benennung

Lisp-Bibliotheken sollten in ihren Paketnamen das Präfix „cl-“ haben, außer in dem Fall, dass der Bibliotheksname bereits mit „cl-“ beginnt.

Begründung: Es gibt Überschneidungen zwischen den Namen von Lisp-Bibliotheken und bestehenden Fedora-Paketen. Die Schaffung eines speziellen Namensraums für Lisp-Bibliotheken sollte die Arbeit für alle vereinfachen.

-devel-Teilpaket

Reine Lisp-Pakete erfordern keine -devel-Teilpakete, da sie standardmäßig den Quellcode mit installieren.

Verwendung von asdf

Bibliotheken sollten mit asdf verwaltet werden, einem Paketformat für Common-Lisp-Bibliotheken (siehe das Paket cl-asdf für Details). Die meisten modernen Lisp-Bibliotheken werden bereits mit asdf-Systemdefinitionsdateien ausgeliefert (deren Namen typischerweise auf „.asd“ enden). Falls keine vorhanden sind, muss eine erstellt werden. Der Inhalt dieser Dateien unterscheidet sich kaum von einer RPM-.spec-Datei, daher sollte dies für einen Lisp-erfahrenen Paketierer keine allzu große Herausforderung darstellen. Das ASDF-Handbuch, das die Erstellung von .asd-Dateien beschreibt, ist hier verfügbar.

Installationsort und Anschluss an common-lisp-controller

Die Bibliotheken sollten vom Paket common-lisp-controller abhängen. Der Lisp-Quellcode sollte in %{_datadir}/common-lisp/source/ installiert werden. Das Paket sollte Eigentümer dieses Verzeichnisses sein. Die übergeordneten Verzeichnisse gehören dem Paket common-lisp-controller. Ein symbolischer Link zur asdf-Systemdefinitionsdatei sollte von %{_datadir}/common-lisp/systems/.asd nach %{_datadir}/common-lisp/source//.asd erstellt werden (dieses Zielverzeichnis gehört ebenfalls dem Paket common-lisp-controller). Der Abschnitt %post sollte register-common-lisp-source aufrufen. Der Abschnitt %preun sollte unregister-common-lisp-source aufrufen. Diese Skripte werden vom Paket common-lisp-controller bereitgestellt.

Spec-Dateivorlage

Name:           # siehe allgemeine Paketbaurichtlinien
Version:        # siehe allgemeine Paketbaurichtlinien
Release:        1%{?dist}
Summary:        # siehe allgemeine Paketbaurichtlinien (SNPG)

Group:          # SNPG
License:        # SNPG
URL:            # SNPG
Source:         # SNPG
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildRequires:   common-lisp-controller
Requires:        common-lisp-controller
Requires(post):  common-lisp-controller
Requires(preun): common-lisp-controller

%description

%prep
%setup -q

%build

%install
# Ersetzen Sie @NAME@ unten durch den Namen der Common-Lisp-Bibliothek, der vom
# Paketnamen abweichen kann, falls dieser nicht bereits mit „cl-“ beginnt.

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
register-common-lisp-source @NAME@

%preun
unregister-common-lisp-source @NAME@

%files
%doc
%{_datadir}/common-lisp/source/@NAME@
%{_datadir}/common-lisp/systems/@NAME@.asd

%changelog

Richtlinien für Common-Lisp-Implementierungen

Benennung

Hier gelten keine besonderen Anforderungen. Common-Lisp-Implementierungen sollten unter ihrem normalen Projektnamen paketiert werden.

-devel-Teilpaket

Common-Lisp-Implementierungen benötigen keine -devel-Teilpakete und enthalten standardmäßig alle Entwicklungswerkzeuge.

Verwendung von asdf

Common-Lisp-Implementierungen sollten asdf laden können, indem sie einfach „(require 'asdf)“ in der Lisp-Lese-Auswertungs-Ausgabe-Schleife (REPL) eingeben. Dies kann Anpassungen der Suchpfade oder ähnliche Änderungen zur Kompilierzeit erfordern.

Installationsort und Anschluss an common-lisp-controller

Common-Lisp-Implementierungen sollten vom Paket common-lisp-controller abhängen.

Common-Lisp-Implementierungen sollten ein Skript in %{_libdir}/common-lisp/bin/.sh installieren, das den Befehl „install-clc“ in der Befehlszeile unterstützt. Dieses Skript lädt %{_datadir}/common-lisp/source/common-lisp-controller/common-lisp-controller.lisp, ruft (common-lisp-controller:init-common-lisp-controller-v4) auf und speichert das sich ergebende Abbild als Standard für das System.

Der Abschnitt %post sollte register-common-lisp-implementation aufrufen. Der Abschnitt %preun sollte unregister-common-lisp-implementation aufrufen.

Diese Skripte und das Verzeichnis %{_libdir}/common-lisp/bin werden vom Paket common-lisp-controller bereitgestellt und gehören diesem.

Alle Implementierungen sollten so angepasst werden, dass beim Start die Datei %{_sysconfdir}/lisp-config.lisp des common-lisp-controller geladen wird.

Weitere Informationen

Weitere Informationen zu common-lisp-controller und asdf finden Sie unter https://www.cliki.net/common-lisp-controller und https://common-lisp.net/project/asdf/.