RPM 사양 파일의 Requires 섹션을 OS별로 만듭니다.

RPM 사양 파일의 Requires 섹션을 OS별로 만듭니다.

상태

설치 후 및 제거 전 단계에서 semanage(SELinux 정책 관리 도구) 및 (SELinux 컨텍스트 구성 도구)를 사용하는 RPM이 있습니다.restorecon

안타깝게도 RHEL 6/7과 8 사이에서 이러한 도구가 포함된 패키지 policycoreutils-python의 이름이 policycoreutils-python-utils.

RHEL8 RPM의 작업 사양 파일은 다음과 같습니다.

Requires(post): policycoreutils-python-utils
Requires(preun): policycoreutils-python-utils

RHEL6/7 RPM의 작업 사양 파일은 다음과 같습니다.

Requires(post): policycoreutils-python
Requires(preun): policycoreutils-python

내가 달성하려는 것

할 수 있다두 개의 사양 파일/두 개의 RPM(각 OS 유형당 하나씩)을 사용하고 있지만 게으르고 모든 사람에게 도움이 되는 하나의 사양을 원합니다.

내가 시도한 것

%{rhel}OS 버전이 포함된 OS 조건에 대해 읽었습니다 . 다음과 같은~해야 한다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

%{rhel}대상 시스템에서 변수 값을 확인하면 예상한 결과를 얻습니다.

centos7-system» rpm --eval '%{rhel}'
7

centos8-system» rpm --eval '%{rhel}'
8

CentOS 6/7 인스턴스에 이 RPM을 설치하면 제대로 작동합니다. 그러나 CentOS 8 인스턴스에 OS 독립 RPM을 설치한 후 다음과 같은 결과가 나타납니다.

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

디버그 출력:

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)

RequiresCentOS 8 시나리오가 아닌 CentOS 6/7 시나리오를 사용한 것으로 보입니다 .

여기서 내가 보지 못하는 것은 무엇입니까? 이것을 디버깅하기 위해 제가 할 수 있는 일이 있나요?

관련 콘텐츠 및 출처

답변1

조건을 생략하고policycoreutils-python 패키지 대신 semanage 실행 파일을 사용할 수 있습니다.

Requires(post): %{_sbindir}/semanage
Requires(post): %{_sbindir}/restorecon

Fedora를 참조하세요dokuwiki.spec예를 들어. 패키지에 따른 예는 다음과 같습니다.bdii 사양.

답변2

SPEC 파일의 조건을 평가하는 중입니다.세워시간. 따라서 SPEC 파일에 다음이 포함되어 있는 경우:

%if %{rhel} < 8
Requires(post): policycoreutils-python
%endif 

%if %{rhel} == 8
Requires(post): policycoreutils-python-utils
%endif

그런 다음 RHEL 7에서 패키지를 빌드하면 다음과 같은 결과가 나타납니다.

Requires(post): policycoreutils-python

이 Requires는 RHEL 8에 패키지를 설치하는 경우에도 사용됩니다. 패키지는 빌드된 후에 다시 평가되지 않습니다.

바이너리 패키지만 갖고 싶다면 Andreas가 지적한 것처럼 저장소가 필요합니다. 기업용 솔루션은 다음과 같습니다.

Release: 1%{?dist}
...
%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

다음을 사용하여 다양한 플랫폼용으로 빌드합니다.

mock -r epel-7-x86_64 my.src.rpm
mock -r epel-8-x86_64 my.src.rpm

첫 번째 명령은 생산 my-1.0-1.el7하고 요구하는 policycoreutils-python반면, 두 번째 명령은 생산 my-1.0-1.el8하고 요구합니다 policycoreutils-python-utils.

참고로 조건은 다음과 같이 작성되어야 합니다.

%if 0%{?rhel} < 8

매크로가 정의되지 않은 경우 구문 오류를 방지합니다.

관련 정보