Empacotamento Para Slackware

Autor: Jefferson 'Slackjeff' Rocha
Atualização: 18/02/2018

Ajustes

Antes começar a compilação é muito importante criarmos um diretório específico somente para isto. Eu sempre utilizo dois diretórios onde faço todo os processos. o primeiro diretório fica dentro do meu home, e se chama 'src'; o segundo fica dentro dos temporários ou para os mais chegados 'tmp', uma pasta chamada 'build', lá dentro é onde normalmente acontece os meus empacotamentos manuais!

Eu tenho uma variável global chamada 'src' e outra 'compi', então para não precisar sempre ficar chamando todo diretório '~/src' e '/tmp/build' eu somente chamo as variáveis '$src' e '$compi', mais prático não é?

Então o primeiro passo é criar estes diretórios caso você não o tenha, se preferir chamá-los de outro nome fique a vontade.

Primeiramente vamos criar os diretórios em sua '/home/usuario' e '/tmp'.

$ mkdir /tmp/build
$ mkdir ~/src

Após isto vamos criar as variáveis e para finalizar vamos exportar elas para ficar disponível em qualquer terminal, ou console.
Criando a variável 'src' e 'compi':

$ compi="/tmp/build"
$ src="/home/slackjeff/src"

Agora vamos exportá-las:

$ export $compi
$ export $src

Caso deseje sempre carregar estas variáveis como uma variável ambiente, faça o seguinte. Abra o /etc/profile com seu editor favorito e as declare.

É interessante também fazer um comentário para ficar mais atrativo para depois você não ficar perdido! Acontece.

# nano /etc/profile

Na última linha insira o comentário, lembre que um comentário deve começar com '#' tralha, e na linha debaixo exporte e declarar a variável 'compi' ou o nome da sua preferência.

# Variável para meu build
export src="/home/slackjeff/src"
export compi="/tmp/build"

Pronto, na próxima inicialização do sistema esta variável se tornará ambiente e sempre será carregada no boot.

Caso queira deixar esta variável disponível apenas para o seu usuário, faça o mesmo procedimento no '.bashrc', que está localizado em seu 'home'.

Caso opte pelo .bashrc não esqueça de remover no /etc/profile.

Ótimo, nosso próximo passo agora é desempacotar o nosso fonte dentro do nosso diretório src, que está localizado em nossa home.

Então vamos brincar, vamos desempacotar já enviando para '/home/slackjeff/src' o meu ambiente de compilação, lembrando que não precisa de root, não utilize ele em vão!

Neste exemplo irei usar o fonte "fictício" do leafpad.

$ cd ~/Downloads && tar -xvf leafpad.tar.gz -C "$src" && cd "$src" && ls

NOTA: eu utilizo sempre aspas duplas "", para não ter problema da variável expandir e estar nula por exemplo, não vai ter problemas neste caso, mas é sempre interessante você usar e se acostumar a sempre utilizar as aspas.

Outro ponto que vale a pena ser falado é sobre o && ou 'E COMERCIAL'.

É mais inteligente utilizar este cara que o ; 'PONTO E VIRGULA', mas porque Jefferson?

Simples, com && ele só executará o segundo comando se o primeiro ter status de saída '0' ou simplificando, não tendo erros.

Se o status for diferente de '0' ele não continuará, diferentemente do ';' que por sua vez continua mesmo tendo falhado o comando anterior.

Como já listamos o diretório '/home/slackjeff/src', sabemos que nosso source está em uma pasta chamada 'leafpad', vamos entrar nesta pasta agora e ir para o próximo tópico.

A COMPILAÇÃO

Normalmente existe na internet uma "receita" de bolo que nada mais é que rodar o configure, make e make install.

Isto é bem famoso quando se trata da própria compilação do kernel por exemplo. O que ninguém te falou ainda é que este método não é o correto! Primeiro que fazendo desta maneira, além de "sujar" a sua máquina, o pkgtool não conseguirá remover o pacote depois.

Para isto é interessante criarmos sempre um pacote 'txz' ou o antigo formato 'tgz' para que o pkgtool consiga identifica-lo e remove-lo com sucesso. Outro ponto é configurar o configure de uma maneira mais "padrão".

 ./configure         \
--prefix=/usr        \
--sysconfdir=/etc    \
--localstatedir=/var \
--mandir=/usr/man    \

Este é um exemplo do configure que eu praticamente sempre uso! Quando falo praticamente é quase sempre, mas não que esta seja a nova receita.

Normalmente estes 4 caras (prefix, sysconfdir, localstatedir, mandir) ficam sempre permanentes em minhas compilações, pois assim estou setando o básico para não bagunçar meu sistema.

As outras opções eu leio no README e INSTALL.

NOTA: você sempre deve ler se existir o README ou INSTALL que está presente no fonte do programa que você está compilando. Se for um programador decente ele irá arquivar todas opções do configure nestes arquivos (README e INSTALL). Veja quais as melhores opção para sua necessidade e bote pra rodar.

