makepkg es la herramienta más primitiva que puedes usar para compilar paquetes que vengan de AUR en Arch Linux y distribuciones relacionadas (Manjaro, EndeavourOS, Xero Linux…). La mayoría de personas inmediatamente van a querer dar el salto a un gestor de paquetes compatible con AUR, como Yay o Paru, por las limitaciones que tiene vivir únicamente de makepkg exclusivamente.
Sin embargo, en algunos casos puede salvar la vida cuando todo lo demás falla, así que creo que es muy relevante saber, al menos cómo descargar y compilar un paquete de AUR con makepkg. ¿Por qué? Así como mínimo, porque para instalar Yay necesitarás usar algo, ¿no? ¿o pretendes mantener yay fuera de la base de datos de pacman? Además, si eres una de esas personas que saben cómo crear y modificar PKGBUILDs, trabajar con makepkg te será más sencillo en muchos casos.
Descargar un paquete de AUR
Vamos a poner que quieres instalar Anki en tu sistema. Anki se puede descargar desde AUR. De hecho, lo primero que tendrías que hacer es descargar el PKGBUILD con la receta. Como ya te conté, en AUR los paquetes no se distribuyen pre-compilados, sino que se te entrega el archivo PKGBUILD, que tiene los pasos que tu ordenador debe dar para compilar e instalar el paquete.
Para descargar un paquete desde AUR tienes dos opciones. Una es, de forma casual, ir a la página del paquete en AUR y pulsar sobre el enlace Download snapshot que aparece en la parte derecha de la pantalla. Esto te descargará un tarball que, cuando lo extraigas, contendrá el PKGBUILD de ese paquete y otros paquetes auxiliares.
$ ls
anki.tar.gz
$ tar -xvf anki.tar.gz
anki/
anki/.SRCINFO
anki/PKGBUILD
anki/anki.changelog
anki/no-update.patch
anki/strip-formatter-deps.patch
anki/strip-python-pip-system-certs.patch
anki/strip-type-checking-deps.patch
Otra opción es usar Git. Para ello, primero asegúrate de que tienes Git instalado en tu sistema (si no, haces pacman -S git
), y luego copias la URL que sale en la página del paquete AUR junto a la sección «Git Clone URL». En una terminal, escribes como comando git clone
seguido de la URL que has copiado. Por ejemplo,
$ git clone https://aur.archlinux.org/anki.git
Cloning into 'anki'...
remote: Enumerating objects: 400, done.
remote: Counting objects: 100% (400/400), done.
remote: Compressing objects: 100% (294/294), done.
remote: Total 400 (delta 110), reused 395 (delta 106), pack-reused 0 (from 0)
Receiving objects: 100% (400/400), 221.87 KiB | 1.34 MiB/s, done.
Resolving deltas: 100% (110/110), done.
Una vez lo tengas descargado de cualquier modo, cambia en la consola al directorio que trae el PKGBUILD (por ejemplo, cd anki
), y ya podemos ponernos manos a la obra.
Compilar e instalar el paquete con makepkg
makepkg
tiene un montón de flags extra para ayudar durante el proceso de compilación. Como te cuento ahora, algunos van a ser especialmente útiles.
Sin embargo, en su forma más simple, puedes empezar a compilar un paquete usando el comando makepkg
cuando te encuentres en un directorio con un archivo PKGBUILD.
Lo que ocurre es que si tu paquete va a depender de dependencias que no tengas instaladas, entonces ese paso va a fallar.
$ makepkg
==> Making package: anki 24.06.3-2 (Sun 24 Nov 2024 06:24:42 PM CET)
==> Checking runtime dependencies...
==> Missing dependencies:
-> python-waitress>=2.0.0
-> python-orjson
-> python-protobuf>=4.21
-> python-distro
-> python-flask-cors
-> python-send2trash
-> qt6-multimedia
-> python-pyqt6-webengine>=6.2
==> Checking buildtime dependencies...
==> Missing dependencies:
-> nodejs>=20
-> yarn
-> mold
==> ERROR: Could not resolve all dependencies.
Tendrías que instalar todas estas dependencias. Para no hacerlo a mano, una cosa que puedes hacer es usar el flag -s
cuando invoques makepkg, para que descargue lo que pueda antes de empezar a compilar. Ten en cuenta de todos modos que esto no valdrá si alguna de las dependencias viene de AUR. Un gestor de paquetes como Yay o Paru hará esto por ti.
Algunas de las dependencias que se instalan son build dependencies. Estas hacen falta para fabricar el paquete a partir del PKGBUILD, pero no son necesarias. Otras dependencias sí que son normales y las tendrás que tener instaladas en tu sistema todo el tiempo para que el programa se pueda ejecutar bien.
Si todo va bien, eventualmente terminará de compilar:
==> Creating package "anki"...
-> Generating .PKGINFO file...
-> Generating .BUILDINFO file...
-> Adding changelog file...
-> Generating .MTREE file...
-> Compressing package...
==> Leaving fakeroot environment.
==> Finished making: anki 24.06.3-2 (Sun 24 Nov 2024 06:36:26 PM CET)
Esto produce un archivo que, generalmente estos días, terminará por x86_64.pkg.tar.zst
. Por defecto y salvo que lo hayas modificado en la configuración de tu sistema, se encontrará junto al PKGBUILD, en el mismo directo. Lo que tendrás que hacer ahora es instalarlo manualmente como quien instala un paquete de pacman, mediante el comando pacman -U
. Por ejemplo:
# pacman -U anki-24.06.3-2-x86_64.pkg.tar.zst
loading packages...
resolving dependencies...
looking for conflicting packages...
Package (1) New Version Net Change
anki 24.06.3-2 47.99 MiB
Total Installed Size: 47.99 MiB
:: Proceed with installation? [Y/n] y
(1/1) checking keys in keyring
(1/1) checking package integrity
(1/1) loading package files
(1/1) checking for file conflicts
(1/1) checking available disk space
(1/1) installing anki
Optional dependencies for anki
lame: record sound [installed]
mpv: play sound. prefered over mplayer
mplayer: play sound
texlive-most: render LaTex in cards
:: Running post-transaction hooks...
(1/2) Arming ConditionNeedsUpdate...
(2/2) Updating the desktop file MIME type cache...
Como te cuento ahora, hay formas de saltarse este paso instalando automáticamente el paquete al compilarlo.
Otros flags interesantes
Generalmente, cuando se fabrica un paquete, makepkg deja un montón de archivos temporales detrás de sí, con todo lo que ha ido descargando y extrayendo. Si quieres asegurarte de que esto no pase, entonces puedes utilizar la opción -c
para limpiar el entorno de trabajo tras fabricar el paquete.
Ya te he contado, por otra parte, que con la opción -s
puedes instalar paquetes que falten en tu sistema antes de empezar el proceso de instalación. Con la opción -r
, además, los paquetes que no tenga sentido conservar tras instalarlo (los build dependencies) serán eliminados del sistema.
Por otra parte, la opción -i
es útil para ofrecer instalar el paquete inmediatamente tras compilarlo. Así no se te olvidará luego si andas con prisa.
Finalmente, quiero hacer mención al flag -f
, que sirve para obligar a makepkg a compilar el paquete siempre. Esto es porque si tratas de usar makepkg
cuando ya se ha generado un paquete, te dirá que ya se ha compilado un paquete y que no es necesario. Puedes hacer limpieza, pero con la opción -f
ignoras ese comportamiento directamente y le obligas a compilarlo siempre.