# Empacotamento RPM básico
### Empacotamento RPM

RPM pode significar a abreviatura de Red Hat Package Manager ou RPM Package Manager. É um sistema de gerenciamento de pacotes de software que é utilizado em todas as distribuições Red Hat(Fedora,Centos) e SUSE(OpenSuse). Este pode ser utilizado para instalar e desinstalar, atualizar, e criar pacotes.

### Instalação das dependências de empacotamento

Para manipulação de pacotes RPM é recomendado que se utilize um ambiente que seja tão “limpo” quanto possível. Para tal, recomenda-se a utilização de alguma forma de virtualização.
CentOS
Fedora

### Inicialização do processo de empacotamento

A seguinte linha de comando cria a estrutura de diretórios rpm-build para organização dos arquivos de configuração a serem utilizados no empacotamento.
/home/myuser/rpmbuild/
Diretório BUILD: Diretório onde serão compilados os arquivos durante o processo de `build` do pacote.
Diretório RPMS: Neste diretório serão mantidos os pacotes RPM gerados;
Diretório SOURCES: Neste diretório estarão todos os arquivos fonte compactados e patches a serem utilizados. É nesse diretório que estes arquivos serão buscados quando o comando `rpmbuild` for executado;
Diretório SPECS: Neste diretório serão mantidos os arquivos SPEC, arquivos de configuração utilizados durante o processo de build;
Diretório SRPMS: Neste diretório serão mantidos os arquivos SRPM(Source RPM).Um arquivo SRPM é um arquivo criado a partir da junção de um Tarball com um arquivo SPEC. O rpm permite que seja possível gerar um SRPM ao invés de um binário RPM.

### Geração de arquivo SPEC

Uma vez definida a estrutura de diretórios principal, é necessário gerar um arquivo SPEC do pacote. Este é o arquivo chave para empacotamento RPM, nele serão definidas todas as configurações e parâmetros a serem utilizados no processo de empacotamento. Resumidamente, o arquivo SPEC pode ser interpretado como uma receita que diz ao `rpmbuild` as instruções que definem o processo de construção do pacote. Um pacote RPM será o resultado da operação de aplicação das configurações de um arquivo SPEC sobre um tarball.
Os arquivos SPEC são divididos em duas partes principais: Preamble e body;

### Preamble

Metadados dos pacotes que representam tags em geral;
Name: Nome do pacote, este deve coincidir com o nome do arquivo SPEC;
Version: A versão mais atual deste pacote de software;
Release: Versionamento geralmente utilizado para definir diferentes pacotes quando o programa foi pouco ou não foi modificado.
Summary: Um breve resumo a respeito do pacote;
License: Licença a ser utilizada; (e.g: GPL-2,GPL-3, ...)
URL: Caminho completo para informações importantes sobre o software sendo empacotado. Em geral é uma boa prática colocar a URL para o repositório com a versão mais atual e estável do software;
Source0: Caminho ou URL para o arquivo fonte do projeto. Pode-se utilizar a sintaxe de macros para tal. e.g. :%{name}-%{version}.tar.gz
Patch0: Nome do primeiro patch a ser aplicado sobre o código fonte. Caso necessário adicionar mais patches pode-se criar diretivas com o número em sequência crescente. e.g. :Patch1,patch2.
BuildRequires: Lista de pacotes, separados por vírgulas ou espaços, que indicam as dependências necessárias ao processo de build do pacote.
Requires: Lista de pacotes, separados por vírgulas ou espaços, que indicam as dependências necessárias para que o pacote seja executado uma vez que já foi instalado.

### Body

Diretivas SPEC, que são seções representativas de cada etapa do empacotamento;
%description: Descrição completa do software empacotado;
%prep: Série de comandos a serem executados com o objetivo de preparar as condições necessárias ao processo de build;
%build: Série de comandos onde será efetivamente executado o processo de build do pacote(Compilação principal do pacote);
%install: Série de comandos para efetivamente realizar a instalação do pacote, e criar seus arquivos nos diretórios corretos;
%check: Série de comandos de teste do software;
%files: Descreve uma lista dos arquivos que serão instalados;
%changelog: Registro das mudanças ocorridas entre releases e versões dos pacotes;

### Preparar arquivos fonte (tarball)

1 - Clonar repositório do projeto ou os arquivos fontes já compactados no formato .tar.
2 - Caso seja um repositório Git, é importante gerar uma tag para o projeto para em seguida gerar o tarball vinculado àquela versão específica do software:
Uma vez gerados os arquivos fonte, estes devem ser colocados no diretório /SOURCES, onde este arquivo será procurado durante o processo de build.

### Buildar o pacote

Após o processo de build o pacote será gerado e movido para o diretório /RPMS.

### Referências:

RPM Packaging Guide. disponível em http://rpm-guide.readthedocs.io/en/latest/rpm-guide.html. Acessado em 09/04/2017 às 10:00;
RPM: O pacote mais rápido que você fará na vida. Criado por David Carlos. Contato: ddavidcarlos1392@gmail.com, davidcarlos.github.io;