Após você ler o README e INSTALL e encontrar todos parâmetros disponíveis e anotar os que mais se adequam a sua necessidade, vamos chamar o configure.

$  ./configure --prefix=/usr \
--sysconfdir=/etc            \
--localstatedir=/var         \
--mandir=/usr/man            \

Se tudo ocorreu bem não irá aparecer nenhum erro, se aparecer provavelmente falta alguma dependência, fica ao seu cargo buscar esta dependência para conseguir prosseguir com a compilação.

Agora rodamos o 'make' para começar a compilação, dependendo da máquina e do pacote pode demorar bastante tempo!

$ make

Agora ao invés de rodar o simples 'make install', vamos incrementá-lo com 'DESTDIR', este cara burla o sistema, e ao invés de fazer a instalação do pacote em 'usr' ele instala em um diretório específico que você passar.

Ou seja, tudo do pacote vai estar dentro da pasta que você especificar, podemos assim editar algumas coisas e incrementar.

Vamos passar o destino com a variável '$compi', que nada mais é que nosso diretório '/tmp/build'.

$ make install DESTDIR="$compi"

Feito! Agora vamos entrar na pasta:

$ cd $compi

Vamos criar uma pasta chamada 'install', que dentro conterá todos arquivos necessários para fazer um empacotamento adequado:

$ mkdir install && cd install

SLACK-DESC

Já dentro da pasta 'install' criamos o arquivo 'slack-desc', o slack-desc nada mais é que um arquivo que contém toda informação/descrição do pacote.

É de extrema importância seguir as normas, a uma régua chamada handy-ruler que contém 77 colunas, você não deve ultrapassar.

Em appname use o nome do pacote, o mesmo deve se utilizar na hora de gerar o pacote, se não dá problema! :)

Exemplo do slack-desc do leafpad:
       |-----handy-ruler------------------------------------------------------|
leafpad: leafpad (short desc)
leafpad:
leafpad: Description of application - this description should be fairly
leafpad: in-depth; in other words, make it clear what the package
leafpad: but don't get too verbose.
leafpad: This file can have a maximum of eleven (11) lines of text preceded by
leafpad: the "leafpad: " designation.
leafpad:
leafpad: It's a good idea to include a link to the application's homepage too.
leafpad:

Crie o slack-desc com seu editor de preferência:

$ nano slack-desc

Insira todas informações e salve e feche e vamos para o próximo tópico!

STRIP E MANUAL

Ótimo, agora está quase na hora de criar nosso pacote! MAS falta alguma coisa! Vamos usar o 'strip' para tirar os debugs, assim reduzindo nosso pacote um bocado. Repita 2x o mesmo procedimento do strip.

$ strip -s /tmp/build/usr/lib/* /tmp/build/usr/bin/*
$ strip -s /tmp/build/usr/lib/* /tmp/build/usr/bin/*

Caso seu pacote tenha o diretório 'man', compacte-o com o gzip para ficar mais leve ainda, para isto faça:

$ gzip -9 /tmp/build/usr/man/man?/*.?

Ótimo, agora vamos para o próximo tópico, finalmente vamos criar nosso pacote! Ansioso? Vamos lá!

CRIANDO O PACOTE

Antes de tudo, entre como root, pois agora finalmente precisamos utilizá-lo.

$ su

Vou explicar um pouco sobre como funciona o pacote do Slackware! O pacote do Slackware nada mais é que um arquivo comprimido, no exemplos:

NOTA: o formato 'txz' é o novo padrão do Slackware, por ter uma compactação mais eficiente, tanto no tamanho como na velocidade. Então use sempre o formato txz para criar seus pacotes.

Podemos simplesmente usar o método tradicional com o tar passando alguns parâmetros para compactar o esquema todo ou usar uma ferramenta do pkgtool chamada 'makepkg'.

Ela faz todo "processo" de compactar e deixar o pacote nos trinques. Como root rode:

# makepkg ../app-version-arch-build.txz
Explicação sobre a identificação:

O Pacote foi gerado uma pasta acima, agora é só instalar!
Se não tiver o pacote na máquina, use o installpkg. Caso já tenha e está compilando uma versão mais atual, use o upgradepkg com o parâmetro 'install-new'.

Está opção do upgradepkg faz o seguinte, se você já tem o pacote no sistema ele vai verificar se está em uma versão superior, se estiver ele não faz nada, se estiver em uma versão mais antiga ele irá atualizar.
Se o pacote não estiver no sistema ele vai fazer a instalação. Está é a forma mais "segura" de instalar/atualizar um pacote.

NOTA: Se caso o pacote que você compilo e criou estiver em uma versão antiga ele irá fazer o Downgrade. Tome cuidado.

Bom divertimento.