情况
我有一个在安装后和卸载前阶段使用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 包:
有关示例,请参见 Fedora 的dokuwiki.spec 。一个依赖包的例子是bdii.spec。
SPEC 文件中的条件在构建期间进行评估。因此,当您的 SPEC 文件包含:
并且您在 RHEL 7 上构建您的软件包,那么它将具有
即使您在 RHEL 8 上安装软件包,也会使用此 Requires。在构建软件包后不会重新评估它。
如果您只想拥有一个二进制包,那么您需要 Andreas 指出的文件库要求。企业解决方案是使用
并使用以下方法为不同的平台构建它:
第一个命令产生
my-1.0-1.el7
并需要policycoreutils-python
,而第二个命令产生my-1.0-1.el8
并需要policycoreutils-python-utils
。作为旁注,条件应写为:
以防止在未定义宏时出现语法错误。