obs 小技巧:完全控制软件版本号

rpm 包名的格式

对于 openSUSE 15.2,一个常见的软件包名为 hello-2.10-lp152.3.11.x86_64.rpm,包名格式为"软件名 - 版本号-lp152.提交版本号.编译版本号.机器架构.rpm"。

对于 openSUSE Tumbleweed,软件包名为 hello-2.10-2.5.x86_64.rpm,包名格式为"软件名 - 版本号 - 提交版本号.编译版本号.机器架构.rpm"。

OBS 的默认行为

“提交版本号” 和 “编译版本号” 本应该由.spec 文件中的 “Release” 字段控制,但是在 OBS 上,Release 字段被强制覆盖掉了,替换成 OBS 的默认值, 这一默认行为可以在 OBS 项目配置 见到。。

如何自定义

这里将会展示如何将软件版本号的控制权重新交给我们的 spec 文件。

相关的配置位于个人项目的 “Project Config”,该文件的语法参考 这里

项目配置文件中只能使用 **spec 中的 RPM 宏 ** 和 <CI_CNT> <B_CNT> 这两个 “魔法字符串”。需要注意,在 spec 文件中,我们使用宏的语法为 %{?release_prefix},在项目配置文件中,我们必须写成 %%{?release_prefix} ,也即对 RPM 宏进行转义。

简单地修改格式

比如,我们可以这样写:

%if 0%{?fedora_version} >= 20 
Release: <CI_CNT>%%{?dist} 
%endif

输出的结果为:

hello-2.10-2.fc33.x86_64.rpm

完全自定义格式

我们也可以这样写:

%if 0%{?fedora_version} >= 20 
Release: %%{release} 
%endif

以期禁止 OBS 的自动覆盖行为,完全由我们的 spec 文件控制 release 版本号。

输出的结果为:

[ 89s] RPM build errors: 
[ 89s] line 3: Possible unexpanded macro in: Release: %{release} 
[ 89s] /home/abuild/rpmbuild/SOURCES/hello-Fedora_33.spec: Too many levels of recursion in macro expansion. It is likely caused by recursive macro declaration. 
[ 89s] Too many levels of recursion in macro expansion. It is likely caused by recursive macro declaration. 
[ 89s] Bad exit status from /var/tmp/rpm-tmp.Sc39UU (%prep)

呃,翻车了,遇到了循环展开问题。

但是我们可以考虑在我们的 spec 文件中写一个与%{release}功能相同的宏,间接达成相同效果。
项目配置文件如下:

%if 0%{?fedora_version} >= 20 
Release: %%{release_for_obs} 
%endif

在我们的 spec 文件中,定义%{release_for_obs}宏,如下:

%define release_for_obs 3%{?dist}

输出结果为:

hello-2.10-3.fc33.x86_64.rpm

成功了。

2赞