Slackbuilds
De Wiki Eslack
Slackbuilds:
Como antes expliqué, un slackbuild es un script que compila automáticamente un source para acabar formando un paquete tgz o tbz posible de ser instalado en cualquier ordenador. Los slackbuilds están pensados para Slackware, de ahí su nombre, pero pueden usarse en distros que derivan de este, así como en *BSD. Abajo adjunto un Slackbuild genérico que corre bajo bash, el cual hice para que ustedes puedan compilar cualquier tarball. Le he agregado ademas muchas comentarios entre lineas, a fin de que entiendan que función cumple cada sección del script. Por supuesto que deberán editar algunas partes para cada source en cuestión, pero he intentado poner muchas variables de manera que la sección a editar sea pequeña en comparación con otros slackbuilds que pueden encontrar por la red. Por lo anterior, les recomiendo lean el script en su totalidad.
Ahora explicaré como se usa:
Deben copiarlo a un editor de texto y editar las partes que interesan (ver mas adelante), luego guardarlo como nombre.sh. Les recomiendo que usen el editor kwrite, y que una vez lo cierren, vuelvan a abrir el script, con esto verán como se colorea. Presten atención a que todos los comentarios se hallen en color gris, es decir que no representan función. Esto ya que en el proceso de copy/paste puede pasar que algunas lineas se desfacen y por tanto, se decomenten provocando errores. Se darán cuenta si esto último sucede por lo que arroje la shell, que primero comprueba el script antes de lanzar sus comandos.
Las partes a editar son:
NAME y VERSION:
En NAME debe ir el nombre del tarball y en versión la VERSION, la versión. Atención, no incluyan la versión en el nombre. En aras de la claridad los ilustraré con dos ejemplos:
1)El tarball se llama megabyte-0.1.2.tar.gz El script debe quedar:
NAME=megabyte VERSION=0.1.2
2)El tarball se llama magebyte-gay-0.1.2-9 El script debe quedar
NAME=megabyte-gay VERSIÓN=0.1.2-9
Ustedes quizá se pregunten como hace el script para identificar el tarball, muy sencillo, con esta linea:
${NAME}-${VERSION}.tar.gz #Noten que el guion que separa nombre de versión esta incluido en la orden.
TARBALL: Si van a compilar un tar.gz, tar.bz o tar.bz2, deben especificarlo en esa variable.
CREAR: Todavía no se me ocurre un buen nombre para esta variable, si “TARBALL” es igual a tar.gz (recuerden que usteden deben especificarlo), entonces adjudiquen a la variable “CREAR” tgz. SI “TARBALL” es igual a tar.bz o tar.bz2 entonces en “CREAR” deben apuntar tbz.
ARCH: Aqui pongan la denominación de su arquitectura, el script usará esta variable en la sección if/else.
Como en otra oportunidad mensioné, no todos los sources agregan código para todas las arquitecturas, por lo que pueden optimizar para una arquitectura compatible. Ejemplo:
Si tengo un intel pentium o AMD de 32 bit, puedo usar las arquitecturas i348, i486, i585 e i686. Si no saben que les conviene poner en esta variable, lean el subtítulo “Que ARCH y SLKCFLAGS usar:”, lo ecuentrarán mas abajo.
IF/ELSE: Mas bien debería denominar a esta sección como if/elif porque en este caso no hay else. “if” no es mas que una condición, es un comando que significa tanto en ingles como en bash (y otros lenguajes) “si”, en el contexto de “si x cosa sucede”. Es decir que el comando if pone una condición, la cual irá seguida del comando then, que significa “entonces” (tanto en bash como en ingles). Luego de then, siempre se esgrime una orden. Ejemplo:
if [ "$ARCH" = "i386" ]; then SLKCFLAGS="-O2 -march=i386 -mcpu=i686"
Traducido: si la arquitectura es i386, entonces compila para que funcione sobre sobre arquitecturas compatibles con i386 (no funcionará en un Sparc por ejemplo) y agrega código para optimizar a i686. Por tanto solo editen alguno de los if/else, cambiando las lineas que interesan a la arquitectura, en el caso del ejemplo, cambien las i386 por lo que pusieron en ARCH=. Ademas pueden aquí agregar otros flags, vean que para athlon-xp y pentium 4, puse “... -03 y fomite frame pointer”. Para saber que flags poner, reparen en lo que he puesto bajo el subtítulo: “Que ARCH y SLKCFLAGS usar:”. El “-03” representa el nivel de optmización, va de -01 a -03, a mayor nivel, mas optimización, pero también aumenta la probabilidad de error.
Que ARCH y SLKCFLAGS usar:
Para saber como denominar a su procesador, esto es, lo que debe ir en ARCH, pueden valerse de google, usando por ejemplo, parametros de busqueda tales como: flags para x procesador, donde x es su procesador. Otros parámetros de busqueda podrían ser “ x + ARCH= “ o “x +march=” “x +mcpu=” ““cflags para AMD 64” (con y sin comillas), obviamente deben cambiar x por su procesador. Hagamos un ejercicio de busqueda. He puesto en google “cflags para AMD 64” (sin comillas), y mi primer resultado fue esta web: http://www.gentoo.org/doc/es/gentoo-amd64-faq.xml#cflags Era un FAQ de Gentoo, y una de las FAQ fue “¿Que flags debo usar para mi AMD 64”, pues esto es lo que resa:
Puede usar CFLAGS simples para prevenir futuros problemas en su sistema. Por ejemplo, puede usar CFLAGS="-march=k8 -O2 -pipe" para Athlon64 o Opteron y CFLAGS="-march=nocona -O2 -pipe" para un procesador EM64T. Si pretende usar una jaula (chroot) de 32 bits debería usar CFLAGS="-march=athlon-xp -O2 -pipe -msse2" para un procesador AMD64; para un EM64T, se podría usar CFLAGS="-march=pentium4 -O2 -pipe" dentro del chroot.
En este caso como el script es genérico, tomara los flags que les demos como CFLAGS y CXXFLAGS, no quise complicarles demaciado. Aquí averiguamos (ya que esta es una web oficial, con información fiable) muchas cosas de distintos procesadores, como mi caso era un Athlon64, en ARCH debo poner k8. Quiza ya hayan inferido que ARCH es lo que asigna valor a march, y que por lo tanto, son equivalentes en lo que al script respecta. Ahora bien, lo que resta es saber que poner en los if/else, pues me valdré de la misma búsqueda que hice en google. Deben saber que los SLKCFLAGS son variables que dan valor a los CFLAGS y CXXFLAGS del script, por tanto pondré en SLKCFLAGS lo mismos CFLAGS que leo en el FAQ de Gentoo citado arriba. Obviamente en ARCH ira K8.
if [ "$ARCH" = "k8" ]; then SLKCFLAGS="-march=k8 -O2 -pipe"
¿Me explico? No son muchos, mas bien pocos, pero para comenzar estan perfectos. También pueden hacer $ cat /proc/cpuinfo en una shell, reparando en “flags:”. Cuidado, no es para que los pongan todos, es mas, yo no uso casí ninguno, busquen info al respecto de que significa cada flag.
Este es el script, recuerden, lo guardan como nombre.sh en una carpeta, donde luego colocaran el tarball que deseen compilar, junto con el slack-desc (un pequeño archivo de texto que mas abajo explico como crear).. No olviden mi consejo sobre usar KWrite.
#!/bin/sh ############################# ## Creado por Rubiño para http://www.crackergt.net> ## Se trata de un script genérico, debe ajustarse a cada ## source, aunque funciona para la mayoría. ## Es recomendable que lea los comentarios. ## ## ############################################### #### En lo que sigue establecemos las variables ### CWD será igual a la variable de entorno pwd, que representa el directorio en el #que se encuentran al ejecutar el script, ## ### La variable TMP será igual al directorio /tmp y PKG # CWD=`pwd` if [ "$TMP" = "" ]; then TMP=/tmp fi ## Estas son otras variables, aquí están NAME, VERSION y ARCH, TARBALL #, es decir las que deben editar, recuerden NAME=aspell-es VERSION=0.50-2 TARBALL=tar.bz2 CREAR=tbz ARCH=${ARCH:-athlon-xp} BUILD=1jda PKG=$TMP/package-${NAME} ## La sección if/else, aquí agreguen o editen una cadena de if o elif, con su arquitectura. if [ "$ARCH" = "i386" ]; then SLKCFLAGS="-O2 -march=i386 -mcpu=i686" elif [ "$ARCH" = "athlon-xp" ]; then SLKCFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer" elif [ "$ARCH" = "pentium4" ]; then SLKCFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer" elif [ "$ARCH" = "s390" ]; then SLKCFLAGS="-O2" elif [ "$ARCH" = "x86_64" ]; then SLKCFLAGS="-march=x86_64 -O2" fi #fin de la sección if/else #Aquí eliminará el directorio $PKG si ya existe, y luego creará uno. #Descomprimirá el tarball. rm -rf $PKG mkdir -p $PKG cd $TMP rm -rf ${NAME}-${VERSION} if [ "$TARBALL" = "tar.gz" ]; then tar -xzvf ${CWD}/${NAME}-${VERSION}.${TARBALL} elif [ "$TARBALL" = "tar.bz" ]; then tar -xjvf ${CWD}/${NAME}-${VERSION}.${TARBALL} elif [ "$TARBALL" = "tar.bz2" ]; then tar -xjvf ${CWD}/${NAME}-${VERSION}.${TARBALL} fi cd ${TMP}/${NAME}-${VERSION} # acomodando los permisos chown -R root:root . find . -perm 666 -exec chmod 644 {} \; find . -perm 664 -exec chmod 644 {} \; find . -perm 600 -exec chmod 644 {} \; find . -perm 444 -exec chmod 644 {} \; find . -perm 400 -exec chmod 644 {} \; find . -perm 440 -exec chmod 644 {} \; find . -perm 777 -exec chmod 755 {} \; find . -perm 775 -exec chmod 755 {} \; find . -perm 511 -exec chmod 755 {} \; find . -perm 711 -exec chmod 755 {} \; find . -perm 555 -exec chmod 755 {} \; # Aquí dice que los CFLAGS y CXXFLAGS tomarán el valor de SLKCFLAGS # esgrimidos en la sección if/else. CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ ### Hace un ./configure, admite edición, pueden poner las opciones que ###quieran ./configure ### Hara un make e intalara todo en $PKG, esto sirve el terreno para crear #el paquete en el #direcotorio $·PKG (Arriba le dimos valor a PKG) make make install DESTDIR=$PKG ### Comienza a crear el paquete #Esto colocará las paginas man de haberlas en el directorio /usr/man del paquete. gzip -9 $PKG/usr/man/man?/*.? mkdir -p $PKG/usr/doc/${NAME}-${VERSION} # Ahora copiara los documentos AUTHORS COPYING ChangeLog INSTALL #AUTHORS NEWS README TODO VERSION FAQ en la carpeta fichero # # #/$PKG/usr/doc # Si estos docuementos no existen arrojará un error durante el proceso # pero de nuevo no se preocupen, neste continuara sin problemas. # pueden agregar en las lista, nombres de documentos que se incluyan en el #tarball que desen copiar al paquete. cp -a AUTHORS COPYING ChangeLog INSTALL AUTHORS NEWS README TODO VERSION FAQ \ $PKG/usr/doc/${NAME}-${VERSION} ( cd $PKG find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null ) ### Esto preparará el directorio install, colocará en este el archivo de #descripción slack-desc. ### Recuerden que en el directorio debe figurar un archivo slack-desc, les #deje uno de ejemplo en el hilo donde publique el script: mkdir -p $PKG/install cat $CWD/slack-desc > $PKG/install/slack-desc ### Ahora creará el paquete y lo copiará a /root#### echo "El paquete se está creando:" cd $PKG makepkg -l y -c n ${TMP}/${NAME}-${VERSION}-${ARCH}-${BUILD}.${CREAR} cp ${TMP}/${NAME}-${VERSION}-${ARCH}-${BUILD}.${CREAR} /root/ echo Paquete creado, eliminando ficheros temporales. :P ### Packete creado, las siguientes lineas eliminan los ficheros obsoletos. . rm -rf ${TMP}/${NAME}-$VERSION rm -rf $PKG rm -rf ${TMP}/${NAME}-${VERSION}-${ARCH}-${BUILD}.${CREAR} echo "El paquete se ha copiado al directorio /root. Este script fue hecho para www.crackergt.net"
Ahora vamos a prepara el slack.desc::
Preparando el slack-desc:
Para crearlo abran un documento de texto din formato por ejemplo así:
# cd xxxx #donde xxx es la URL donde esta el slckbuild. . # pico slack-desc
y peguen esto:
|-----handy-ruler------------------------------------------------------| www.crackgt.net: $NAME $VERSION www.crackgt.net: Paquete creado por Fulano #Cambia fulano por tu nombre www.crackgt.net: www.crackgt.net: Pon aquí una descripción del paquete. www.crackgt.net: www.crackgt.net: www.crackgt.net: www.crackgt.net: www.crackgt.net: www.crackgt.net: www.crackgt.net: http://www.crackergt.net
Guardan cambios con Contrl X, luego presionan Y y confirman con ENTER. Ahora, si todavía no lo han hecho, peguen el tarball en el directorio donde guardaron el slackbuild y el slack-desc, de manera de tener los tres componentes en el mismo directorio:
Bien, sin cerrar esa Shell, continuamos como root en el mismo directorio donde tenermos el script. .
# chmod +x nombredelscript.sh # sh nombredelscript.sh #el slackbuild
El script se ejecutará. Luego:
# cd /root
# installpkg nombre_del_packete_creado # Vean la salida del script en la shell, en todo caso el nombre será ${NAME}-${VERSION}-${ARCH}-${BUILD}.tgz. Es decir, el equivalente de esas variables.
Nota, muchos slackbuilds que pueden encontrar por la web dejan el paquete en la carpeta /tmp, y no lo copian a /root, por lo tanto en esos casos:
# cd /tmp # installpkg paquete.tgz
Solo resta sepan que este script borrara el contenido de cualquier carpeta en /tmp que se llame package-${NAME} o NAME-VERSION, quiero decir que si el tarball se llama por ejemplo amule-0.2.tar.gz, se eliminara el contenido de los directorios “package-amule” y “amule-0.2” que se encuentren en /tmp. Se supone que en la variable NAME colocaron “amule” y en VERSION “2.0”. Todo ello dado que el slackbuild necesita crear esos directorios.
Estas lineas lo dictan:
rm -rf $PKG
mkdir -p $PKG
cd $TMP
rm -rf ${NAME}-${VERSION}
tar -zxvf ${CWD}/${NAME}-${VERSION}.tar.gz
Si todo sale bien, deberían ver una salida como esta. Vean que solo me arroja un error con los directorios de documentos, esto se debe a que para efectos de que copie el máximo numero de documentos, he puesto una lista medianamente larga que no siempre existe. De todas maneras eso no interfiere con el creado del paquete.
root@MyBox:/home/rubiño/p# sh rubiño.sh
aspell-es-0.50-2/
aspell-es-0.50-2/doc/
aspell-es-0.50-2/doc/README
aspell-es-0.50-2/info
aspell-es-0.50-2/README
aspell-es-0.50-2/configure
aspell-es-0.50-2/Copyright
aspell-es-0.50-2/es.multi
aspell-es-0.50-2/es.dat
aspell-es-0.50-2/es.cwl
aspell-es-0.50-2/Makefile.pre
aspell-es-0.50-2/español.alias
aspell-es-0.50-2/spanish.alias
aspell-es-0.50-2/esponol.alias
aspell-es-0.50-2/COPYING
Finding Dictionary file location ... /usr/lib/aspell
Finding Data file location ... /usr/lib/aspell
word-list-compress d < es.cwl | aspell --lang=es create master ./es.rws
mkdir -p /tmp/package-aspell-es/usr/lib/aspell/
cp es.rws es.multi español.alias esponol.alias spanish.alias /tmp/package-aspell-es/usr/lib/aspell/
cd /tmp/package-aspell-es/usr/lib/aspell/ && chmod 644 es.rws es.multi español.alias esponol.alias spanish.alias
mkdir -p /tmp/package-aspell-es/usr/lib/aspell/
cp es.dat /tmp/package-aspell-es/usr/lib/aspell/
cd /tmp/package-aspell-es/usr/lib/aspell/ && chmod 644 es.dat
gzip: /tmp/package-aspell-es/usr/man/man?/*.?: No such file or directory
cp: cannot stat `AUTHORS': No such file or directory
cp: cannot stat `ChangeLog': No such file or directory
cp: cannot stat `INSTALL': No such file or directory
cp: cannot stat `AUTHORS': No such file or directory
cp: cannot stat `NEWS': No such file or directory
cp: cannot stat `TODO': No such file or directory
cp: cannot stat `VERSION': No such file or directory
cp: cannot stat `FAQ': No such file or directory
Usage: strip <option(s)> in-file(s)
Removes symbols and sections from files
The options are:
-I --input-target=<bfdname> Assume input file is in format <bfdname>
-O --output-target=<bfdname> Create an output file in format <bfdname>
-F --target=<bfdname> Set both input and output format to <bfdname>
-p --preserve-dates Copy modified/access timestamps to the output
-R --remove-.=<name> Remove . <name> from the output
-s --strip-all Remove all symbol and relocation information
-g -S -d --strip-debug Remove all debugging symbols & sections
--strip-unneeded Remove all symbols not needed by relocations
--only-keep-debug Strip everything but the debug information
-N --strip-symbol=<name> Do not copy symbol <name>
-K --keep-symbol=<name> Only copy symbol <name>
-w --wildcard Permit wildcard in symbol comparison
-x --discard-all Remove all non-global symbols
-X --discard-locals Remove any compiler-generated symbols
-v --verbose List all object files modified
-V --version Display this program's version number
-h --help Display this output
--info List object formats & architectures supported
-o <file> Place stripped output into <file>
strip: supported targets: elf32-i386 a.out-i386-linux efi-app-ia32 elf64-x86-64 elf64-little elf64-big elf32-little elf32-big srec symbolsrec tekhex binary ihex trad-core
Usage: strip <option(s)> in-file(s)
Removes symbols and sections from files
The options are:
-I --input-target=<bfdname> Assume input file is in format <bfdname>
-O --output-target=<bfdname> Create an output file in format <bfdname>
-F --target=<bfdname> Set both input and output format to <bfdname>
-p --preserve-dates Copy modified/access timestamps to the output
-R --remove-.=<name> Remove . <name> from the output
-s --strip-all Remove all symbol and relocation information
-g -S -d --strip-debug Remove all debugging symbols & sections
--strip-unneeded Remove all symbols not needed by relocations
--only-keep-debug Strip everything but the debug information
-N --strip-symbol=<name> Do not copy symbol <name>
-K --keep-symbol=<name> Only copy symbol <name>
-w --wildcard Permit wildcard in symbol comparison
-x --discard-all Remove all non-global symbols
-X --discard-locals Remove any compiler-generated symbols
-v --verbose List all object files modified
-V --version Display this program's version number
-h --help Display this output
--info List object formats & architectures supported
-o <file> Place stripped output into <file>
strip: supported targets: elf32-i386 a.out-i386-linux efi-app-ia32 elf64-x86-64 elf64-little elf64-big elf32-little elf32-big srec symbolsrec tekhex binary ihex trad-core
El paquete se está creando:
Slackware package maker, version 2.1.
Searching for symbolic links:
No symbolic links were found, so we won't make an installation script.
You can make your own later in ./install/doinst.sh and rebuild the
package if you like.
This next step is optional - you can set the directories in your package
to some sane permissions. If any of the directories in your package have
special permissions, then DO NOT reset them here!
Would you like to reset all directory permissions to 755 (drwxr-xr-x) and
directory ownerships to root.root ([y]es, [n]o)? n
Creating tar file aspell-es-0.50-2-athlon-xp-1jda.tbz.tar...
./
usr/
usr/doc/
usr/doc/aspell-es-0.50-2/
usr/doc/aspell-es-0.50-2/README
usr/doc/aspell-es-0.50-2/COPYING
usr/lib/
usr/lib/aspell/
usr/lib/aspell/es.multi
usr/lib/aspell/es.dat
usr/lib/aspell/es.rws
usr/lib/aspell/español.alias
usr/lib/aspell/spanish.alias
usr/lib/aspell/esponol.alias
tar-1.13: aspell-es-0.50-2-athlon-xp-1jda.tbz.tar is the archive; not dumped
install/
install/slack-desc
Gzipping aspell-es-0.50-2-athlon-xp-1jda.tbz.tar...
Renaming aspell-es-0.50-2-athlon-xp-1jda.tbz.tar.gz to aspell-es-0.50-2-athlon-xp-1jda.tbz...
Moving aspell-es-0.50-2-athlon-xp-1jda.tbz to /tmp...
Package creation complete.
Paquete creado, eliminando ficheros temporales. :P
El paquete se ha copiado al directorio /root. Este script fue hecho para www.crackergt.net
Aquí tenemos varias webs con Slackbuilds específicos de cada tarball:
http://www.slackbuilds.net/ http://www.slackbuilds.org/ http://www.selkfoster.com.ar/downloads/slackbuilds/ http://slack.sarava.org/slackbuilds/ Para enterarse de que se trata este proyecto, como usar los scripts y demás: http://slack.sarava.org/wiki/Main/SlackBuilds (en portugués)
Mas Slackbuilds:
http://pkgsismik.free.fr/slackbuilds/ http://www.selkfoster.com.ar/downloads/slackbuilds/ http://www.slackware.com/~alien/slackbuilds/ http://poiroud.free.fr/linux/slackbuild/ http://alienbase.nl/slackware/slackbuilds/ http://alienbase.nl/slackware/restricted_slackbuilds/ http://slackbuilds.rlworkman.net/ http://slackbuild.strangeworlds.co.uk/ http://www2.linuxpackages.net/packages/SlackBuilds/
Para PPC:
http://distro.ibiblio.org/pub/linux/distributions/amigolinux/download/Docs/PPC-SlackBuilds/
Redactado por Rubiño para crackergt,net
Convenio de OpenEslack para la creacion de SlackBuilds.
Aqui definiremos los convenios propios de OpenEslack para la creacion de SlackBuilds, y como el principal pongo el de prefix.
* Todo ./configure se hace con --prefix=/usr/local o --prefix=/opt
Ventajas?:
- La base de pkg's oficiales queda intacta, por lo tanto no probocara conflictos en futuras actualizaciones. - Tener las cosas personalizas y ordenadas.

