openSUSE:Packaging Vala

跳转到:导航搜索

Vala

如何在 spec 文件中检测 Vala 版本

我们假设您不是在构建 Vala 本身。如果是,Vala 的版本由您自己定义,可以使用以下方式简单地调用:%{version}标签,问题根本不存在。这里我们面临着这样一种令人尴尬的情况

该软件包是用 Vala 构建的,并且在所有版本的 Vala 下都能很好地构建(所以您不必画蛇添足地BuildRequires: vala >= 0.14标签)。但您仍然需要检测并使用 Vala 的版本号。

目前,构建服务遇到了一个瓶颈。目前,Vala 不能简单地包含在BuildRequires: vala并像 Perl 或 Python 那样以简单而朴素的方式导出其版本,带有自动标签%{py_ver}%{perl_version}。有些软件包确实需要知道 Vala 的版本号才能完成其工作(例如,Babl 或 Gegl 将安装.vapi文件到/usr/share/vala默认情况下,但在标准的 openSUSE 系统中,该目录毫无意义。但是,openSUSE 使用带有 Vala 版本号后缀的目录,例如/usr/share/vala-0.14。现在,将它们从软件包默认目录移动到 openSUSE 的可调用目录是打包者的责任)。

当然,您可以使用%if 0%{?suse_version} >= 1140标签,将它们移动到带有标准 Vala 版本号后缀的目录,该目录默认安装在 openSUSE 的 1140 版本上。但这会使您的 spec 文件变得巨大且难以维护(您几乎需要为 openSUSE 的每个版本添加这样的部分)。

现在我们使用自定义的函数%define在 spec 文件中,如下所示:

 #import Vala dependency 
 BuildRequires: vala
 #define a function to export Vala's version number
 %define vala_version %(rpm -q --queryformat='%%{VERSION}' vala | sed 's/\.[0-9]*$//g')

我们使用 rpm -q --queryformat='%%{VERSION}' vala 来获取 Vala 的完整版本号0.14.0,它以标准的 RPM 方式安装在实际开始构建过程之前,这就是为什么这段代码有效。然后使用sedshell 命令和正则表达式的力量来剪切后缀.0并将结果导出到变量vala_version,可以通过%{vala_version}轻松调用。例如

 #create a new directory. -pv means export directories it made into logfile for futher debug 
 #and create it automatically if the parent directory does not exist.
 mkdir -pv %{buildroot}%{_datadir}/vala-%{vala_version}/
 #move the files
 mv %{buildroot}%{_datadir}/vala/* %{buildroot}%{_datadir}/vala-%{vala_version}/
 #delete the original folder
 rm -Rf %{buildroot}%{_datadir}/vala/

甚至在%files部分,您可以使用

 %dir %{_datadir}/vala-%{vala_version}/
 %{_datadir}/vala-%{vala_version}/*

来简化您的 spec 文件。

因为%{buildroot}下的每个文件都将按层次结构打包到最终的输出 RPM 中,现在您的软件包的用户友好性提升了 +1。