Development/Howto/RpmPreOrCvsVersion

From Mandriva

Jump to: navigation, search
Easily managing RPMs built from CVS snapshots or prerelease versions

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


[edit]

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
[edit]

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
[edit]

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}
Personal tools