Makepkg (Español)

From ParabolaWiki
Jump to: navigation, search


Resumen
makepkg es un script usado para compilar y empaquetar software para usar con pacman o con una interfaz gráfica de usuario que use pacman como octopi etc.. Este artículo detalla sus configuración y uso.
Importante
Los paquetes en Parabola se construyen usando makepkg y un script de construcción personalizado para cada paquete (conocido como PKGBUILD). Una vez empaquetado, el software se puede instalar y administrar con pacman.
Relacionadas
Creating Packages
Recursos
Página man makepkg(8)
Página man makepkg.conf(5)

makepkg se usa para compilar y construir paquetes adecuados para instalar con pacman, el administrador de paquetes de Parabola o con una interfaz gráfica de usuario que use pacman como octopi etc.. makepkg es un script que automatiza la construcción de paquetes, puede descargar y validar archivos fuente, chequear dependencias, configurar parámetros mientras compila, compilar las fuentes, instalar un root temporal, personalizar, generar meta-info, y empaquetar todo junto. I makepkg es provisto por el paquete pacman.

1 Configuración

/etc/makepkg.conf es el archivo principal de configuración de makepkg. La mayoría de los usuarios prefiere modificar algunos parámetros antes de construir algún paquete.

1.1 Arquitectura, indicadores de compilación

Las opciones MAKEFLAGS, CFLAGS, y CXXFLAGS son usadas por make, gcc, y g++ mientras se compila software con makepkg. Por defecto, estas opciones generan paquetes genéricos que se pueden instalar en una amplia variedad de máquinas. Una mejora de rendimiento se puede obtener ajustando la compilación a la máquina anfitriona. El lado negativo es que los paquetes compilados específicamente para el procesador de la máquina anfitriona pueden no funcionar en otras máquinas.

Nota: Tenga presente que no todos los sistemas de construcción de paquetes usarán sus variables exportadas. Algunos las sobreescribirán en el Makefiles original o el PKGBUILD.
/etc/makepkg.conf
...

#########################################################################
# ARQUITECTURA, INDICADORES DE COMPILACION
#########################################################################
#
CARCH="x86_64"
CHOST="x86_64-unknown-linux-gnu"

#-- Exclusivo: solo funcionará en x86_64
# -march (o -mcpu) construyen exclusivamente para una arquitectura
# -mtune optimiza para una arquitectura, pero para una amplia familia de procesadores
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,--hash-style=gnu"
#-- Indicadores: cambie esto para sistemas DistCC/SMP
#MAKEFLAGS="-j2"

...

makepkg.conf CFLAGS y CXXFLAGS por defecto son compatibles con todas las máquinas dentro de sus respectivas arquitecturas.

En máquinas x86_64, no se aprecia una aumento significativo del rendimiento que justifique reconstruir los paquetes oficiales.

Desde la versión 4.3.0, GCC ofrece el cambio -march=native para habilitar la auto detección de la CPU y que seleccione automáticamente optimizaciones soportadas por la máquina local en tiempo de ejecución de GCC. Para usarlo, sólo modifique los parámetros por defecto cambiando las líneas en CFLAGS y CXXFLAGS como sigue:

# -march=native también configura correctamente -mtune=
CFLAGS="-march=native -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="${CFLAGS}"

Posteriores optimizaciones por tipo de CPU pueden, en teoría, mejorar el rendimiento ya que -march= habilita todos los conjuntos de instrucciones disponibles y mejoran la planificación para una CPU en particular. Esto es especialmente notorio cuando se reconstruyen aplicaciones (por ejemplo, herramientas de codificación de audio/video, aplicaciones científicas, programas de matemáticas avanzada, etc.) que pueden sacar mucha provecho de las instrucciones más nuevas deshabilitadas cuando use las opciones por defecto (o paquetes) provistos por Parabola.

Es muy facil perder rendimiento usando CFLAGS "no estándares" porque los compiladores tienden a inflar en demasía la cantidad de líneas de código con ciclos sin salida, mala vectorización, inlines desquiciadas, etc., dependiendo del compilador. A menos que pueda verificar/marcar que algo es más rápido, ¡existe una alta probabilidad de que no lo sea!

Consulte la página man de GCC para obtener una lista completa de opciones disponibles. La guía de optimización en la compilación de Gentoo y el artículo en su wiki Cflags seguros brinda información más profunda.

1.1.1 MAKEFLAGS

La opción MAKEFLAGS puede ser usada para especificar opciones adicionales para make. Los usuarios con sistemas con multiprocesadoires/multi-núcleos pueden especificar el número de trabajos para ejecutar simultáneamente. Típicamente, una decisión adecuada es -j2mas 1 por cada procesador/núcleo adicional. Algunos PKGBUILD en particular sobreescriben esto con -j1, debidoa condiciones de carrera en determinadas versiones o simplemente porque no lo soportan en primer lugar. Los paquetes que no se pueden construir debido a este problema deberían ser reportados en el bug tracker después de asegurarse que el error ha sido causado por su MAKEFLAGS.

Consulte man make para una lista completa de opciones disponibles.

1.2 Salida de paquetes

En este punto, se configurará el lugar adonde colocar los paquetes y los archivos fuente e identificarse como empaquetador. Este paso es opcional; los paquetes se crearán en el directorio de trabajo en donde se ejecute makepkg por defecto.

