Ene222016

Compilación de paquetes en ArchLinux

Aprovechando un momento libre, voy a explicar por encima el proceso de compilación de paquetes en ArchLinux. Pero antes me gustaría explicar la arquitectura de paquetería orquestada por esta distribución.

En esencia, ArchLinux organiza sus paquetes en tres repositorios:

  • Core: En este repo encontraremos los paquetes indispensables para la distribución. El kernel, el software de gnu y algunos de los paquetes más usados. Todo paquete que entra en este repositorio pasa por un fuerte proceso de testaje y comprobación de calidad.
  • Extra: Los demás paquetes que no encajan en core por una razón u otra. El servidor X, firefox, herramientas de desarrollo, etc.
  • Community: Este es un repositorio especial. Aquí son colocados paquetes provinientes del famoso AUR o repositorio de usuarios que hayan sido avalados por los denominados Trusted Users.

Todos estos repositorios, además de versiones compiladas, tienen el código fuente disponible para que podamos bajarlo, modificarlo si lo necesitásemos y compilarlo según nuestros propios intereses.

Como compilar un paquete

Siguiendo el Arch-Style, para bajar y compilar paquetes, necesitamos instalar el paquete abs.

pacman -S abs

No se trata del sistema antibloqueo, sino el Arch Build System o sistema de compilación de Arch [1].

Lo primero que haremos será ejecutar el programa de una de las dos formas siguientes como root:

# abs

o

# abs <nombre de paquete>

Salvo que sea vuestra intención, os recomiendo no ejecutar el programa de la primera manera, porque haría que se bajasen los archivos de todos los paquetes que están en los repositorios definidos en /etc/abs.conf para su compilación con el consecuente gasto de espacio en disco.

El comando nos dejará dentro de /var/abs/<nombre_repo> (p.ej: /var/abs/core) una carpeta con el nombre del programa que hayamos escogido que contendrá generalmente un solo fichero, el PKGBUILD [2].

En el se encuentran definidas las instrucciones de como y de dónde bajar el código fuente, otros elementos necesarios para el programa, así como las instrucciones para compilarlo e instalarlo.

Salvo que queramos hacer algo como compilación distribuida (artículo que vendrá en breve :D), generalmente no tendremos que tocar este fichero.Lo que haremos será copiar el archivo PKGBUILD a un directorio que destinemos para compilar y simplemente ejecutaremos con nuestro usuario [3]:

$ makepkg

Obtendremos como resultado un archivo .pkg.tar.xz o .pkg.tar.gz que tendremos con instalar con pacman como superusuario de la siguiente forma:

# pacman -U <nombre_paquete>.pkg.tar.xz

Una pequeña optimización

Para terminar, hay algo que puede resultar interesante y es modificar las flags de compilación para que se adapte y aproveche lo mejor posible nuestro hardware.

Para ello, y como superusuario, abriremos el fichero /etc/makepkg.conf y iremos a las líneas que comienzan por  CXXFLAGS y CFLAGS [1] y añadiremos o modificaremos la flag “-march” a “-march=native”. Nos tendría que quedar algo como lo siguiente.

CFLAGS="-march=native O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4"
CXXFLAGS="-march=native -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4"

Saludos y pasadlo bien :D.


 

[1] ABS – Archlinux Wiki

[2] PKGBUILD – Archlinux Wiki

[3] Makepkg – Archlinux Wiki

[4] Optimización GCC – Wiki Gentoo

Política de comentarios

Dada la importancia de los comentarios como espacio de participación, te pedimos por favor que leas detenidamente y cumplas con las siguientes normas de participación.

4 respuestas para “Compilación de paquetes en ArchLinux

Daniel

Muy interesante post, especialmente para saber algo del funcionamiento de arch, que me imagino también corren para manjaro y Antergos. Saludos.


José Miguel

Bienbenido y gracias por comentar “Daniel”.

Saludos.


omar

Muy útil el tutorial, pero estoy teniendo un problema y quizás ustedes puedan ayudarme. Intento compilar conky-1.9.1 desde el PKGBUILD donde aparte hay un parche que se llama lua53.patch, copie ambos archivos al directorio de compilación y al hacer un pakepkg desde consola me da este error:

