Como criar um pacote GNU Hello World RPM no Fedora
RPM (um acrônimo recursivo para RPM Package Manager) é um sistema de gerenciamento de pacotes gratuito e de código aberto para Linux. Embora tenha sido originalmente criado para uso no Red Hat Linux, agora ele é usado em muitas distribuições Linux, como CentOS, Fedora e >OpenSuse. É importante ressaltar que o nome RPM refere-se ao programa gerenciador de pacotes e .rpm
é um formato de arquivo.
Neste artigo, explicaremos como escrever arquivos RPM, mostrando como criar facilmente pacotes de software fonte e binários simples, por exemplo, pacote RPM GNU “Hello World” no Fedora Linux distribuição. Presumimos que você tenha algum conhecimento básico de pacotes RPM pré-fabricados e do processo de construção de software de código aberto gratuito.
Instale ferramentas de desenvolvimento no Fedora
Vamos começar configurando o ambiente de desenvolvimento no Fedora Linux executando o seguinte comando para instalar as ferramentas necessárias para construir RPMs.
sudo dnf install fedora-packager @development-tools
Em seguida, adicione sua conta não privilegiada ao grupo ‘mock’ da seguinte forma (substitua tecmint pelo seu nome de usuário real). Isso permitirá que você teste o procedimento de construção em um chroot limpo.
sudo usermod -a -G mock tecmint
Agora, crie uma compilação RPM em seu diretório ~/rpmbuild
e verifique a compilação usando os comandos a seguir. Ele mostrará uma lista de subdiretórios, que contém o código-fonte do projeto, arquivos de configuração RPM e pacotes binários.
rpmdev-setuptree
tree ~/rpmbuild/
Aqui está a finalidade de cada diretório:
- BUILD – armazena vários diretórios %buildroot quando os pacotes são compilados.
- RPMS – conterá RPMs binários em subdiretórios de Arquitetura.
- FONTES – armazena arquivos de origem compactados e quaisquer patches, é aqui que o comando rpmbuild irá procurá-los.
- SPECS – armazena os arquivos SPEC.
- SRPMS – armazena o RPM de origem em vez de um RPM binário.
Construindo um RPM “Olá Mundo”
Nesta etapa, você precisa baixar o código-fonte (também conhecido como fonte “upstream”) do projeto Hello World que estamos empacotando, no arquivo ~/rpmbuild/SOURCE diretório com o seguinte comando wget.
cd ~/rpmbuild/SOURCES
wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz -P ~/rpmbuild/SOURCES
A seguir, vamos configurar o pacote RPM usando um arquivo .spec
(vamos chamá-lo de hello.spec
neste caso) no arquivo ~/rpmbuild/SPECS diretório, usando o programa rpmdev-newspec.
cd ~/rpmbuild/SPECS
rpmdev-newspec hello
ls
Em seguida, abra o arquivo hello.spec
usando seu editor favorito.
vim hello.spec
O modelo padrão deve ficar assim:
Name: hello
Version:
Release: 1%{?dist}
Summary:
License:
URL:
Source0:
BuildRequires:
Requires:
%description
%prep
%autosetup
%build
%configure
%make_build
%install
rm -rf $RPM_BUILD_ROOT
%make_install
%files
%license add-license-file-here
%doc add-docs-here
%changelog
* Tue May 28 2019 Aaron Kili
Vamos explicar brevemente os parâmetros padrão em um arquivo .spec
:
- Nome – usado para definir um nome para o pacote.
- Versão – deve espelhar o upstream.
- Release – números que você trabalha no Fedora.
- Resumo – é uma breve descrição do pacote em uma linha, a primeira letra deve ser maiúscula para evitar reclamações do rpmlint.
- Licença – verifique o status da licença do software inspecionando os arquivos de origem e/ou seus arquivos de LICENÇA e/ou conversando com os autores.
- URL – especifica a página inicial do pacote de software.
- Source0 – especifica os arquivos de origem. Pode ser um URL direto ou um caminho do código-fonte compactado do software.
- BuildRequires – especifica as dependências necessárias para construir o software.
- Requer – especifica as dependências necessárias para executar o software.
- %prep – é usado para criar o ambiente para construção do pacote rpm.
- %build – é usado para compilar e construir os códigos-fonte.
- %install – é usado para instalar os programas. Ele lista os comandos necessários para copiar o arquivo resultante do processo de construção para o diretório BUILDROOT.
- %files – esta seção lista os arquivos fornecidos pelo pacote, que serão instalados no sistema.
- %changelog – deve armazenar o trabalho de preparação do RPM, especialmente se houver patches de segurança e de bugs incluídos na fonte upstream base. Ele é gerado automaticamente durante a criação do arquivo hello.spec. Os dados do changelog geralmente são exibidos por
rpm --changelog -q
.
Agora edite seu arquivo .spec
e faça as alterações conforme mostrado.
Name: hello
Version: 2.10
Release: 1%{?dist}
Summary: The "Hello World" program from GNU
License: GPLv3+
URL: http://ftp.gnu.org/gnu/%{name}
Source0: http://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.gz
BuildRequires: gettext
Requires(post): info
Requires(preun): info
%description
The "Hello World" program package
%prep
%autosetup
%build
%configure
make %{make_build}
%install
%make_install
%find_lang %{name}
rm -f %{buildroot}/%{_infodir}/dir
%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi
%files -f %{name}.lang
%{_mandir}/man1/hello.1.*
%{_infodir}/hello.info.*
%{_bindir}/hello
%doc AUTHORS ChangeLog NEWS README THANKS TODO
%license COPYING
%changelog
* Tue May 28 2019 Aaron Kili
Você notará que usamos alguns novos parâmetros no arquivo acima que não foram explicados. Elas são chamadas de macros, usadas para construir invocações de sistema definidas pelo RPM para definir caminhos de instalação para pacotes. Portanto, geralmente é preferível não codificar esses caminhos em arquivos de especificações, mas usar as mesmas macros para consistência.
A seguir estão macros de compilação e diretório RPM junto com suas definições e valores padrão:
- %{make_build} – é usado na seção %build do arquivo de especificações e executa o comando make.
- %{name} – define o nome do pacote ou diretório.
- %{buildroot} – %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}, igual a $BUILDROOT
- %{_infodir} – %{_datarootdir}/info, padrão: /usr/share/info
- %{_mandir} – %{_datarootdir}/man, padrão: /usr/share/man
- %{_bindir} – %{_exec_prefix}/bin, padrão: /usr/bin
Observe que você pode encontrar os valores para essas macros em /usr/lib/rpm/platform/*/macros ou consulte Diretrizes de empacotamento: macros RPM.
Construindo o Pacote RPM
Para construir os pacotes fonte, binários e de depuração, execute o seguinte comando rpmbuild.
rpmbuild -ba hello.spec
Após o processo de construção, os RPMs de origem e os RPMs binários serão criados nos diretórios ../SRPMS/
e ../RPMS/
respectivamente. Você pode usar o programa rpmlint para verificar e garantir que o arquivo de especificação e os arquivos RPM criados estejam em conformidade com as regras de design do RPM:
rpmlint hello.spec ../SRPMS/hello* ../RPMS/*/hello*
Se houver algum erro conforme mostrado na imagem acima, corrija-o antes de continuar.
Por último, mas não menos importante, use o programa simulado para verificar se a compilação do pacote terá sucesso no ambiente de compilação restrito do Fedora.
mock --verbose ../SRPMS/hello-2.10-1.fc29.src.rpm
Para mais informações, consulte a documentação do Fedora: Criando Pacotes RPM.
Isso é tudo! Neste artigo, explicamos como aprimorar seu sistema Fedora para criar um pacote de software fonte e binário simples. Também mostramos como criar um pacote RPM GUN Hello Word. Use o formulário de feedback abaixo para entrar em contato conosco em caso de dúvidas ou comentários.