/etc/makepkg.conf
...

#########################################################################
# SALIDA DE PAQUETES
#########################################################################
#
# Default: coloca el paquete construido y las fuentes en caché en el directorio de construcción
#
#-- Destino: especifique un directorio fijo donde todos los paquetes serán colocados
#PKGDEST=/home/packages
#-- caché de fuentes: especifique un directorio fijo donde los archivos fuente sean cacheados
#SRCDEST=/home/sources
#-- Paquetes fuente: especifique un directorio fijo donde colocar todos los paquetes src
#SRCPKGDEST=/home/srcpackages
#-- Packager: nombre/email de la persona u organización que construyó los paquetes
#PACKAGER="John Doe <john@doe.com>"

...

Por ejemplo, cree el directorio:

$ mkdir /home/$USER/packages

Luego modifique la variable PKGDEST en /etc/makepkg.conf.

La variablePACKAGER configurará el valor packager dentro de los archivos de metadatos de los paquetes compilados .PKGINFO. Por defecto, los paquetes compilados por usuarios mostrarán:

pacman -Qi package
...
Packager       : Unknown Packager
...

Después:

pacman -Qi package
...
Packager       : John Doe <john@doe.com>
...

Esto es muy útil si múltples usuarios compilan paquetes en un sistema, o si distribuye sus paquetes a otros usuarios.

2 Uso

Antes de continuar, asegúrese que el grupo base-devel está instalado. Los paquetes que pertenecen a este grupo no se requieren para listarse como dependencias en los archivos PKGBUILD. Instale el grupo "base-devel" (como root):

# pacman -S base-devel
Nota: Antes de quejarse por las dependencias perdidas (make), recuerde que se supone que el grupo base está instalado en todos los sistemas Parabola systems. Además, se supone que el grupo "base-devel" será instalado cuando se construya con makepkg.

Para construir un paquete, primero debe crear un PKGBUILD, o un script de construcción, como se describe en Creating Packages, u obtener uno de ABS tree, Arch User Repository, o alguna otra fuente.

Advertencia: Solamente construya y/o instale paquetes de fuentes confiables.

Una vez en posesión de unPKGBUILD, cambie al directorio en donde será grabado y ejecute el siguiente comando para construir el paquete descripto por PKGBUILD:

$ makepkg

Para tener un makepkg limpio de carpetas y archivos sobrantes, tales como archivos extraídos a $srcdir, agregue la siguiente opción. Esto es muy útil para múltiples construcciones del mismo paquete o para actualizaciones de la versión del paquete, mientras usa la misma carpeta construida. Esto previene que archivos obsoletos y remanentes sean arrastrados a las nuevas construcciones.

$ makepkg -c

Si se pierden dependencias requeridas, makepkg lanzará una advertencia antes de fallar. Para construir el paquete e instalar las dependencias necesarias automáticamente, simplemente use el comando:

$ makepkg -s

Note que estas dependencias deben estar disponibles en los repositorios configurados; consulte pacman#Repositories por detalles. Como alternativa, se pueden instalar manualmente dependencias antes de construir (pacman -S --asdeps dep1 dep2).

OUna vez que todas las dependencias se satisfagan y que el paquete se construye exitosamente, se creará un archivo empaquetado (pkgname-pkgver.pkg.tar.xz) en el directorio de trabajo. Para instalarlo, ejecute como root:

# pacman -U pkgname-pkgver.pkg.tar.xz

Alternativamente, para instalar, usar el parámetro -i es una forma sencilla de ejecutar pacman -U pkgname-pkgver.pkg.tar.xz:

$ makepkg -i

3 Consejos y trucos

3.1 Reemplace checksums en PKGBUILD automáticamente

3.1.1 Opción 1

Aquí hay un script muy útil que generará nuevos checksums para archivos actualizados y reemplazarlos dentro del PKGBUILD en un paso.

#!/bin/bash
# Script by Falconindy
# https://bbs.archlinux.org/viewtopic.php?id=131666

awk -v newsums="$(makepkg -g)" '
BEGIN {
  if (!newsums) exit 1
}

/^[[:blank:]]*(md|sha)[[:digit:]]+sums=/,/\)[[:blank:]]*$/ {
  if (!i) print newsums; i++
  next
}

1
' PKGBUILD > PKGBUILD.new && mv PKGBUILD{.new,}

3.1.2 Opción 2

setconf PKGBUILD $(makepkg -g 2>/dev/null | pee "head -1 | cut -d= -f1" "cut -d= -f2") ')'

Esto funciona bien, pero tiene la desventaja que requiere el paquete setconf (solamente 364 KiB) y no trabaja con múltiples sum (tanto md5sums y sha256sums en el mismo PKGBUILD, por ejemplo).

La velocidad es buena y mejor que los scripts que usan awk, aunque makepkg sea llamado dos veces.

3.2 ADVERTENCIA: Referenciando $srcdir en PKGBUILD

De alguna manera, $srcdir de $pkgdir terminó en uno de los archivos instalados en su paquete.

Para identificar los archivos, ejecute lo siguiente desde el directorio de construcción de makepkg:

grep -R "$(pwd)/src" pkg/

Consulte el siguiente enlace a un hilo de discusión.

4 Reconocimientos

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