Situação
Eu tenho um RPM que usa semanage
(ferramenta de gerenciamento de polÃtica SELinux) e restorecon
(ferramenta de configuração de contexto SELinux) nas etapas de pós-instalação e pré-instalação.
Infelizmente, entre RHEL 6/7 e 8, o pacote contendo essas ferramentas foi renomeado de policycoreutils-python
para policycoreutils-python-utils
.
Um arquivo de especificação de trabalho para o RHEL8 RPM contém:
Requires(post): policycoreutils-python-utils
Requires(preun): policycoreutils-python-utils
E um arquivo de especificação de trabalho para o RHEL6/7 RPM contém:
Requires(post): policycoreutils-python
Requires(preun): policycoreutils-python
O que eu tento alcançar
Eu poderia viver com os dois arquivos de especificação/dois RPMs, um para cada tipo de sistema operacional, mas sou preguiçoso e quero uma especificação que atenda a todos.
O que eu tentei
Li sobre a condicional do SO %{rhel}
, contendo a versão do SO. O seguinte deve funcionar, de acordo com o manual RPM:
%if %{rhel} < 8
Requires(post): policycoreutils-python
Requires(preun): policycoreutils-python
%endif
%if %{rhel} == 8
Requires(post): policycoreutils-python-utils
Requires(preun): policycoreutils-python-utils
%endif
Se eu verificar o valor da %{rhel}
variável em meus sistemas de destino, recebo o que espero:
centos7-system» rpm --eval '%{rhel}'
7
centos8-system» rpm --eval '%{rhel}'
8
A instalação deste RPM em uma instância do CentOS 6/7 funciona bem. No entanto, após a instalação do RPM independente do sistema operacional em uma instância do CentOS 8, recebo:
centos8-system» dnf install my-1.26-0.x86_64.rpm
<...>
Error:
Problem: conflicting requests
- nothing provides policycoreutils-python needed by my-1.26-0.x86_64
SaÃda de depuração:
centos8-system» rpm -ivvvh my-1.26-0.x86_64.rpm 2>&1 | grep Requires
D: Requires: /bin/bash YES (db files)
D: Requires: /bin/sh YES (db files)
D: Requires: /bin/sh YES (cached)
D: Requires: /bin/sh YES (cached)
D: Requires: /usr/bin/env YES (db files)
D: Requires: /usr/bin/perl YES (db files)
D: Requires: /usr/bin/php YES (db files)
D: Requires: nagios-plugins NO
D: Requires: perl(Getopt::Long) YES (db provides)
D: Requires: perl(strict) YES (db provides)
D: Requires: policycoreutils-python NO
D: Requires: policycoreutils-python NO (cached)
D: Requires: policycoreutils-python NO
D: Requires: rpmlib(CompressedFileNames) <= 3.0.4-1 YES (rpmlib provides)
D: Requires: rpmlib(FileDigests) <= 4.6.0-1 YES (rpmlib provides)
D: Requires: rpmlib(PayloadFilesHavePrefix) <= 4.0-1 YES (rpmlib provides)
D: Requires: rpmlib(PayloadIsXz) <= 5.2-1 YES (rpmlib provides)
Parece que os Requires
para o cenário CentOS 6/7 são usados, e não os do cenário CentOS 8.
O que eu não estou vendo aqui? Existe algo que eu possa fazer para depurar isso?
Você pode omitir as condicionais e depender do executável semanage em vez do pacote policycoreutils-python:
Veja o dokuwiki.spec do Fedora para um exemplo. Um exemplo que depende dos pacotes é o bdii.spec .
A condicional no arquivo SPEC está sendo avaliada durante o tempo de compilação . Então, quando você arquivo SPEC contém:
e você constrói seu pacote no RHEL 7, então ele terá
e este Requires será usado mesmo se você instalar seu pacote no RHEL 8. Ele não será reavaliado após a compilação do pacote.
Se você quiser ter apenas um pacote binário, precisará do arquivo base require, conforme apontado por Andreas. A solução corporativa é usar
e construa-o para diferentes plataformas usando:
o primeiro comando produz
my-1.0-1.el7
e requerpolicycoreutils-python
Enquanto o segundo produzmy-1.0-1.el8
e requerpolicycoreutils-python-utils
.Como uma nota lateral, a condição deve ser escrita como:
para evitar erros de sintaxe quando a macro não estiver definida.