Anatomía de un SlackBuild
12 de diciembre de 2025 • fjbalon
Como usuario de Slackware, he usado alguna vez scripts de SlackBuild para crear un paquete de software que pueda ser instalado fácil y limpiamente, y eliminado más tarde si es necesario con la misma facilidad y limpieza. Lo veremos en más profundidad más adelante, pero resumidamente sabemos que un SlackBuild es un script de shell que nos permite compilar e instalar paquetes desde el código fuente, creando un paquete -generalmente
Al final, los SlackBuilds constituyen la forma oficial, digamos, de instalar software que mno viene en los repositorios base de Slackware.
Existen diferentes enfoques de un script de SlackBuild, por ejemplo Alien Bob tiene su muy útil creador de SlackBuilds y, en términos generales, lo respetaremos. Y como ejemplo mediante el cual encarnar lo que vamos a describir, usaré el paquete ksh-openbsd. La descarga, generalmente, viene en un paquete comprimido
ls
doinst.sh ksh-openbsd.info ksh-openbsd.SlackBuild README slack-desc
Siendo el que nos interesa realmente el script
#!/bin/bash
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=ksh-openbsd
VERSION=${VERSION:-20190804}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) ARCH=i586 ;;
arm*) ARCH=arm ;;
*) ARCH=$( uname -m ) ;;
esac
fi
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
fi
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
if [ "${ARCH}" == "i586" ];then
SLKCFLAGS='-march=i586 -mtune=i686'
LIBDIRSUFFIX=""
elif [ "$ARCH" == "i686" ]; then
SLKCFLAGS="-march=i686 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "${ARCH}" == "x86_64" ];then
SLKCFLAGS='-fPIC'
LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
LIBDIRSUFFIX=""
fi
set -e
rm -Rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -Rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \
-exec chmod 755 {} \+ -o \
\( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
-exec chmod 644 {} \+
CFLAGS="$SLKCFLAGS $(getconf LFS_CFLAGS)" make
case "$(ps -o stat= -p $$)" in
*+*) make check ;; # running in foreground
*) echo '*** Not running "make check" because we are in the background.' ;;
esac
make install DESTDIR=$PKG
if [ -n "${PDKSH_BINNAME}" ];then
mv $PKG/bin/pdksh $PKG/bin/"${PDKSH_BINNAME}"
mv $PKG/usr/man/man1/pdksh.1 $PKG/usr/man/man1/"${PDKSH_BINNAME}".1
mv $PKG/usr/man/man1/pdksh-sh.1 $PKG/usr/man/man1/"${PDKSH_BINNAME}"-sh.1
fi
BINNAME=${PDKSH_BINNAME:-pdksh}
strip --strip-unneeded $PKG/bin/"${BINNAME}"
gzip -9 $PKG/usr/man/man1/"${BINNAME}".1
gzip -9 $PKG/usr/man/man1/"${BINNAME}"-sh.1
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a \
Changelog.ksh-openbsd LEGAL README \
$PKG/usr/doc/$PRGNAM-$VERSION
cp $CWD/README $PKG/usr/doc/$PRGNAM-$VERSION/README.ksh-openbsd
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
Tras el shebang definimos las variables principales del paquete, como son
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) ARCH=i586 ;;
arm*) ARCH=arm ;;
*) ARCH=$( uname -m ) ;;
esac
fi
Detectamos automáticamente la arquitectura del equipo si el usuario no la tiene definida.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
fi
Es una parte muy útil para herramientas de gestión de paquetes como
Después definirá los entornos de trabajo en
if [ "${ARCH}" == "i586" ];then
SLKCFLAGS='-march=i586 -mtune=i686'
LIBDIRSUFFIX=""
elif [ "$ARCH" == "i686" ]; then
SLKCFLAGS="-march=i686 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "${ARCH}" == "x86_64" ];then
SLKCFLAGS='-fPIC'
LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
LIBDIRSUFFIX=""
fi
En este punto definimos las variables
A partir de aquí podemos decir que la técnica se inicia, una vez realizadas las parametrizaciones técnicas iniciales. La línea que contiene
rm -Rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -Rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \
-exec chmod 755 {} \+ -o \
\( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
-exec chmod 644 {} \+
Entonces elimina el directorio
Entonces, aplicamos una "reparación de permisos", que inicia cambiando el propietario recursivamente a
Después, con
case "$(ps -o stat= -p $$)" in
*+*) make check ;; # running in foreground
*) echo '*** Not running "make check" because we are in the background.' ;;
esac
Es entonces cuando iniciamos la fase de compilación. En términos generales se realiza directament el
Entonces, sí hacemos el make con
if [ -n "${PDKSH_BINNAME}" ];then
mv $PKG/bin/pdksh $PKG/bin/"${PDKSH_BINNAME}"
mv $PKG/usr/man/man1/pdksh.1 $PKG/usr/man/man1/"${PDKSH_BINNAME}".1
mv $PKG/usr/man/man1/pdksh-sh.1 $PKG/usr/man/man1/"${PDKSH_BINNAME}"-sh.1
fi
BINNAME=${PDKSH_BINNAME:-pdksh}
Si el usuario define la variable de entorno
strip --strip-unneeded $PKG/bin/"${BINNAME}"
gzip -9 $PKG/usr/man/man1/"${BINNAME}".1
gzip -9 $PKG/usr/man/man1/"${BINNAME}"-sh.1
El comando
Después, comprime las páginas de manual con
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a \
Changelog.ksh-openbsd LEGAL README \
$PKG/usr/doc/$PRGNAM-$VERSION
cp $CWD/README $PKG/usr/doc/$PRGNAM-$VERSION/README.ksh-openbsd
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
Y finalmente, creamos el directorio con la documentación, copiamos ésta y, encima, copiamos el propio SlackBuild dentro de dicha carpeta. Esto está encarecidamente recomendado por las buenas prácticas de un SlackBuild, puesto que permite al usuario final ver cómo se compiló el paquete en cualquier momento. Es útil además para depuraciónh y para reproducción, en caso necesario.
Además, crea el directorio
Como hemos visto, el contenido de un SlackBuild es muy completo, contando con todas las fases de despliegue de un software: preparación, parametrización, configuración de compilación o pre-compilación, extracción y limpieza, compilación, instalación, optimización, documentación, empaquetado final... Se trata de un guión y hoja de ruta poderosa para el usuario de Slackware, desde luego, y muy útil y práctica en el día a día de la administración de este sistema.