blob: 7626ddda8d2eaf6330d9cc6687e4e52b9850f064 [file] [log] [blame]
# Copyright 2002, 2003, 2004, 2006 Vladimir Prus
# Copyright 2008 Jurko Gospodnetic
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
import errors ;
import numbers ;
major = "2011" ;
minor = "04" ;
rule boost-build ( )
{
return "$(major).$(minor)-svn" ;
}
rule print ( )
{
if [ verify-engine-version ]
{
ECHO "Boost.Build" [ boost-build ] ;
}
}
rule verify-engine-version ( )
{
local v = [ modules.peek : JAM_VERSION ] ;
if $(v[1]) != $(major) || $(v[2]) != $(minor)
{
local argv = [ modules.peek : ARGV ] ;
local e = $(argv[1]) ;
local l = [ modules.binding version ] ;
l = $(l:D) ;
l = $(l:D) ;
ECHO "warning: mismatched versions of Boost.Build engine and core" ;
ECHO "warning: Boost.Build engine ($(e)) is $(v:J=.)" ;
ECHO "warning: Boost.Build core (at $(l)) is" [ boost-build ] ;
}
else
{
return true ;
}
}
# Utility rule for testing whether all elements in a sequence are equal to 0.
#
local rule is-all-zeroes ( sequence * )
{
local result = "true" ;
for local e in $(sequence)
{
if $(e) != "0"
{
result = "" ;
}
}
return $(result) ;
}
# Returns "true" if the first version is less than the second one.
#
rule version-less ( lhs + : rhs + )
{
numbers.check $(lhs) ;
numbers.check $(rhs) ;
local done ;
local result ;
while ! $(done) && $(lhs) && $(rhs)
{
if [ numbers.less $(lhs[1]) $(rhs[1]) ]
{
done = "true" ;
result = "true" ;
}
else if [ numbers.less $(rhs[1]) $(lhs[1]) ]
{
done = "true" ;
}
else
{
lhs = $(lhs[2-]) ;
rhs = $(rhs[2-]) ;
}
}
if ( ! $(done) && ! $(lhs) && ! [ is-all-zeroes $(rhs) ] )
{
result = "true" ;
}
return $(result) ;
}
# Returns "true" if the current JAM version version is at least the given
# version.
#
rule check-jam-version ( version + )
{
local version-tag = $(version:J=.) ;
if ! $(version-tag)
{
errors.error Invalid version specifier: : $(version:E="(undefined)") ;
}
if ! $(.jam-version-check.$(version-tag))-is-not-empty
{
local jam-version = [ modules.peek : JAM_VERSION ] ;
if ! $(jam-version)
{
errors.error "Unable to deduce Boost Jam version. Your Boost Jam"
"installation is most likely terribly outdated." ;
}
.jam-version-check.$(version-tag) = "true" ;
if [ version-less [ modules.peek : JAM_VERSION ] : $(version) ]
{
.jam-version-check.$(version-tag) = "" ;
}
}
return $(.jam-version-check.$(version-tag)) ;
}
rule __test__ ( )
{
import assert ;
local jam-version = [ modules.peek : JAM_VERSION ] ;
local future-version = $(jam-version) ;
future-version += "1" ;
assert.true check-jam-version $(jam-version) ;
assert.false check-jam-version $(future-version) ;
assert.true version-less 0 : 1 ;
assert.false version-less 0 : 0 ;
assert.true version-less 1 : 2 ;
assert.false version-less 1 : 1 ;
assert.false version-less 2 : 1 ;
assert.true version-less 3 1 20 : 3 4 10 ;
assert.false version-less 3 1 10 : 3 1 10 ;
assert.false version-less 3 4 10 : 3 1 20 ;
assert.true version-less 3 1 20 5 1 : 3 4 10 ;
assert.false version-less 3 1 10 5 1 : 3 1 10 ;
assert.false version-less 3 4 10 5 1 : 3 1 20 ;
assert.true version-less 3 1 20 : 3 4 10 5 1 ;
assert.true version-less 3 1 10 : 3 1 10 5 1 ;
assert.false version-less 3 4 10 : 3 1 20 5 1 ;
assert.false version-less 3 1 10 : 3 1 10 0 0 ;
assert.false version-less 3 1 10 0 0 : 3 1 10 ;
assert.false version-less 3 1 10 0 : 3 1 10 0 0 ;
assert.false version-less 3 1 10 0 : 03 1 10 0 0 ;
assert.false version-less 03 1 10 0 : 3 1 10 0 0 ;
# TODO: Add tests for invalid input data being sent to version-less.
}