【问题标题】:RPM spec file macro not expanding on conditional statementRPM 规范文件宏未在条件语句上扩展
【发布时间】:2019-08-02 01:37:13
【问题描述】:

我有一个非常简单的 RPM 规范文件,它根据 init 系统安装一个二进制文件和一个服务文件。我有一个宏来检查定义如下的初始化系统:

%define init_system $(/bin/awk -F '[()]' '{printf $2}' /proc/1/stat)

该命令可以正常工作,实际上是一个简单的语句

%pre
echo "%{init_system}"

在安装 rpm 时按预期输出 systemd

我遇到的问题是在条件语句中使用时似乎不起作用,例如

%pre
%if "%{init_system}" == "systemd"
   echo "using systemd"
%else
   echo "using another init system: %{init_system}"
%endif

这个输出是:using another init system: systemd

我最初通过更改为简单的 bash 脚本解决了这个问题:

if [[ "%init_system" == "systemd" ]]
then
   echo "using systemd"
else
   echo "using another init system: %{init_system}"
fi

这会正确打印using systemd

bash 方式在 %file 部分不起作用,尽管它期望 %if 或以 / 开头的文件

关于为什么原始方法不起作用的任何建议?

【问题讨论】:

    标签: linux rpm specifications


    【解决方案1】:

    我遇到的问题是在条件语句中使用时似乎不起作用

    不,不会。规范文件中的条件指令由rpmbuild 评估,而不是由 shell。 rpmbuild 将扩展宏,但在这种情况下,结果只是文本。

    这个的输出是:using another init system: systemd

    这很自然,因为条件指令以外的文本被作为shell的输入来处理。 那个shell对RPM宏扩展的结果进行命令扩展。

    我最初通过更改为简单的 bash 脚本解决了这个问题:

    是的,这很合适。

    bash 方式在 %file 部分不起作用,但正如它所期望的那样 %if 或以 / 开头的文件

    无论如何,示例中的特定条件对于 %files 部分是不明智的,因为该部分在 RPM 构建期间具有其全部作用,而不是在安装期间。您不能使用这种方法来根据安装主机的特征来调整安装了哪些文件。

    如果您希望rpmbuild 在构建主机上执行命令并捕获其输出,请使用%(...)。它的工作方式很像 $(...) 在 shell 中的工作方式。这通常仅适用于您希望每个受支持的安装目标都与构建主机完全匹配的探测特性,或者只有构建主机的详细信息才有意义。

    【讨论】:

    • 啊我现在明白了。所以基本上如果我想支持 systemV 和 systemd 位置,最好是制作两个单独的 rpm 或者在 %pre install 部分中有逻辑?
    • 是的@john,确切地说,或者只是将 systemV 和 systemd 位放在单独的子包中,所有系统共有的所有内容都放在主包中。
    猜你喜欢
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多