Paketierung von Add-Ons für GNU Emacs
Zweck
Ziel dieses Dokuments ist es, bewährte Verfahren beim Paketieren von Add-ons für GNU Emacs zu fördern und die Einreichung weiterer Emacs-Add-on-Pakete zur Paketsammlung durch die Bereitstellung einfach zu verwendender Spec-Datei-Vorlagen zu unterstützen.
Wichtige Anmerkungen zu diesen Richtlinien
Die Richtlinien in den folgenden Abschnitten nutzen ausgiebig die in /usr/lib/rpm/macros.d/macros.emacs definierten Makros, die mit dem Paket emacs-common installiert werden.
Es gibt zwei unterschiedliche Fälle, in denen die Berücksichtigung dieser Richtlinien erforderlich ist:
-
Der erste Fall beschreibt eine Situation, in der ein Paket primär dazu dient, Emacs zusätzliche Funktionen bereitzustellen, und ohne Emacs nutzlos ist. Ein Beispiel hierfür ist der E-Mail-Reader für virtuelle Maschinen, der im Paket
emacs-vmenthalten ist. Im Folgenden bezeichnen wir dies als Fall 1. -
Der zweite Fall beschreibt die Situation, in der die Hauptfunktionalität eines Pakets Emacs nicht erfordert, das Paket aber zusätzlich einige Elisp-Dateien enthält, um die Unterstützung des Pakets in Emacs zu gewährleisten. Im Folgenden bezeichnen wir dies als Fall 2.
Benennung von Paketen und Organisieren der Teilpakete
Paketinhalt
Dateiorte
Dateispeicherorte für GNU Emacs Add-on-(Teil-)Pakete:
-
Alle Elisp- und zugehörigen Dateien für das Paket sollten im Verzeichnis
%{_emacs_sitelispdir}/fooinstalliert werden. -
Falls das Paket eine Startdatei benötigt, sollte diese
foo-init.elheißen und in%{_emacs_sitestartdir}abgelegt werden.
„Requires“ des Pakets
„BuildRequires“ des Pakets
BuildRequires für GNU Emacs add-on-Pakete:
-
Im Allgemeinen sollte es ausreichen,
BuildRequires: emacs-nwanzugeben
Manuelle Byte-Kompilierung
Die Elisp-Kompilierung eines Pakets erfolgt üblicherweise über ein mitgeliefertes Makefile. Gelegentlich kann es jedoch erforderlich sein, dem %build-Abschnitt der Spec-Datei Befehle zur Byte-Kompilierung hinzuzufügen. Verwenden Sie in diesem Fall %{_emacs_bytecompile} file.el.
Alle Elisp-Dateien müssen bytekompiliert und paketiert werden, es sei denn, es gibt einen triftigen Grund, dies nicht zu tun. In diesem Fall sollte dies mit einem Kommentar in der Spec-Datei dokumentiert werden.
Verwendung von „BuildArch: noarch“
Wenn ein Add-on-Paket lediglich die Byte-Kompilierung von Elisp erfordert, sollte BuildArch: noarch verwendet werden. Dies dürfte im Fall 2 höchstwahrscheinlich nie zutreffen.
Beispielvorlage für eine Spec-Datei
Vorlage für ein Add-on-Paket für GNU Emacs (Fall 1)
Dies ist eine Vorlage für ein Paket für GNU Emacs. Das Hauptpaket heißt emacs-foo und enthält alle Dateien, die zum Ausführen des Pakets foo mit GNU Emacs benötigt werden. Dazu gehören sowohl kompilierte Elisp-Dateien als auch Elisp-Quelldateien.
%global pkg foo
%global pkgname Foo
Name: emacs-%{pkg}
Version:
Release: %autorelease
Summary:
Group:
License:
URL:
Source0:
BuildArch: noarch
BuildRequires: emacs-nw
Requires: emacs(bin)%{?_emacs_version: >= %{_emacs_version}}
%description
%{pkgname} is an add-on package for GNU Emacs. It does wonderful things...
%prep
%autosetup -n %{pkg}-%{version}
%build
%install
%post
%preun
%files
%doc
%{_emacs_sitelispdir}/%{pkg}
%{_emacs_sitestartdir}/*.el
%changelog
%autochangelog
Vorlage für ein Paket, das Hilfsdateien für GNU Emacs enthält (Fall 2)
Dies ist ein Grundgerüst eines Pakets, das auch Unterstützungsdateien für GNU Emacs enthält:
Name: foo
Version:
Release: %autorelease
Summary:
Group:
License:
URL:
Source0:
BuildRequires: emacs-nw
Requires: emacs-filesystem%{?_emacs_version: >= %{_emacs_version}}
%description
Foo is a package which contains auxiliary Emacs support files.
%prep
%autosetup
%build
%install
%post
%preun
%files
%doc
%{_emacs_sitelispdir}/foo
%{_emacs_sitestartdir}/*.el
%changelog
%autochangelog
Prinzipien hinter den Richtlinien
Ort der installierten Dateien
Die Dateien für das Add-on-Paket foo sollten in %{_emacs_sitelispdir}/foo abgelegt werden, was zu /usr/share/emacs/site-lisp/foo aufgelöst wird.
Normalerweise benötigt ein Add-on-Paket eine Startdatei, die foo-init.el heißen und in %{_emacs_sitestartdir} abgelegt werden sollte, was zu /usr/share/emacs/site-lisp/site-start.d/ aufgelöst wird.
Paketierung von Elisp-Quelldateien
Ein Emacs-Add-on-Paket wird üblicherweise aus Elisp-Quelldateien kompiliert. Die kompilierten Elisp-Dateien werden dann dem entsprechenden emacs-foo-Paket beigefügt. Es ist aus mehreren Gründen wichtig, auch die Elisp-Quelldateien einzubinden. Beispielsweise kann der Elisp-Debugger beim Debuggen eines Problems mit einem Emacs-Paket in der Quelldatei nach dem relevanten Code oder der Symboldefinition suchen, sofern diese vorhanden ist. Außerdem ist es manchmal hilfreich, direkt zu einer Variablenbeschreibung aus der Emacs-Hilfe zu springen.
BuildArch für Emacs add-on-Pakete
Sie sollten BuildArch: noarch für Add-on-Pakete festlegen, die während des Bauprozesses nur Elisp-Dateien kompilieren.
Falls der Paketbauprozess auch Programme in anderen Sprachen kompiliert, müssen Sie möglicherweise BuildArch nicht festlegen.
„Requires“ für GNU Emacs
Add-on-Pakete sollten die entsprechenden Requires-Einträge für die jeweilige Emacs-Variante enthalten. GNU Emacs ist in mehreren Paketen verfügbar – einige Details zu diesen Paketen folgen.
-
Das Paket
emacswurde mit reiner GTK-Unterstützung entwickelt, um dem Benutzer die Ausführung von Emacs in einer Fensterumgebung zu ermöglichen. -
Das Paket
emacs-gtk+x11wurde mit X11-Unterstützung über das GTK-Toolkit erstellt, um dem Benutzer die Ausführung von Emacs in einer Fensterumgebung zu ermöglichen. -
Das Paket
emacs-lucidwurde mit X11-Unterstützung über das Lucid-Toolkit erstellt, um dem Benutzer die Ausführung von Emacs in einer Fensterumgebung zu ermöglichen. -
Das Paket
emacs-nwwurde ohne GUI-Unterstützung erstellt. Es eignet sich zur Ausführung im Terminal.
Hinweis:
-
Die Pakete
emacs,emacs-gtk+x11,emacs-lucidundemacs-nwpackages müssen alle „Requires: emacs-common“ einbinden. -
Die Pakete emacs,
emacs-gtk+x11,emacs-lucidundemacs-nwverfügen alle über ein virtuelles „Provides“:emacs(bin).
Angenommen, Ihr Add-on-Paket funktioniert sowohl in einer Fenster- als auch in einer Konsolen-Emacs-Sitzung, ist die Angabe Requires: emacs falsch, da dadurch eine Abhängigkeit von GTK entsteht, selbst wenn die Konsolenversion von Emacs installiert ist. Verwenden Sie stattdessen für GNU-Emacs-Add-on-Pakete Requires: `emacs(bin).
Wenn das Paket NUR mit der in Emacs integrierten GTK-Unterstützung funktioniert, sollte es die Zeile Requires: emacs enthalten. Dies ist äußerst unüblich.
Warum wir versionierte „Requires“ brauchen
Viele Elisp-Pakete streben Abwärtskompatibilität auf Quellcodeebene an, indem sie prüfen, ob bestimmte Funktionen in der verwendeten Emacs-Version vorhanden sind, wenn das Paket ausgeführt oder bytekompiliert wird. Falls ja, verwenden sie die verfügbaren Funktionen. Falls nein, stellen sie eigene Versionen der fehlenden Funktionen, Makros usw. bereit. Dies wird während der Bytekompilierung in die *.elc-Dateien übernommen, und zwischen den offiziellen Emacs-Veröffentlichungen werden regelmäßig neue Funktionen hinzugefügt.
Nehmen wir an, ich byte-kompiliere ein Paket mit Emacs 29.3 in *.elc. Das Elisp-Paket quux prüft, ob die Funktion foo-bar in der verwendeten Emacs-Version verfügbar ist. Sie ist verfügbar, daher landet die interne, abwärtskompatible Version von foo-bar, die in quux enthalten ist, nicht in *.elc. Angenommen, foo-bar wurde in Emacs 29.3 hinzugefügt und existierte in 29.2 nicht, und wir versuchen, *.elc mit 29.2 auszuführen – dann ist foo-bar nicht verfügbar. Hinweis: Dies würde nicht passieren, wenn nur *.el ausgeliefert würden – *.elc sind die potenzielle und wahrscheinliche Fehlerquelle. Die Anforderung, dass die Emacs-Version >= für die Byte-Kompilierung der *.elc verwendet wird, ist nicht die einzige Lösung (und auch nicht ausreichend für alle Sonderfälle), aber die beste, die uns derzeit zur Verfügung steht.
Das Hauptpaket und seine Teilpakete benötigen entsprechend versionierte Abhängigkeiten (Requires), um sicherzustellen, dass eine hinreichend aktuelle Version von Emacs installiert wird. Byte-kompiliertes Lisp für Emacs ist in der Regel aufwärtskompatibel zu späteren Emacs-Versionen, jedoch häufig nicht zu älteren Versionen.
Ermittlung der erforderlichen Emacs-Version beim Erstellen des Pakets
Es wird empfohlen, versionierte Abhängigkeiten mit Werten größer oder gleich der Emacs-Version abzuleiten, die zum Kompilieren des Pakets verwendet wurde. Das Paket emacs-common enthält /usr/lib/rpm/macros.d/macros.emacs, welches ein %{_emacs_version}-Makro definiert, das die installierte Emacs-Version enthält.
Andere Pakete, die Emacs-Add-ons enthalten (Fall 2)
Es kommt häufig vor, dass Softwarepakete, obwohl sie nicht primär als Emacs-Add-on gedacht sind, Komponenten für Emacs enthalten. Beispielsweise enthält das Programm Gnuplot einige Elisp-Dateien zum Bearbeiten von Gnuplot-Eingabedateien in GNU Emacs und zum Ausführen von Gnuplot aus GNU Emacs heraus. In diesem Fall möchten wir die Emacs-Unterstützung aktivieren, falls Emacs installiert ist. Wir möchten die Installation von Emacs jedoch nicht bei der Installation dieses Pakets erzwingen, da Emacs für die Kernfunktionalität des Pakets nicht erforderlich ist. Um dies zu ermöglichen, wurde das Teilpaket emacs-filesystem erstellt, das das Verzeichnis /usr/share/emacs/site-lisp verwaltet. Ein Paket kann dann das Paket emacs-filesystem über Requires einbinden, um seine Elisp-Dateien zu installieren, ohne Emacs und dessen Abhängigkeiten mit hereinzuziehen.
Want to help? Learn how to contribute to Fedora Docs ›