On Thu, 9 Jul 2009, Alan Dunn wrote:
I want to conditionally apply a patch in a spec file based upon the version of a package. (There's an emacs package that needs a patch to work with the latest version of xemacs, but this patch shouldn't be applied for previous versions of xemacs.) I know that for checking something like Fedora version numbers I can use
%if 0%{?fedora} > 9 ... %endif
but is there an easy way to do this for a version number in say, EVR form? That is, something like
%if %{program_version} > 1.2.3 ... %endif
(%{program_version} will always be defined)
RPM doesn't seem to support a mechanism like this in %if conditionals (I believe having a digit first causes rpmbuild to try and interpret the result as a number), though clearly there is a mechanism for examining EVRs of this form for other parts of rpmbuild.
One could try something like
%if "%{prorgram_version}" > "1.2.3"
which does string comparison, but this doesn't work for some version combinations, since, for example, we would want 1.10.1 > 1.9.1
In rpm >= 4.7.0 the real rpm version comparison algorithm is available to the embedded Lua interpreter as rpm.vercmp(), eg: [pmatilai@localhost ~]$ rpm --eval "%{lua:print(rpm.vercmp('1.2.3-1', '1.1.1-1'))}" 1 [pmatilai@localhost ~]$ rpm --eval "%{lua:print(rpm.vercmp('1.2.3-1', '5:1.1.1-1'))}" -1
With older rpm versions you need to do "something else", such as call rpmdev-vercmp.
- Panu -