【问题标题】:cpack restrict OS version package can be installed oncpack 限制操作系统版本包可以安装在
【发布时间】:2020-12-27 15:12:49
【问题描述】:

我为多个操作系统版本创建软件包,包括 RHEL7 和 RHEL8(或几乎相同的 CentOS7 和 8)。

可以安装为 .el7 构建的包。在 .el8 上。但它通常不起作用(例如由于未定义的符号等)。 理想情况下,我想让安装失败并显示错误消息,例如“此软件包仅适用于 RHEL7/CentOS7”。

我该怎么做? 更具体地说,我如何使用 CPack/CMake 做到这一点?

如果您还可以给出适合 Debian 版本的解释,则可以加分。


以下是我目前的一些想法:

  1. 以某种方式使用dist tags,请参阅:
  1. 在安装时在预安装脚本中检查 uname -r 部分答案在这里:

我不太确定如何使用 cpack 做到这一点。我不想生成自定义规范文件,因为构建机制已经足够复杂了。

  1. 另一种选择是在仅存在于 RHEL7 但不存在于 RHEL8 的软件包上添加 %requires,反之亦然。该软件包也需要存在于 CentOS 上,并且不会以在升级时会导致安装失败的方式进行更改。有谁知道合适的软件包可以依赖吗?

例如:

>rpm -q --whatprovides /etc/redhat-release 
centos-release-8.2-2.2004.0.1.el8.x86_64

这看起来是个不错的选择,但如果我添加了对 centos-release-8.2 的依赖项,然后他们升级到 centos-release-8.3 或改用 RedHat,这将不起作用。

【问题讨论】:

  • 最简单的方法是什么都不做 :) 不要让事情变得复杂。你的包名应该包含<name>-<version>-el7.x86_64.rpm(或*.el8.*)之类的东西——这是给用户关于目标发行版的标志(对于Debian/Ubuntu的规则相同)。如果他将软件包安装到错误的发行版,那不是你的问题! :) 不管你要做什么,如果用户想要安装不是针对他的发行版的东西他会找到一种方法来打他的腿如果你有你的东西的回购,只需把打包到不同的目录,并要求用户正确配置他们的/etc/yum.repos.d/*
  • 诚然,不管你做什么,总有人会想办法成为一个更好的白痴,但我相信问题最好尽早大声尖叫而不是微妙地尖叫。

标签: centos redhat rpm rpmbuild cpack


【解决方案1】:

did this before%pre 中有一个节来阻止它:

if [ -n "%{dist}" ]; then
  PKG_VER=`echo %{dist} | perl -ne '/el(\d)/ && print $1'`
  THIS_VER=`perl -ne '/release (\d)/ && print $1' /etc/redhat-release`
  if [ -n "${PKG_VER}" -a -n "${THIS_VER}" ]; then
    if [ ${PKG_VER} -ne ${THIS_VER} ]; then
      for i in `seq 20`; do echo ""; done
      echo "WARNING: This RPM is for CentOS${PKG_VER}, but you seem to be running CentOS${THIS_VER}" >&2
      echo "You might want to uninstall these RPMs immediately and get the CentOS${THIS_VER} version." >&2
      for i in `seq 5`; do echo "" >&2; done
    fi
  fi
fi

记住 - 您不能在 RPM 安装中进行任何用户交互。你可以让它失败而不是警告;这取决于你。

【讨论】:

  • 这可能是答案的一半,但问题是你如何使用 cmake/cpack 做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
相关资源
最近更新 更多