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
editarO 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
editarE 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
editarO Preamble
editarO 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
editarParte 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
editarA 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
editarNesta 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
editarContem 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
editarNesta 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
editarCaso 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
editarhttps://fedoraproject.org/wiki/How_to_create_an_RPM_package http://www.rpm.org/max-rpm/ch-intro-to-rpm.html