PKGBUILD (Español) - ParabolaWiki

# PKGBUILD (Español)

Summary
Una explicacion de las variables de PKGBUILD cuando se crean paquetes.
Overview
Los paquetes en Parabola son construídos usando makepkg y un script de compilación personalizada para cada paquete (conocido como PKGBUILD). Una vez que son enpaquetados, el software puede ser instalado y gerenciado con el pacman.
Related
Creating -libre packages (Español)
VCS PKGBUILD Guidelines

Un PKGBUILD es un archivo descriptivo de construcción de un paquete para Parabola GNU/Linux-libre utilizando la guía de Creación de paquetes. Este articulo describe posibles variables del PKGBUILD.

Los paquetes en Parabola GNU/Linux-libre son construidos usando la herramienta makepkg y la información que reside en el archivo PKGBUILD. Cuando makepkg es ejecutado, busca por el archivo PKGBUILD en el directorio actual y sigue las instrucciones para compilar y obtener un paquete (nombredepaquete.pkg.tar.xz). El paquete resultante contiene los archivos binarios e instrucciones de instalación, fácilmente instalable con pacman.

## Variables

Los siguientes son variables que se pueden escribir dentro del archivo PKGBUILD.

Es una practica común definir las variables en PKGBUILD en el mismo orden que se da aquí. Sin embargo, esto no es obligatorio, siempre y cuando se use la sintaxis BASH correcta.

### pkgname

El nombre del paquete. Esté debe consistir en caracteres alfanuméricos y guiones ('-') y todas las letras deben ser minúsculas. En aras de la consistencia, pkgname debe coincidir su nombre con el nombre del código fuente en el archivo tarball del software que estas empaquetando. Por ejemplo, si el software esta en foobar-2.5.tar.gz, el valor de la variable pkgname debe ser foobar. El actual directorio de trabajo en que el archivo PKGBUILD se encuentra debe coincidir también con la variable pkgname.

### pkgver

