# Empacotamento - RPM

O RPM Package Manager (RPM) antigo Red Hat Package Manager e o gerenciador de pacotes oficial do Red Hat Linux e atualmente usado por diversas distribuições linux. O nome RPM vem do formato do pacote gerado no final do processo de empacotamento, o .rpm.

## História

O RPM foi escrito em 1997 por Marc Ewing e Erik Troan depois de experiencias com os gerenciadores de pacotes RPP, PMS e PM. A primeira versão do RPM tinha diversas vantagens em relação aos outros gerenciadores de pacotes, entre elas: facilidade de uso, facilidade de reconstruir diversos pacotes automaticamente, e o controle de diversos arquivos de configuração.
Apesar das facilidades do RPM, ele era escrito em Pearl, o que o tornava lento demais para o controle de inúmeros pacotes, era grande demais e não possuía flexibilidade tanto arquiteturalmente quando da extensão do pacote gerado. Depois das experiencias com o RPM V1 Marc e Erik reescreveram todo o código do package manager em C o que melhorou o desempenho e tornou possível o lançamento da nova versão que e utilizada ate hoje.

## Dependências Necessárias

E necessário cumprir os seguintes requisitos para gerar pacotes RPM.
* Ter um sistema compatível com o RPM (Fedora, CentOS, Red Hat Linux)
* Ter instalado os pacotes rpmbuild e rpmdevtools

### Criando o Ambiente de Empacotamento

A seguinte árvore de diretórios será criada:
Cada pasta possui um função definida para a construção dos pacotes:
* BUILD - Onde os arquivos de build são descompactados.
* BUILDROOT - Onde a build do pacote e feita.
* RPMS - Contem o pacote com os arquivos binários gerados pelo processo de build.
* SOURCES - Contem os arquivos fonte para a geração do pacote.
* SPECS - Contem o arquivo spec que controla a build do pacote.
* SRPMS - Contem o pacote com os arquivos fonte.
Apos a criacao dos diretorios e necessario colocar o tarball (arquivo compactado) dentro da pasta SOURCES.

## O Spec File
### O Preamble

O Preamble contem as informações básicas do pacote e das pessoas que estão construindo o pacote.

### O %prep

Parte de preparação da build, e nesta parte que o os arquivos são descompactados. Geralmente nesta parte a única flag que e usada e o %setup, a flag -q indica quiet que impede de todas as mensagens serem escritas no terminal.

### O %build

A parte de build segue o padrão de configuração do GNU , e faz as instalações sob o prefixo /usr/local. Neste exemplo a build do pacote e bem simples e pode ser feita apenas utilizando o Makefile.
O _smp_mflags contem geralmente apenas a flag -j para o Makefile, o que controla o numero de jobs rodando simultaneamente para a execução.
A macro %configure se expande com as flags e macros do GNU autoconf, automake e libtool.

### O %install

Nesta sessão geralmente são executados os scripts para a instalação. Esse script pode ser um .sh' um Makefile; ou um conjunto de comandos do shell para a criação dos arquivos necessários. Neste exemplo, estamos usando o make.

### O %files

Contem a lista de arquivos que estará no pacote. Todos os arquivos que serão instalados deverão estar listados aqui.

### O %changelog

Nesta sessão estão as descritas as mudanças que ocorreram de uma versão para outra do pacote, e importante descrever o que foi alterado e quais são as novas funcionalidade implementadas, bugs corrigidos, etc.

## Criando o Pacote

Caso todos esses passos estejam corretos agora basta criar o seu pacote usando o rpmbuild.
Apos o comando, o processo de build sera iniciado e caso tudo corra bem, você pode terá um pacote RPM e um SRPM nos respectivos diretórios dentro de rpmbuild.