-> Extrayendo 1.9.1.zip con bsdtar
==> Iniciando prepare()…
can’t find file to patch at input line 4
Perhaps you used the wrong -p or –strip option?
The text leading up to this was:
————————–
|diff -aur old/src/luamm.cc new/src/luamm.cc
|— old/src/luamm.cc 2015-06-28 16:38:47.793615922 -1000
|+++ new/src/luamm.cc 2015-06-29 09:05:44.646667638 -1000
————————–
File to patch:

Alguna idea de como solucionarlo? Muchas gracias


omar

Este es el contenido del PKGBUILD:

pkgname=conky
pkgver=1.9.1
pkgrel=1
pkgdesc=’Lightweight system monitor for X’
url=’https://github.com/brndnmtthws/conky/tree/1.9.1′
license=(‘BSD’ ‘GPL’)
arch=(‘i686’ ‘x86_64’)
makedepends=(‘cmake’ ‘docbook2x’ ‘docbook-xml’ ‘man-db’ ‘git’)
depends=(‘glib2’ ‘lua’ ‘wireless_tools’ ‘libxdamage’ ‘libxinerama’ ‘libxft’
‘imlib2’ ‘libxml2’ ‘libpulse’)
source=(“https://github.com/brndnmtthws/conky/archive/1.9.1.zip”
‘lua53.patch’)
sha1sums=(‘a560c356ce4c3e2918601743b57d19a18fe01a72’
‘a3a74542b6524e5663ad37aaba292b48e8bea3b1’)

options=(‘!strip’ ‘debug’)

prepare() {
cd “${srcdir}/${pkgname}-${pkgver}”
patch -p1 -i ../lua53.patch # lua_gettable returns an int in lua-5.3
}

build() {
cd “${srcdir}/${pkgname}-${pkgver}”

cmake
-D CMAKE_BUILD_TYPE=Release
-D MAINTAINER_MODE=ON
-D BUILD_WLAN=ON
-D BUILD_XDBE=ON
-D BUILD_IMLIB2=ON
-D BUILD_CURL=ON
-D BUILD_RSS=ON
-D BUILD_WEATHER_METAR=ON
-D BUILD_WEATHER_XOAP=ON
-D BUILD_PULSEAUDIO=ON
-D CMAKE_INSTALL_PREFIX=/usr
.

make
}

package() {
cd “${srcdir}/${pkgname}-${pkgver}”
make DESTDIR=”${pkgdir}” install
install -Dm644 COPYING “${pkgdir}/usr/share/licenses/${pkgname}/LICENSE”
install -Dm644 extras/vim/syntax/conkyrc.vim “${pkgdir}”/usr/share/vim/vimfiles/syntax/conkyrc.vim
install -Dm644 extras/vim/ftdetect/conkyrc.vim “${pkgdir}”/usr/share/vim/vimfiles/ftdetect/conkyrc.vim
}
sha1sums=(‘913e8a3f2f3deeebdf8f7a199aad11a65a84c3cc’
‘a3a74542b6524e5663ad37aaba292b48e8bea3b1’)

Contenido de lua53.patch:

diff -aur old/src/luamm.cc new/src/luamm.cc
— old/src/luamm.cc 2015-06-28 16:38:47.793615922 -1000
+++ new/src/luamm.cc 2015-06-29 09:05:44.646667638 -1000
@@ -165,7 +165,14 @@
}

template
– int safe_misc_trampoline(lua_State *l)
+ int safe_misc_trampoline_set(lua_State *l)
+ {
+ misc(l, 1);
+ return nresults;
+ }
+
+ template
+ int safe_misc_trampoline_get(lua_State *l)
{
misc(l, 1);
return nresults;
@@ -326,7 +333,7 @@
if( rawequal(index1, index2) )
return true;

– return safe_compare(&safe_compare_trampoline, index1, index2);
+ return safe_compare(&safe_compare_trampoline, index1, index2);
}

int state::gc(int what, int data)
@@ -367,7 +374,7 @@
checkstack(2);
pushvalue(index);
insert(-2);
– lua_pushcfunction(cobj.get(), (&safe_misc_trampoline));
+ lua_pushcfunction(cobj.get(), (&safe_misc_trampoline_get));
insert(-3);
call(2, 1, 0);
}
@@ -492,7 +499,7 @@
checkstack(2);
pushvalue(index);
insert(-3);
– lua_pushcfunction(cobj.get(), (&safe_misc_trampoline));
+ lua_pushcfunction(cobj.get(), (&safe_misc_trampoline_set));
insert(-4);
call(3, 0, 0);
}


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *