Development/Howto/RpmPreOrCvsVersion
From Mandriva
Quite often, a CVS snapshot or prerelease is packaged in cooker, and it is inconvenient to always keep changing %setup to use -n %{name}-%{version}%{?pre:%pre} or worse. This page shows some macros that can be used to make this easier (so it never has to be changed, only the %ver or similar macro). Hopefully they can be adopted so everyone can use them.
Note that in the case of the prerelease, mkver assumes that any non-numeric characters that follow one or more characters in the argument to mkver are the prerelease, so some software which uses two or more alphabetic characters in a version string will be misdetected, as will software where one alphabetic character indicates a prerelease.
Contents |
First implementation
%mkvr(vrpc:) %{-v:%{!-p:%{1}}%{-p:%(perl -e '$_="%{1}";m/((\\d\\.?)+)(.\*)/;print "$1";')}%{-r:-}}%{-r:%{-c:0.%{-c*}.}\ %{-p:0.%(perl -e '$_="%{1}";m/((\\d\\.?)+)(.\*)/;print $3').}%{!?_with_unstable:%(echo $[%{2}-1]).%{!-c:%{!-p:%{?subrel:%subrel}\ %{!?subrel:1}.}}%{?distversion:%distversion}%{?!distversion:%(echo $[%{mdkversion}/10])}}%{?_with_unstable:%{2}}%{?distsuffix:%distsuffix}%{?!distsuffix:mdk}}
The macro would be used to generate both the version and the release tag (since this allows it to provide other features sometimes required, such as handling of pre/beta/alpha versions etc). For instance, a "stable" upstream version would have:
%define ver 3.0 %define rel 1 Version: %mkvr -v %{ver} %{rel} Release: %mkvr -r %{ver} %{rel}
Here are some examples of the use of the macro:
$ rpm --eval '%mkvr -v -r 3.0 6' 3.0-5.1.101mdk $ rpm --with unstable --eval '%mkvr -v -r 3.0 6' 3.0-6mdk
With a prerelease version:
$ rpm --eval '%mkvr -p -v -r 3.0pre1 6' 3.0-0.pre1.5.101mdk $ rpm --with unstable --eval '%mkvr -p -v -r 3.0pre1 6' 3.0-0.pre1.6mdk
With a CVS snapshot:
$ rpm --eval "%mkvr -c `date +%Y%m%d` -v -r 3.0 6" 3.0-0.20041214.5.101mdk $ rpm --with unstable --eval "%mkvr -c `date +%Y%m%d` -v -r 3.0 6" 3.0-0.20041214.6mdk
Implementation compatible with the Distro Specific Release Tag:
For more information, see Policies/Release Tag
%mkver(r:) %{-r:%(perl -e '$_="%{1}";m/(((\\d\\.?)+)(\\w\*))(.\*)/;$pre=$4;print "0.$pre." if $pre =~ /\\w\{2,\}/;\ print "%{-r*}"')}%{!-r:%(perl -e '$_="%{1}";m/(((\\d\\.?)+)(\\w\*))(.\*)/;$pre=$4;print "$2";print $pre if $pre !~ /\\w{2,}/')}
Examples:
$ rpm --eval "%mkrel `rpm --eval '%mkver 3.0 -r 6'`" 5.1.101mdk $ rpm --with unstable --eval "%mkrel `rpm --eval '%mkver 3.0 -r 6'`" 6mdk
With a prerelease version:
$ rpm --eval "%mkrel `rpm --with unstable --eval '%mkver 3.0pre1 -r 6'`" 0.pre1.5.1.101mdk $ rpm --with unstable --eval "%mkrel `rpm --eval '%mkver 3.0pre1 -r 6'`" 0.pre1.6mdk $ rpm --eval '%mkver 3.0pre1' 3.0
With a CVS snapshot:
$ rpm --eval "%mkrel -c `date +%Y%m%d` `rpm --with unstable --eval '%mkver 3.0 -r 6'`" 0.20041214.5.1.101mdk $ rpm --with unstable --eval "%mkrel -c `date +%Y%m%d` `rpm --with unstable --eval '%mkver 3.0 -r 6'`" 0.20041214.6mdk
Re-release (i.e. fix-up):
$ rpm --eval "%mkrel `rpm --eval '%mkver 3.0a -r 6'`" 5.1.101mdk $ rpm --with unstable --eval "%mkrel `rpm --eval '%mkver 3.0a -r 6'`" 6mdk $ rpm --eval '%mkver 3.0a 6' 3.0a
How you would use it in a package
%define ver 3.0pre1 %define rel 6 %define relpre %mkver -r %ver Version: %mkver %ver Release: %mkrel %relpre %setup -q -n %{name}-%{ver}