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 editar

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 editar

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 editar

$ sudo yum install rpmbuild rpmdevtools git
$ rpmdev-setuptree

A seguinte árvore de diretórios será criada:

 ├── rpmbuild
   ├── BUILD
   ├── BUILDROOT
   ├── RPMS
   ├── SOURCES
   ├── SPECS
   └── SRPMS

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.

$ git archive --format=tar.gz --prefix=nomedapasta-versao/ tag/branch >> nomedoarquivo.tar.gz
$ mv nomedoarquivo.taz.gz rpmbuild/SOURCES/

O Spec File editar

O Preamble editar

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

#
# Example spec file for cdplayer app...
#
Summary: A CD player app that rocks!
Name: cdplayer
Version: 1.0
Release: 1
Copyright: GPL
Group: Applications/Sound
Source: ftp://ftp.gnomovision.com/pub/cdplayer/cdplayer-1.0.tgz
URL: http://www.gnomovision.com/cdplayer/cdplayer.html
Distribution: WSS Linux
Vendor: White Socks Software, Inc.
Packager: Santa Claus <sclaus@northpole.com>
%description
It slices!  It dices!  It's a CD player app that
can't be beat.  By using the resonant frequency
of the CD itself, it is able to simulate 20X
oversampling.  This leads to sound quality that
cannot be equaled with more mundane software...
         

O %prep editar

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.

%prep
 %setup -q

O %build editar

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.

%build
 %configure
 make %{?_smp_mflags}

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.

 CFLAGS="${CFLAGS:--O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic}" ; export CFLAGS ; 
 CXXFLAGS="${CXXFLAGS:--O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic}" ; export CXXFLAGS ; 
 FFLAGS="${FFLAGS:--O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -I/usr/lib64/gfortran/modules}" ; export FFLAGS ; 
 
 FCFLAGS="${FCFLAGS:--O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -I/usr/lib64/gfortran/modules}" ; export FCFLAGS ; 
 LDFLAGS="${LDFLAGS:--Wl,-z,relro }"; export LDFLAGS; 
 [ "1" == 1 ] && [ "x86_64" == ppc64le ] && /usr/lib/rpm/redhat/libtool-handle-ppc64le.sh ; 
 for i in $(find . -name config.guess -o -name config.sub) ; do 
     [ -f /usr/lib/rpm/redhat/$(basename $i) ] && /usr/bin/rm -f $i && /usr/bin/cp -fv /usr/lib/rpm/redhat/$(basename $i) $i ; 
 done ; 
 ./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu \
  --program-prefix= \
  --disable-dependency-tracking \
  --prefix=/usr \
  --exec-prefix=/usr \
  --bindir=/usr/bin \
  --sbindir=/usr/sbin \
  --sysconfdir=/etc \
  --datadir=/usr/share \
  --includedir=/usr/include \
  --libdir=/usr/lib64 \
  --libexecdir=/usr/libexec \
  --localstatedir=/var \
  --sharedstatedir=/var/lib \
  --mandir=/usr/share/man \
  --infodir=/usr/share/info


O %install editar

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.

%install
 rm -rf $RPM_BUILD_ROOT
 make install DESTDIR=%{buildroot}

O %files editar

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

%files
 %doc README.md CHANGELOG
 /usr/bin/%name

O %changelog editar

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 editar

Caso todos esses passos estejam corretos agora basta criar o seu pacote usando o rpmbuild.

$ rpmbuild -ba nomedopacote.spec

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.

Referencias editar

https://fedoraproject.org/wiki/How_to_create_an_RPM_package
http://www.rpm.org/max-rpm/ch-intro-to-rpm.html