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。