RPM 规范文件宏不扩展条件语句

RPM spec file macro not expanding on conditional statement

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

%define init_system $(/bin/awk -F '[()]' '{printf }' /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 或以 /

开头的文件

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

The problem I have encountered is that it doesn't seem to work when used in a conditional statement

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

The output of this is: using another init system: systemd

这很自然,因为 不同于 条件指令的文本被处理为 shell 的输入。 即shell对RPM的宏展开结果进行命令展开。

I initially got around the problem by changeing to simple bash scripting:

是的,这很合适。

The bash way does not work at the %file section though as it expects %if or files starting with /

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

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