Rhel

在 RPM 規範文件中創建依賴於作業系統的 Requires 部分

  • February 2, 2022

情況

我有一個在安裝後和解除安裝前階段使用semanage(SELinux 策略管理工具)和restorecon(SELinux 上下文配置工具)的 RPM。

不幸的是,在 RHEL 6/7 和 8 之間,包含這些工具的軟體包從 重命名policycoreutils-pythonpolicycoreutils-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 版本。根據 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 實例上安裝獨立於作業系統的 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)

似乎使用Requires了 CentOS 6/7 方案,而不是 CentOS 8 方案。

我在這裡沒有看到什麼?我能做些什麼來調試這個嗎?

相關和來源

您可以省略條件並依賴 semanage 執行檔而不是 policycoreutils-python 包:

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

有關範例,請參見 Fedora 的dokuwiki.spec 。一個依賴包的例子是bdii.spec

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

即使您在 RHEL 8 上安裝軟體包,也會使用此 Requires。在建構軟體包後不會重新評估它。

如果您只想擁有一個二進制包,那麼您需要 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

以防止在未定義宏時出現語法錯誤。

引用自:https://unix.stackexchange.com/questions/687719