Empaquetado de adjuntos para GNU Emacs
Propósito
El propósito de este documento es promover las buenas prácticas en el empaquetado de complementos para GNU Emacs y fomentar el envío de más paquetes de complementos de Emacs a la colección de paquetes, proporcionando plantillas de archivos spec fáciles de usar.
Notas importantes en estas Directrices
Las pautas en las siguientes secciones hacen un uso extensivo de las macros definidas en /usr/lib/rpm/macros.d/macros.emacs lo cal es instalado con el paquete emacs-common.
Hay dos casos distintos en los que es necesario tener en cuenta estas directrices:
-
Este caso se refiere a la situación en la que el propósito principal de un paquete es proporcionar funcionalidad adicional para Emacs, y dicho paquete no cumple ninguna función sin la presencia de Emacs. Un ejemplo de este caso es el lector de correo de VM, tal como se incluye en
emacs-vm. En adelante, lo denominaremos Caso I. -
Este caso se refiere a la situación en la que la funcionalidad principal de un paquete no requiere Emacs, pero el paquete también incluye archivos Elisp auxiliares para proporcionar soporte en Emacs. En adelante, lo denominaremos Caso II.
Nombre de paquetes y organización de subpaquetes
Caso I
Cuando un paquete es principalmente un complemento para Emacs, el paquete principal debería invocarse emacs-foo.
Caso II
Donde la funcionalidad principal de un paquete no requiere Emacs, pero el paquete también incluye algunos archivos Elisp auxiliares para proporcionar asistencia para el paquete en Emacs, estos seríen incluidos dentro del paquete principal el cual necesitará un Require en el paquete emacs-filesystem. Más detalle a continuación.
Contenido del paquete
Localizaciones del archivo
Las localizaciones del archivo para los (sub-)paquetes del complemento de GNU Emacs:
-
Todo los elisp y los archivos relacionados para el paquete serían instalados dentro del directorio
%{_emacs_sitelispdir}/foo. -
Si el paquete requiere un archivo de arranque este sería llamado
foo-init.ely estaría situado en%{_emacs_sitestartdir}.
Requisitos de Paquete
Paquete BuildRequires
Paquete BuildRequires para paquetes adjuntos de GNU Emacs:
-
En general sería suficiente tener
BuildRequires: emacs-nw
Compilación manual de byte
Normalmente, la compilación de paquetes Elisp se realiza mediante un archivo make incluido en el paquete, pero en ocasiones puede ser necesario añadir comandos a la sección %build del archivo de especificaciones para compilar archivos. En ese caso, utilice %{_emacs_bytecompile} file.el
Es un requisito que todos los archivos Elisp estén compilados y empaquetados en bytes, a menos que exista una buena razón para no hacerlo, en cuyo caso esto debe documentarse con un comentario en el archivo de especificaciones.
Uso de BuildArch: noarch
Si un paquete adjunto requiere solo compilación de byte de elisp entonces BuildArch: noarch sería utilizado. Esto es altamente improbable para incluso aplicar a Caso II.
Ejemplo específico de plantillas de archivo
Plantilla para un paquete adjunto para GNU Emacs (Caso I)
Esta es una plantilla para un paquete de GNU Emacs. El paquete principal se llama emacs-foo y contiene todos los archivos necesarios para ejecutar el paquete foo con GNU Emacs. Esto incluye los archivos compilados y los archivos origen de elisp.
%global pkg foo
%global pkgname Foo
Nombre: emacs-%{pkg}
Versión:
Liberación: %autorelease
Resumen:
Grupo:
Licencia:
URL:
Origen0:
BuildArch: noarch
BuildRequires: emacs-nw
Requires: emacs(bin)%{?_emacs_version: >= %{_emacs_version}}
%description
%{pkgname} es un paquete adjunto para GNU Emacs. Hace cosas maravillosas…
%prep
%autosetup -n %{pkg}-%{version}
%build
%install
%post
%preun
%files
%doc
%{_emacs_sitelispdir}/%{pkg}
%{_emacs_sitestartdir}/*.el
%changelog
%autochangelog
Plantilla para un paquete el cual contenga archivos auxiliares de GNU Emacs (Caso II)
Esto es un esqueleto de un paquete el cual además incluye archivos de mantenimiento para GNU Emacs
Nombre: foo
Versión:
Lanzamiento: %autorelease
Sumario:
Grupo:
Licencia:
URL:
Origen0:
BuildRequires: emacs-nw
Requires: emacs-filesystem%{?_emacs_version: >= %{_emacs_version}}
%description
Foo es un paquete el cual contiene archivos de soporte Emacs auxiliares.
%prep
%autosetup
%build
%install
%post
%preun
%files
%doc
%{_emacs_sitelispdir}/foo
%{_emacs_sitestartdir}/*.el
%changelog
%autochangelog
Principios detrás de las directrices
Lugar de los archivos instalados
Los archivos del paquete complementario foo deben colocarse en %{_emacs_sitelispdir}/foo lo cual evalúa a /usr/share/emacs/site-lisp/foo.
Usualmente un paquete de complemento requerirá un archivo startup, y esto sería invocado foo-init.el y sería situado en %{_emacs_sitestartdir} lo cuál evalúa a /usr/acción/emacs/sitio-lisp/sitio-inicio.d/.
Empaquetado de archivos fuentes de elisp
Típicamente, un paquete de complemento de Emacs estará compilado desde los archivos fuente elisp. El elisp resultante compilado de archivos entonces serán incluidos en el paquete pertinentes emacs-foo. Es importante a también incluir el paquete fuente de elisp para varias razones. Por ejemplo cuando depure un problema con un paquete Emacs, el depurador Elisp puede encontrar del código pertinente o definición del símbolo en el archivo lisp fuente si está presente. También, a veces es útil ir a una descripción variable de cadena del sistema de ayuda en Emacs.
BuildArch para complemento de paquetes de Emacs
Tendrías que poner BuildArch: noarch para los complementos del paquetes solo compilan archivos elisp durante la construcción.
Si el proceso de construcción del paquete además compila programas en otros lenguajes, puede necesitar no poner BuildArch.
Requieren para GNU Emacs
Paquetes adjuntados tendrían apuntes Requieres apropiados para el la versión de Emacs destinados. GNU Emacs está disponible en múltiples paquetes – algunos detalles de estos paquetes a continuación.
-
El paquete
emacses compilado con asistencia GTK pura para conceder al usuario ejecutar Emacs en un entorno con ventana. -
El paquete
emacs-gtk+x11está compilado con asistencia X11 a través del toolkit de GTK para conceder al usuario ejecutar Emacs dentro de un entorno con ventana. -
El paquete
emacs-lucides compilado con asistencia X11 a través del toolkit Lucid para conceder al usuario ejecutar Emacs en un entorno con ventana. -
El paquete
emacs-nwes compilado sin asistencia de IGU. Es apropiado para ejecutar en un terminal.
Nota:
-
Todos los paquetes
emacs,emacs-gtk+x11,emacs-lucid, yemacs-nwtienen Requisitos: emacs-common. -
Todos los paquetes emacs,
emacs-gtk+x11,emacs-lucid, yemacs-nwtienen un Provides:emacs(bin)virtual.
Asumiendo vuestro complemento el paquete funcionará en ambos un windowed y una consola Emacs sesión, es incorrecto tener Requires: emacs como eso atraería una dependencia en GTK incluso si la variante de consola Emacs está instalada. Bastante tendrías que utilizar Requires: emacs(bin) para complemento GNU Emacs paquetes.
Si el paquete SOLO funciona con mantenimiento GTK compilado en Emacs, entonces el paquete tendía Requires: emacs. Esto es muy poco común.
Por qué necesitamos Requires con versiones
Muchos paquetes elisp buscan la compatibilidad con versiones anteriores del código fuente comprobando si existen ciertas características en el Emacs en uso durante la ejecución o la compilación. En caso afirmativo, utilizan lo disponible. En caso negativo, proporcionan sus propias versiones de funciones, macros, etc., que faltan. Esto se propaga a *.elc durante la compilación, y se añaden bastantes funciones entre versiones originales de Emacs.
Digamos que compilación por byte de un paquete en *.elc con Emacs 29.3. El paquete Elisp quux comprueba si la función foo-bar está disponible en el Emacs que se usa para compilarlo. Sí, lo está, por lo que la versión interna de retrocompatibilidad de foo-bar incluida en quux no termina en *.elc. Ahora, supongamos que foo-bar se añadió en Emacs 29.3 y no existía en 29.2, y estamos intentando ejecutar *.elc con 29.2 → ¡zas!, foo-bar no está disponible. Nota: esto no ocurriría si solo se hubiera incluido *.el; *.elc es el problema potencial y probable. Exigir una versión >= del Emacs utilizado para compilar en bytes el *.elc no es la única solución (ni suficiente para todos los casos especiales), pero es la mejor que tenemos disponible actualmente.
El paquete principal y los subpaquetes deberán tener la versión Requires correctamente versionada para garantizar que se instale una versión reciente de Emacs. El paquete Lisp compilado por bytes de Emacs suele ser compatible con versiones posteriores de Emacs, pero con frecuencia no es compatible con versiones anteriores.
Determinación de la versión de Emacs Required en tiempo de compilación del paquete
Está recomendado para derivar dependencias mayores-que-o-igual-que valuadas desde la versión de Emacs utilizadas para compilar-byte el paquete en tiempo de creación del paquete. El paquete emacs-common incluye /usr/lib/rpm/macros.d/macros.emacs lo cual define una macro %{_emacs_versión} que contenga la versión de Emacs instalado.
Otros paquetes conteniendo adjuntos Emacs en adjuntos (Caso II)
Es frecuente que un paquete de software, aunque no sea principalmente un complemento de Emacs, contenga componentes para Emacs. Por ejemplo, el programa Gnuplot contiene archivos elisp para editar archivos de entrada de Gnuplot en GNU Emacs y ejecutar Gnuplot desde GNU Emacs. En este caso, queremos habilitar la compatibilidad con Emacs si Emacs está instalado, pero no queremos obligar a su instalación al instalar este paquete, ya que Emacs no es necesario para proporcionar la funcionalidad principal del paquete. Para ello, se creó el subpaquete emacs-filesystem, que contiene el directorio /usr/share/emacs/site-lisp. Un paquete puede entonces requerir el paquete emacs-filesystem para instalar sus archivos Elisp sin tener que instalar Emacs ni su cadena de dependencias.
Want to help? Learn how to contribute to Fedora Docs ›