如何检测 Tumbleweed
构建服务教学 - 技巧和花样 - 跨发行版打包 - Debian 打包指南 - 打包检查
桌面菜单分类 - 打包常用的 RPM 宏 - 小脚本片段 - SysVinit 脚本 - 源代码服务
OBS 打包互助问答 - 打包黑名单
为什么?
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 这使得提供其支持非常难。
查看:
在里面我们也检测了 Tumbleweed。我们没有使用 `cat <pkgconfig file>` 方法而是用了 `rpm -q --qf`。