A segunda maneira é um pouquinho mais trabalhosa pois envolve a criação de um SlackBuild - um script que automatiza a tarefa de compilar e criar um pacote.
Mas, como eu disse anteriormente, esta é a forma mais legal de se criar um pacote Slackware.
Vamos usar o mesmo exemplo (Beep Media Player). Em primeiro lugar, criamos outro diretório para nossa brincadeira, vamos colocar nele os fontes e criar dois arquivos.
O slack-desc já abordamos como deve ser editado. Vamos ao SlackBuild! Vou colocar o conteúdo aqui e inserir os cometários explanatórios dentro dele.
#!/bin/sh
# Como qualquer script, ele começa com a linha acima identificando
# o interpretador para este script.
# Slackware build script para o Beep Media Player
# Abaixo, incluímos uma licença ao script, colocando-o sob a GPL.
# Copyright 2008 Francisco Ambrozio <francisco_ambrozio@yahoo.com.br>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OROTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IFADVISED OF THE POSSIBILITY OF SUCH
# DAMAGE.
# Nas próximas linhas setamos certas variáveis que serão usadas no script.
APP=bmp
VERSION=0.9.7.1
ARCH=${ARCH:-i686}
BUILD=${BUILD:-1_custom}
# Aplicativo, versão, arquitetura e construção, respectivamente
CWD=$(pwd)
TMP=${TMP:-/tmp/build}
PKG=$TMP/package-$APP
# Criamos alguns diretórios para a compilação
# Definimos flags para a compilação
# Se estivéssemos construindo um pacote para um sistema com o gcc
# abaixo da versão 3.4.x, então precisaríamos usar a flag "-mcpu"
# ao invés de "-mtune"
if [ "$ARCH" = "i486" ]; then
SLKCFLAGS="-O2 -march=i486 -mtune=i686"
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
fi
# Iremos deletar quaisquer diretórios deixados por possíveis compilações
# passadas e (re)criaremos o diretório do pacote
rm -rf $PKG
mkdir -p $TMP $PKG
cd $TMP
# Extrairemos os fontes, se fosse um tar.bz2 usaríamos tar -jxvf
tar -zxvf $CWD/$APP-$VERSION.tar.gz
# Mudamos para o diretório extraído
cd $APP-$VERSION
# Mudaremos propriedade e permissões
chown -R root:root .
find . \
\( -perm 777 -o -perm 775 -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 {} \;
# Configuraremos.
# Aqui vai uma nota: você precisará ter extraído os fontes anteriormente
# em um diretório qualquer, para verificar as opções que pode (ou deve)
# habilitar para que o programa funcione corretamente. Apenas execute
# um ./configure --help e terá boa parte das informações necessárias.
# As que setei abaixo são "genéricas", funcionam em praticamente qualquer
# pacote, mas tem algumas que são bem específicas.
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
--prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--build=$ARCH-slackware-linux \
--host=$ARCH-slackware-linux
# Fizemos com estas opções que arquivos de configurações fossem para /etc,
# arquivos de estado (como logs, por exemplo) para /var e o resto para /usr
# Copilaremos e, se algo der errado, será abortado.
make || exit 1
# Instalaremos no diretório de construção do pacote
# E aqui vai outra nota, na verdade uma palavra de cautela:
# Nem todos Makefiles suportam a variável DESTDIR!
# Para saber se o pacote que deseja compilar possui, volte ao diretório
# onde temos os fontes extraídos e execute o comando:
# grep DESTDIR Makefile*
# Se a saída retornar alguma coisa, mesmo que não entenda nada é
# porque estamos no caminho certo.
# SEMPRE execute o processo manual citado anteriormente como USUÁRIO
# COMUM antes de rodar seu SlackBuild. - palavras de Robby Workman*!
# * Para que não sabe, Robby Workman é desenvolvedor do Slackware e
# um dos mantenedores do SlackBuild.org.
make install DESTDIR=$PKG
# Criaremos um diretório para a documentação
mkdir -p $PKG/usr/doc/$APP-$VERSION
# Copiaremos a documentação para o este diretório e ajustaremos as
# permissões
cp -a AUTHORS ChangeLog COPYING FAQ INSTALL README \
$PKG/usr/doc/$APP-$VERSION
find $PKG/usr/doc/$APP-$VERSION -type f -exec chmod 644 {} \;
# Aqui, novamente varia de caso para caso. Dê uma olhada no diretório dos
# fontes para saber quais arquivos copiar
# Abaixo copiamos também SlackBuild para o diretório de documentação
cat $CWD/$APP.SlackBuild > $PKG/usr/doc/$APP-$VERSION/$APP.SlackBuild
# Estamos quase lá! :-)
# Agora criaremos o diretório install e copiaremos o slack-desc para ele
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
# Se precisássemos de algum comando adicional à instalação do pacote
# do pacote instalado, seria necessário criarmos um arquivo de nome
# doinst.sh, com o conteúdo destes comandos e a linha abaixo deveria ser
# descomentada.
#cat $CWD/doinst.sh > $PKG/install/doinst.sh
# Mesmo do processo do manual, "stripar" bibliotecas e binários
( 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
)
# Comprimir man e info pages
if [ -d $PKG/usr/man ]; then
( cd $PKG/usr/man
find . -type f -exec gzip -9 {} \;
for i in $(find . -type l) ; do ln -s $(readlink $i).gz $i.gz ; rm $i ; done
)
fi
if [ -d $PKG/usr/info ]; then
gzip -9 $PKG/usr/info/*.info
rm -f $PKG/usr/info/dir
fi
# E finalmente, criamos o pacote!!!
cd $PKG
/sbin/makepkg -l y -c n $TMP/$APP-$VERSION-$ARCH-$BUILD.tgz