1# Copyright 2002, 2003, 2004, 2006 Vladimir Prus 2# Copyright 2008, 2012 Jurko Gospodnetic 3# Distributed under the Boost Software License, Version 1.0. 4# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) 5 6import numbers ; 7 8 9.major = "2015" ; 10.minor = "07" ; 11 12 13rule boost-build ( ) 14{ 15 return "$(.major).$(.minor)-git" ; 16} 17 18 19rule print ( ) 20{ 21 if [ verify-engine-version ] 22 { 23 ECHO "Boost.Build" [ boost-build ] ; 24 } 25} 26 27 28rule verify-engine-version ( ) 29{ 30 local v = [ modules.peek : JAM_VERSION ] ; 31 32 if $(v[1]) != $(.major) || $(v[2]) != $(.minor) 33 { 34 local argv = [ modules.peek : ARGV ] ; 35 local e = $(argv[1]) ; 36 local l = [ modules.binding version ] ; 37 l = $(l:D) ; 38 l = $(l:D) ; 39 ECHO "warning: mismatched versions of Boost.Build engine and core" ; 40 ECHO "warning: Boost.Build engine ($(e)) is $(v:J=.)" ; 41 ECHO "warning: Boost.Build core (at $(l)) is" [ boost-build ] ; 42 } 43 else 44 { 45 return true ; 46 } 47} 48 49 50# Utility rule for testing whether all elements in a sequence are equal to 0. 51# 52local rule is-all-zeroes ( sequence * ) 53{ 54 local result = "true" ; 55 for local e in $(sequence) 56 { 57 if $(e) != "0" 58 { 59 result = "" ; 60 } 61 } 62 return $(result) ; 63} 64 65 66# Returns "true" if the first version is less than the second one. 67# 68rule version-less ( lhs + : rhs + ) 69{ 70 numbers.check $(lhs) ; 71 numbers.check $(rhs) ; 72 73 local done ; 74 local result ; 75 76 while ! $(done) && $(lhs) && $(rhs) 77 { 78 if [ numbers.less $(lhs[1]) $(rhs[1]) ] 79 { 80 done = "true" ; 81 result = "true" ; 82 } 83 else if [ numbers.less $(rhs[1]) $(lhs[1]) ] 84 { 85 done = "true" ; 86 } 87 else 88 { 89 lhs = $(lhs[2-]) ; 90 rhs = $(rhs[2-]) ; 91 } 92 } 93 if ( ! $(done) && ! $(lhs) && ! [ is-all-zeroes $(rhs) ] ) 94 { 95 result = "true" ; 96 } 97 98 return $(result) ; 99} 100 101 102# Returns "true" if the current JAM version version is at least the given 103# version. 104# 105rule check-jam-version ( version + ) 106{ 107 local version-tag = $(version:J=.) ; 108 if ! $(version-tag) 109 { 110 import errors ; 111 errors.error Invalid version specifier: : $(version:E="(undefined)") ; 112 } 113 114 if ! $(.jam-version-check.$(version-tag))-is-defined 115 { 116 local jam-version = [ modules.peek : JAM_VERSION ] ; 117 if ! $(jam-version) 118 { 119 import errors ; 120 errors.error "Unable to deduce Boost Jam version. Your Boost Jam" 121 "installation is most likely terribly outdated." ; 122 } 123 .jam-version-check.$(version-tag) = "true" ; 124 if [ version-less [ modules.peek : JAM_VERSION ] : $(version) ] 125 { 126 .jam-version-check.$(version-tag) = "" ; 127 } 128 } 129 return $(.jam-version-check.$(version-tag)) ; 130} 131 132 133rule __test__ ( ) 134{ 135 import assert ; 136 137 local jam-version = [ modules.peek : JAM_VERSION ] ; 138 local future-version = $(jam-version) ; 139 future-version += "1" ; 140 141 assert.true check-jam-version $(jam-version) ; 142 assert.false check-jam-version $(future-version) ; 143 144 assert.true version-less 0 : 1 ; 145 assert.false version-less 0 : 0 ; 146 assert.true version-less 1 : 2 ; 147 assert.false version-less 1 : 1 ; 148 assert.false version-less 2 : 1 ; 149 assert.true version-less 3 1 20 : 3 4 10 ; 150 assert.false version-less 3 1 10 : 3 1 10 ; 151 assert.false version-less 3 4 10 : 3 1 20 ; 152 assert.true version-less 3 1 20 5 1 : 3 4 10 ; 153 assert.false version-less 3 1 10 5 1 : 3 1 10 ; 154 assert.false version-less 3 4 10 5 1 : 3 1 20 ; 155 assert.true version-less 3 1 20 : 3 4 10 5 1 ; 156 assert.true version-less 3 1 10 : 3 1 10 5 1 ; 157 assert.false version-less 3 4 10 : 3 1 20 5 1 ; 158 assert.false version-less 3 1 10 : 3 1 10 0 0 ; 159 assert.false version-less 3 1 10 0 0 : 3 1 10 ; 160 assert.false version-less 3 1 10 0 : 3 1 10 0 0 ; 161 assert.false version-less 3 1 10 0 : 03 1 10 0 0 ; 162 assert.false version-less 03 1 10 0 : 3 1 10 0 0 ; 163 164 # TODO: Add tests for invalid input data being sent to version-less. 165} 166