La versión del paquete. El valor debería ser la misma que la versión liberada del paquete realizado por el propio autor del mismo. Puede contener letras, números y puntos, pero, NO PUEDE contener guiones. Si el autor del paquete usa guiones en su esquema de numeración de versiones, debe reemplazarlo con una raya-baja. Por ejemplo, si la versión es 0.99-10, debe cambiarse por 0.99_10. Si la variable pkgver es usada luego en el archivo PKGBUILD para bajar el código fuente y requiere el guion en lugar de la raya-baja, puede sustituirlo fácilmente, e.j.:

    source=($pkgname-${pkgver//_/-}.tar.gz)

### pkgrel

El numero de el lanzamiento del paquete especificado para Parabola GNU/Linux-libre. Este valor permite al usuario diferenciar entre compilaciones consecutivas de la misma versión del paquete. Cuando una nueva versión del paquete es liberado por primera vez, el numero de la versión debe empezar desde el 1. Mientras se añaden arreglos y se optimiza al archivo PKGBUILD, el paquete sera re-liberado y el numero de la versión sera incrementado en 1. Cuando salé una nueva versión del software a empaquetar, el numero de versión del paquete PKGBUILD se reinicia a 1.

### epoch

un valor entero, especifico para Parabola GNU/Linux-libre, representa el 'tiempo de vida' que se puede usar para comparar diferentes números de versiones. Esté valor permite la anulación de las reglas de comparación de versiones que proceden normalmente para paquetes que, tengan numeración de versiones inconsistentes, requieran des-actualizar, cambiar el esquema de numeración, etc. Por defecto, se asume que el paquete tiene un valor epoch de 0. No use esta variable a menos que usted sepa lo que hace.

### pkgdesc

La descripción del paquete. La descripción debe ser cerca de 80 caracteres o menos y no debe ser incluido el nombre mismo del paquete en forma de auto-referencia. Por ejemplo, "Nedit es un editor de texto para X11" deberia ser descrito como "Un editor de texto para X11".

### arch

Una serie de arquitecturas en las que es bien sabido que el paquete resultante de PKGBUILD puede trabajar sin problemas. En la actualidad, esta variable puede contener i686 y/o x86_64. El valor any puede ser ademas, usado para definir paquetes que son independientes de la arquitectura en la que son compilados.

Usted puede averiguar a la arquitectura objetivo durante la compilación por medio de la variable $CARCH, aun cuando se definen variables. Vea ademas el bug 16352 en ArchLinux. Ejemplo:

    depends=(foobar)
    if test "$CARCH" == x86_64; then
        depends = ("${depends[@]}" lib32-glibc)
    fi

### url

La URL del sitio oficial de donde procede el software a ser empaquetado.

### license

La licencia está bajo la cual el software se distribuye. Un paquete llamado licencia-libre ha sido creado en [libre] donde almacena licencias libres, se ubica en /usr/share/licencias/common, una licencia por citar tenemos por ejemplo, /usr/share/licencias/common/GPL.

Una vez que se utiliza una licencia de dos o más paquetes de un repositorio oficial, se convierte parte del paquete de licencia-libre.

- Las licencias BSD, MIT, zlib/png y Python son casos especiales y no poderian ser incluidos en el paquete de licenses-libre. Por el bien de la libertad de las licencias, license=('BSD'), license=('MIT'), license=('ZLIB') y license=('Python')) son tratados como licencias no libres porque cada uno contiene su línea propia de derechos de autor que atenta nuestra libertad.

Algunos paquetes pueden no estar cubiertos por una sola licencia. En estos casos, hay múltiples entradas que puede hacerse en la matriz de licencia, por ejemplo, license=('GPL' 'LGPL3').

- Además, la GPL (L) tiene muchas versiones y variantes de esas versiones. Por el software (L)GPL, la convención es:
  - (L)GPL - (L)GPLv2 or any later version (o cualquier versión posterior)
  - (L)GPL2 - (L)GPL2 only (únicamente)
  - (L)GPL3 - (L)GPL3 or any later version (o cualquier versión posterior)

Advertencia: Parabola GNU/Linux-libre es una distribución libre, solo aceptamos licencias libres que respetan la libertad. Recomendamos que leas la guia "Creando paquetes -libre", guia "Libremakepkg" y guia "Mantenedor de Paquetes" antes de crear un archivo PKGBUILD. Si tienes dudas, puedes encontrarnos en #parabola or mailing list.

### groups

El grupo al cual pertenece el paquete. Por ejemplo, cuando instalas el paquete kdebase, esté instalara todos los paquetes que pertenezcan al grupo kde.

### depends

Es una serie de nombre de paquetes que deben ser instalados antes de que esté software pueda ejecutarse. En caso de que el software requiera una dependencia con una versión mínima, el operador >= debe usarse para denotar ésto, e.j.: depends=('foobar>=1.8.0'). Usted no necesita listar paquetes de los que depende su software sí otros paquetes ya listados poseen dicho paquete dentro de su lista de dependencias. Por ejemplo, gtk2 depende de glib2 y glibc. Sin embargo, el paquete glibc no necesita ser listado en las dependencias de gtk2 porqué éste ultimo paquete ya es una dependencia de glib2.

### makedepends

Una serie de nombre de paquetes que deben ser instalados para compilar dado software pero innecesarios para usar el software luego de la instalación. Usted puede especificar el numero de la versión mínima de la cual depende el software a empaquetar en el mismo formato que en la serie depends.

### checkdepends

Una serie de nombres de paquetes del cual depende dado software para ejecutar su suite de pruebas (test suite) pero que no son requeridos al momento de ejecutar el software. Estas dependencias son consideradas unicamente cuando la función check() esta presente en el archivo PKGBUILD y ella es ejecutada por makepkg.

### optdepends

Un listado de nombres de paquetes que no son necesarios para el funcionamiento del software pero provee características adicionales. Una corta descripción e lo que cada paquete provee debería ser anotado ademas. Una optdepends podría lucir algo así:

    optdepends=('cups: printing support'
    'sane: scanner support'
    'libgphoto2: digital camera support'
    'alsa-lib: sound support'
    'giflib: GIF images support'
    'libjpeg: JPEG images support'
    'libpng: PNG images support')

### provides

Una serie de nombres de paquetes que esté paquete provee sus características (o un paquete virtual tal como cron o sh) Si usted usa esta variable, debería de añadir la versión pkgver y quizás la variable pkgrel que este paquete proveerá si sus dependientes son afectados por él. Por ejemplo, si usted provee una versión modificada del paquete qt llamada qt-foobar versión 3.3.8 el cual provee el paquete qt entonces la serie de valores para la variable provides=('qt=3.3.8'). Escribir provides=('qt') causara una falla en aquellos paquetes dependientes de qt que requieran una versión especifica del paquete mencionado. No añada pkgname a su lista de paquetes proveídos, esto es realizado automáticamente, en caso de que no use está variable.

### conflicts

Una lista de nombres de paquetes que causan problemas cuando éste paquete es instalado. Usted puede ademas especificar las propiedades versión de los paquetes conflictivos en el mismo formato que la lista depends.

### replaces

Un listado de nombres de paquetes obsoletos que son reemplazados por éste paquete, e.j.: replaces=('ethereal') para el paquete wireshark. Luego de sincronizar el repositorio con pacman -Sy, él reemplazara inmediatamente los paquetes instalados con otros paquetes cuyos valores en la variable replaces coincidan con estos últimos en el repositorio. Si usted provee una versión alternativa de algún paquete existente, use la variable conflicts que es la única evaluada al momento de instalar algún paquete conflictivo.

### backup

Es una serie de archivos a ser respaldados como archivo.pacsave cuando el paquete es removido. Esta variable es comúnmente usada con paquetes que colocan sus archivos de configuración en /etc. La ubicación del archivo en esta variable debe ser relativa (e.j.: etc/pacman.conf) y no absoluta (e.j.: /etc/pacman.conf).

### options

Esta serie permite cambiar algunos comportamientos que tiene por defecto makepkg. Para establecer una opción, incluyendo el nombre de la opción en la serie. Para invertir el comportamiento por defecto, coloque un ! delante de la opción. Las siguientes opciones pueden colocarse en la serie de la variable:

- strip - Tiras de símbolos de depuración para archivos binarios y librerías. Si usas frecuentemente un depurador en programas o librerías, quizás te sea útil habilitar esta opción.
- docs - Salva el directorio /doc.
- libtool - deja los archivos libtool (.la) en los paquetes.
- emptydirs - Deja los directorios vacíos en los paquetes.
- zipman - hace una compresión de las paginas man e info con gzip.
- ccache - Permite el uso de ccache durante la compilación. Es mas útil en su forma negativa !ccache con ciertos paquetes que tengan problemas de compilación con ccache.
- distcc - Permite el uso de distcc durante la compilación. Es mas util en su forma negativa !distcc con aquellos paquetes que tienen problemas durante la compilación con distcc.
- buildflags - Permite el uso de banderas-de-compilación especificadas por el propio usuario (CFLAGS, CXXFLAGS, LDFLAGS) durante la compilación. Es mas útil en su forma negativa (!buildflags) con ciertos paquetes que presenten problemas durante la compilación con buildflags personalizadas.
- makeflags - Permite el uso de banderas makeflags personalizadas por el usuario durante la compilación. Es mas útil en su forma negativa !makeflags con aquellos paquetes que tienen problemas durante la compilación con makeflags personalizados por el usuario.

### install

Es el nombre de un script .install a ser incluido en el paquete. pacman posee la habilidad de guardar y ejecutar un script especifico para un paquete dado al momento de instarlo. El script contiene las siguientes funciones que son ejecutadas en diferentes momentos:

- pre_install - El script es ejecutado antes que los archivos sean extraídos. Se pasa un argumento: la nueva versión del paquete.
- post_install - El script es ejecutado luego de que los archivos son extraídos. Se pasa un argumento: nueva versión del paquete.
- pre_upgrade - El script es ejecutado antes de que los archivos sean extraídos. Se pasan dos argumentos en el siguiente orden: la nueva versión del paquete, la antigua version del paquete.
- pre_remove - El script es ejecutado justo antes de que los archivos son removidos. Se pasa un argumento: la antigua versión del paquete.
- 'post_removed - El script es ejecutado justo antes que que los archivos son removidos. Se pasa un argumento: la antigua versión del paquete.

Cada función es ejecutada chrooteada en el directorio de pacman. ver este tema en el foro de ArchLinux.

Tip: Un prototipo del archivo .install proveído se puede encontrar en /usr/shara/pacman/proto.install.

### source

Es una serie de archivos que son requeridos para compilar el paquete. Debe contener la ubicación de las fuentes del software, que en la mayoría de los casos es una URL HTTP o FTP completa. Las variables pkgname y pkgver previamente establecidas pueden ser usadas de manera efectiva aquí. (e.j.: source=(http://libre.com/$pkgname-$pkgver.tar.gz))

Note: Si usted necesita suplir archivos que son descargables al vuelo, e.j.: parches escrito por usted mismo, sencillamente debe incluirlos en el mismo directorio donde su PKGBUILD esta y agregar los nombres de los archivos a la serie de valores de la variable. Cualquier dirección que usted agrega es resuelta de manera relativa al directorio donde PKGBUILD yace. Antes que el actual proceso de compilación es iniciado, todos los archivos referenciados en la variable son descargados o comprobado su existencia, makepkg no continuara si algún archivo esta perdido.
Note: Puede especificar un nombre de archivo diferente para descargar - Si el archivo descargado tiene un nombre diferente por razones como que la URL tenia parámetros GET - usando la siguiente sintaxis: <nombredearchivo>::<fileuri>, no incluya los caracteres '<' y '>'.

### noextract

Es una serie de archivos listados en la variable source que no deben ser extraídos de sus respectivos formatos de compresión por makepkg. Comúnmente se aplica estas excepciones sobre ciertos archivos zip los cuales no pueden ser manejados por /usr/bin/bsdtar porqué libarchive procesa todos los archivos como un flujo en lugar de acceder a ellos de forma aleatoria como unzip lo hace. En esta situacion unzip debería añadirse al listado de makedepends y en la primer linea de la función build() debería contener:

    cd $srcdir/$pkgname-$pkgver
    unzip [source].zip

Note que mientras la serie source acepta URLs, en noextract se agregara solo la porción de el nombre del archivo. Así que, por ejemplo, usted haría algo como ésto (simplificado de el PKGBUILD de grub2):

    source=("http://ftp.archlinux.org/other/grub2/grub2_extras_lua_r20.tar.xz")
    noextract=("grub2_extra_lua_r20.tar.xz")

Para no extraer nada, puede usar un truco de fantasía como esto (obtenido de icecat-i18n):

    noextract=(${source[@]##*/})

Tenga en cuenta que una substitución mas conservativa con Bash hubiera incluido las comillas, o posiblemente aun un bucle que llamé a basename. Si has leído hasta aquí, debes haber captado la idea.

### md5sum

Es una serie de sumas de comprobación MD5 de los archivos listados en la serie de source. Una vez que todos los archivos listados en source están disponibles, un hash MD5 de cada archivo es generado automáticamente y sus valores comparados en el mismo orden en el que aparecen en la serie de source. Mientras el orden de los archivos fuentes no importa por si mismo, es importante que esté orden concuerde con el orden en ésta serie porqué makepkg no puede adivinar cual suma de comprobación pertenece a que archivo fuente. Puede generar la serie de valores rápido y fácilmente usando el comando makepkg -g en el mismo directorio que contiene el archivo PKGBUILD. Tome en cuenta que el algoritmo MD5 es conocido por sus debilidades, así que debería considerar usar una alternativa mucho mas fuerte.

### sha1sums

Es una serie de sumas de comprobación SHA-1 160-bit. Esta es una alternativa al md5sums descritas arriba, pero es conocido ademas por sus debilidades, así que debería considerar una alternativa más fuerte. Para habilitar el uso y la generación de esté tipo de sumas de comprobación, asegúrese que esta establecida la opcion INTEGRITY_CHECK en el archivo /etc/makepkg.conf. Véase también man makepkg.conf.

### sha256sums, sha384sums, sha512sums

Es una serie de sumas de comprobación SHA-2 con digestión en tamaños de 256, 348 y 512 bits respectivamente. Estas son alternativas a md5sums y a sha1sums descritos mas arriba y que se creen mas fuertes en general. Para habilitar el uso y la generación de estas sumas de comprobación, asegúrese que la opcion INTEGRITY_CHECK esta establecida en el archivo /etc/makepkg.conf. Véase también man makepkg.conf.

### Reconocimiento

Este artículo está basado de ArchWiki. Es posible que hayamos eliminado pedazos con contenido "no-FSDG" en ella.

## Véase También

- Archivo PKGBUILD de ejemplo
- Creating -libre packages (Español) para mas información sobre la creación de paquetes.
- Custom local repository (Español) para mas información acerca del uso de los paquetes luego de que han sido creados.
- Parabola Packaging Standards (Español) Para varias directrices.

Category:

- Hacking