Pesquisa de site

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:

  1. BUILD – armazena vários diretórios %buildroot quando os pacotes são compilados.
  2. RPMS – conterá RPMs binários em subdiretórios de Arquitetura.
  3. FONTES – armazena arquivos de origem compactados e quaisquer patches, é aqui que o comando rpmbuild irá procurá-los.
  4. SPECS – armazena os arquivos SPEC.
  5. 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.