在 RPM 規範文件中創建依賴於作業系統的 Requires 部分
情況
我有一個在安裝後和解除安裝前階段使用
semanage
(SELinux 策略管理工具)和restorecon
(SELinux 上下文配置工具)的 RPM。不幸的是,在 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 版本。根據 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
以防止在未定義宏時出現語法錯誤。