Conditionally applying a patch based on a program's EVR

Panu Matilainen pmatilai at laiskiainen.org
Fri Jul 10 05:48:02 UTC 2009


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 at localhost ~]$ rpm --eval "%{lua:print(rpm.vercmp('1.2.3-1', 
'1.1.1-1'))}"
1
[pmatilai at 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 -




More information about the fedora-devel-list mailing list