title: "Emacs: Compilar Emacs en Linux Mint Vanessa"
date: 2023-07-26T11:24:41+0200
draft:
summary: "Apuntes para compilar Emacs 28 y Emacs 29 en Linux Mint Vanessa. Debería funcionar sin muchos cambios para cualquier versión de Emacs en cualquier linux de la familia Debian"
- [Building Emacs 28 on Ubuntu Linux](https://practical.li/blog/posts/build-emacs-28-on-ubuntu/) by Practicalli, la guia más completa que me he encontrado con diferencia.
- [The update-alternatives Command in Linux](https://www.baeldung.com/linux/update-alternatives-command) by Baeldung (también nos hará falta)
- [Installing Emacs 29.1 on Ubuntu 22.04 LTS](https://arnesonium.com/2023/07/emacs-29-1-on-ubuntu-22-04-lts)
{{</admonition>}}
Normalmente no me suelo complicar la vida compilando programas a menos que tenga unas ganas locas de probar algo y no haya más remedio, pero esta vez me dejé llevar.
Trás actualizar a Linux Mint 21 (Vanessa) decidí que ya era hora de probar Emacs con _native compilation_ así que instale Emacs 28.1 desde el [ppa de Kelleyk](https://launchpad.net/~kelleyk/+archive/ubuntu/emacs). La instalación no dió ningún problema pero al intentar configurar Emacs una de las primeras cosas que hice fué poner _straight.el_ en lugar de _Package_ y me dió el error:
`Symbol's function definition is void: gv-setter`
Y con este error falla totalmente la carga de mi fichero `init.el`.
El error puede comprobarse fácilmente con el comando: `emacs -q --eval "(require 'gv)"`
A la hora de ponerme a compilar estaba convencido de haber leido en internet que era un fallo del código en Emacs y que se corregía con la siguiente versión, pero a la hora de escribir esto ya no estoy tan seguro por que soy incapaz de encontrar la referencia.
En cualquier caso, decidí compilar Emacs 28.2 y estos son los pasos que seguí:
## Preparando el terreno
Ajustamos nuestras preferencias de paquetes en Linux Mint (por ejemplo abriendo _Synaptic_) de forma que estén activados los orígenes de las fuentes del software (___Source Code___). Si lo haces con _Synaptic_ se encargará de actualizar, de lo contrario asegurate de hacer un `sudo apt update` desde el terminal.
Instalamos las dependencias para la compilación con `sudo apt build-dep` pero también instalamos algunos programas a mayores:
Los paquetes adicionales son para aprovechar todas las características del nuevo Emacs con _native compilation_, son necesarias para aprovechar todas las mejoras del rendimiento de Emacs.
También tenemos que [descargar el código fuente de Emacs](https://www.gnu.org/software/emacs/download.html)
Si las variables de entorno CC y CCX no se especifican el script de configuración no va a poder encontrar muchas bibliotecas y dará errores del tipo `error: ELisp native compiler was requested, but libgccjit was not found.`
{{</admonition>}}
Ejecutamos el script `autogen.sh`, que creará un script `configure` específico para nuestro sistema.
La opción `prefix` no es necesaria, pero yo quiero tener controlado donde se instala esta versión compilada de Emacs, no quiero que se mezcle con los ficheros del sistema.
Como de momento no uso Emacs para gestionar mi correo puedo ignorar los warnings de `movemail` en cualquier caso ejecutando `./configure --help` podemos ver todas las opciones disponibles. En general `configure` ve disponibles en el sistema las bibliotecas necesarias, se habilitan las opciones correspondientes, aunque `--with-native-compilation` es obligatorio especificarla.
Ahora lanzamos el proceso de compilación con
```bash
make -j$(nproc)
```
Este comando asigna todos los nucleos del sistema a la compilación, podemos asignar un número fijo si queremos (por ejemplo `make -j2`)
Una vez completada la compilación del programa sin errores, podemos probar nuestro Emacs recién compilado con `./src/emacs -q`
También podemos comprobar que ya no tenemos el error de _gv_ con el comando `emacs -q —eval "(require 'gv)"`
## update-alternatives
Suponiendo que hemos instalado nuestra nueva versión de Emacs en `/opt/emacs-28.2/`. Tendremos que usar la utilidad de sistema `update-alternatives` para dejar nuestro nuevo Emacs accesible.
Veremos todos los programas ejecutables que hemos instalado al ejecutar el `make install`.
Tomemos como ejemplo el comando `emacs`, vamos a ver como funciona la llamada a `emacs` en nuestro sistema.
```bash
$ which emacs
/usr/bin/emacs
$ ls -lha /usr/bin/emacs
/usr/bin/emacs ⇒ /etc/alternatives/emacs
$ ls -lha /etc/alternatives/emacs
/etc/alternatives/emacs ⇒ /usr/bin/emacs28
```
El Emacs de nuestro sistema `/usr/bin/emacs` apunta en realidad a `/etc/alternatives/emacs`. A su vez `/etc/alternatives/emacs` apunta a `/usr/bin/emacs28` (el que he instalado desde el PPA)
Podemos inspeccionar la configuración de `update-alternatives` con dos comandos: `update-alternatives --config emacs` y `update-alternatives --display emacs`. El primero no da mucha información por que sólo tenemos una alternativa definida para emacs (de momento). El segundo es más interesante:
```bash
$ update-alternatives --display emacs
emacs - auto mode
link best version is /usr/bin/emacs28
link currently points to /usr/bin/emacs28
link emacs is /usr/bin/emacs
slave emacs.1.gz is /usr/share/man/man1/emacs.1.gz
Si vemos todo los programas que tenemos disponibles en `/opt/emacs-28.2` veremos que tenemos que actualizar las alternativas para `emacsclient`, tags`, `etags` y `ebrowse`.
Ya casi hemos terminado, para finalizar solo tenemos que actualizar (o crear) ficheros `.desktop` que apunten a nuestro nuevo Emacs.
Podemos comprobar los ficheros `.desktop` existentes con:
```bash
$ ls -lha /usr/share/applications/*emacs*
.rw-r--r-- root root 440 B Tue May 17 05:05:27 2022 /usr/share/applications/emacs28.desktop
.rw-r--r-- root root 260 B Tue May 17 05:05:27 2022 /usr/share/applications/emacs28-mail.desktop
.rw-r--r-- root root 412 B Tue May 17 05:05:27 2022 /usr/share/applications/emacs28.desktop
.rw-r--r-- root root 643 B Tue May 17 05:05:27 2022 /usr/share/applications/emacsclient28-mail.desktop
.rw-r--r-- root root 826 B Tue May 17 05:05:27 2022 /usr/share/applications/emacsclient28.desktop
```
Tendremos que crear nuevas versiones de esos ficheros que apunten al Emacs recién instalado (o editar los existentes), por poner un ejemplo este es el fichero `emacs-28.2.desktop` resultado de modificar el `emacs28.desktop`:
# Compilamos con los nucleos que queramos (yo le dedico cuatro)
# Si no tienes prisa, con la opción bootstrap haces un 'clean' y
# recompilas todos los ficheros, incluidos los ficheros elisp
# make -j4
make -j4 bootstrap
# Comprobamos con
src/emacs -q
# Instalamos
make check
sudo make install
```
Podemos hacer `git tag --list` para ver todas las versiones disponibles, y con `git checkout` nos cambiamos a la versión que nos interese para compilarla.