如何检测 Tumbleweed

跳转至: 导航, 搜索


此教学将教您当在 openSUSE 构建服务上针对多个 openSUSE 版本编译软件包时如何妥善地检测 openSUSE Tumbleweed。这个经验法则是一个高阶技巧,需要一些关于壳层脚本的基础知识。我们假设您已经在其它地方获取到这些知识了。

为什么?

openSUSE 在任何时间点上都有大约 4 到 6 个版本要支持,例如,目前,12.3, 13.1, Tumbleweed, Factory 是必须支持的,SLE_11_SP3 和 SLE_11_SP2 是愿意支持就支持的。这些版本间当然有差异,例如,软件包重命名,软件包版本,这是我们在打包时可能面临的最为棘手的问题。

通常,我们会使用 OBS 的这个机制:%if %{?suse_version} 来解决这些问题。"suse_version" RPM 宏及其变种 "sles_version" 内部看起来像这样:

$ cat /usr/lib/rpm/suse_macros
%suse_version 1310
%sles_version 0

它们只是硬编码的版本号。

另一个现实是 openSUSE 开发者们只为 openSUSE:Factory 增加那个版本号。openSUSE Tumbleweed 会挑选像内核, GNOME, KDE 这样的软件包。RPM 并不是其中之一 (suse_macros 位于 rpm 软件包中)。也即,openSUSE Tumbleweed 与最新稳定版的 openSUSE 相比,具有相同的 "suse_version" 但软件包并不相同。

所以问题就来了,某些软件包可能需要针对 Tumbleweed 应用特殊补丁或需要特殊的依赖关系,而构建服务提供的机制并不能达到这一目标。

理论

1. 自行链接 rpm 软件包,自行修改 suse_version,然后使用:

%if %{?suse_version} == "tumbleweed"

这种方法听起来简单到每个人都能掌握,但是现实中很复杂:

  • 您需要提交一个新的 "rpm" 软件包到 openSUSE Tumbleweed 源,那样难于维护。(真的吗?)
  • 或者您需要为每个您准备支持 Tumbleweed 的源链接 rpm,并且这些软件包不能被提交官方 openSUSE 开发源,因为那里没有修改过的 rpm 软件包,你的工作是无效的。

2. 先自行检测 "suse_version == 1310",然后检测稳定版和 Tumbleweed 中不同的软件包。

范例

cinnamon-bluetooth

拿 "cinnamon-bluetooth" 来说:

GNOME 上游自 GNOME 3.12 起从 gnome-bluetooth 中移除了 rfkill 函数,而在 gnome-settings-daemon 里重造了轮子。但 cinnamon 上游没有迁移到新代码因为 Linux Mint 这个渣渣依然在使用 GNOME 3.8,即使在它最新发布的版本里。所以我们需要由其它发行版的打包者提供了两个补丁来让 cinnamon-bluetooth 能通过编译,虽然编译结果的蓝牙是不可用的。

但 openSUSE 13.1 使用了 GNOME 3.10 而 Tumbleweed 使用了 GNOME 3.12,所以 openSUSE 13.1 可以编译而 Tumbleweed 不能。我们只需要为 Tumbleweed 应用这些补丁。

所以让我们先检查 gnome-bluetooth-devel,它提供了 pkgconfig(gnome-bluetooth-1.0),是 cinnamon-bluetooth 的一个依赖。

$ cat %{_libdir}/pkgconfig/gnome-bluetooth-1.0.pc | grep Version | sed 's/Version: //'
3.12.0

解释:

  •  %{_libdir}/pkgconfig/gnome-bluetooth-1.0.pc 是它的 pkgconfig 文件,里面总是会有一个版本号。(您可以下载 Tumbleweed 的 gnome-bluetooth-devel 软件包用 `unrpm` 解压来查看这个文件) `cat` 意思是输出整个文件
  • `grep Version` 将返回含有 `Version` 字符串的行,例如 Version: 3.12.0
  • `sed 's/<orig>/<replace>/` 将把 'Version:<空格>' 改为空,于是你就得到了 3.12.0

因此我们可以像这样定义一个宏:

%define gnome_bluetooth_version %(cat %{_libdir}/pkgconfig/gnome-bluetooth-1.0.pc | grep Version | sed 's/Version: //')
%define is_tumbleweed %(%if %{?suse_version} == 1310 && %{?gnome_bluetooth_version} == 3.12.0 ; echo 1 || echo 0) 

然后这样使用:

%prep
%setup -q
%if 0%{?if_tumbleweed} == 1
%patch -p1
%endif

packman 中的 gpac

openSUSE 经常性地重命名 xulrunner 这使得提供其支持非常难。

查看:

https://pmbs.links2linux.de/package/view_file/Essentials/gpac/gpac.spec?expand=1&rev=ce1fabced5980e19ac72b3cea1b20897

在里面我们也检测了 Tumbleweed。我们没有使用 `cat <pkgconfig file>` 方法而是用了 `rpm -q --qf`。

作者