# Jambase
# $Id:$
# This is a jambase that knows just enough to execute SubDir and
# include the Jamrules
# Allow base jamrules to require this file
BHBJAM = true ;
# other files
JAMFILE default = Jamfile ;
JAMRULES default = BhbJambase ;
# Basic utility variables
NEWLINE = "
" ;
SLASH = "/" ;
DOT = "." ;
DOTDOT = ".." ;
rule SubDir
{
local r s ;
#
# SubDir TOP d1 [ ... ]
#
# This introduces a Jamfile that is part of a project tree
# rooted at $(TOP). It (only once) includes the project-specific
# rules file $(TOP)/CustomJambase and then sets search & locate stuff.
#
# If the variable $(TOPRULES) is set (where TOP is the first arg
# to SubDir), that file is included instead of $(TOP)/CustomJambase.
#
# Unlike the original Jambase, this just includes the CustomJambase
# everything else is up to UserSubDir
#
if ! $($(<[1])-defined)
{
if ! $(<[1])
{
EXIT SubDir syntax error ;
}
makeSubDir $(<[1]) : $(<[2-]) ;
$(<[1])-defined = true ;
}
#
# If $(TOP)/Jamrules hasn't been included, do so.
#
if ! $($(<[1])-included)
{
# Gated entry.
$(<[1])-included = TRUE ;
# File is $(TOPRULES) or $(TOP)/Jamrules.
r = $($(<[1])RULES) ;
if ! $(r)
{
r = $(JAMRULES:R=$($(<[1]))) ;
}
# Include it.
include $(r) ;
}
UserSubDir $(<) ;
}
rule UserSubDir
{
# Empty Hook
}
# -------------
# Utility rules
# -------------
#
# From the original Jambase
rule makeString
{
local _t ;
$(<) = $(>[1]) ;
for _t in $(>[2-])
{
$(<) = $($(<))$(_t) ;
}
}
rule makeSubDir
{
local _i _d ;
# If $(>) is the path to the current directory, compute the
# path (using ../../ etc) back to that root directory.
# Sets result in $(<)
if ! $(>[1])
{
_d = $(DOT) ;
}
else
{
_d = $(DOTDOT) ;
for _i in $(>[2-])
{
_d = $(_d:R=$(DOTDOT)) ;
}
}
$(<) = $(_d) ;
}
rule addDirName
{
local _s _i ;
# Turn individual elements in $(>) into a usable path.
# Add result to $(<).
if ! $(>)
{
_s = $(DOT) ;
}
else if $(VMS)
{
# This handles the following cases:
# a -> [.a]
# a b c -> [.a.b.c]
# x: -> x:
# x: a -> x:[a]
# x:[a] b -> x:[a.b]
switch $(>[1])
{
case *:* : _s = $(>[1]) ;
case \\[*\\] : _s = $(>[1]) ;
case * : _s = [.$(>[1])] ;
}
for _i in [.$(>[2-])]
{
_s = $(_i:R=$(_s)) ;
}
}
else if $(MAC)
{
_s = $(DOT) ;
for _i in $(>)
{
_s = $(_i:R=$(_s)) ;
}
}
else
{
_s = $(>[1]) ;
for _i in $(>[2-])
{
_s = $(_i:R=$(_s)) ;
}
}
$(<) += $(_s) ;
}
rule makeDirName
{
$(<) = ; addDirName $(<) : $(>) ;
}
rule makeGrist
{
local _g _i ;
# Turn individual elements in $(>) into grist.
# Return result in $(<)
_g = $(>[1]) ;
for _i in $(>[2-])
{
_g = $(_g)!$(_i) ;
}
$(<) = $(_g) ;
}
rule makeGristedName
{
local _i _o ;
# Produce name with grist in it, if SOURCE_GRIST is set.
if ! $(SOURCE_GRIST)
{
$(<) = $(>) ;
}
else
{
_o = ;
for _i in $(>)
{
switch $(_i)
{
case *.h : _o += $(_i) ;
case * : _o += $(_i:G=$(SOURCE_GRIST)) ;
}
}
$(<) = $(_o) ;
}
}
rule makeCommon
{
if $($(<)[1]) && $($(<)[1]) = $($(>)[1])
{
$(<) = $($(<)[2-]) ;
$(>) = $($(>)[2-]) ;
makeCommon $(<) : $(>) ;
}
}
rule makeRelPath
{
local _l _r ;
# first strip off common parts
_l = $(<[2-]) ;
_r = $(>) ;
makeCommon _l : _r ;
# now make path to root and path down
makeSubDir _l : $(_l) ;
makeDirName _r : $(_r) ;
# Concatenate and save
# XXX This should be better
if $(_r) = $(DOT) {
$(<[1]) = $(_l) ;
} else {
$(<[1]) = $(_r:R=$(_l)) ;
}
}
rule makeSuffixed
{
# E.g., "makeSuffixed s_exe $(SUFEXE) : yacc lex foo.bat ;"
# sets $(s_exe) to (yacc,lex,foo.bat) on Unix and
# (yacc.exe,lex.exe,foo.bat) on NT.
if $(<[2])
{
local _i ;
$(<[1]) = ;
for _i in $(>)
{
if $(_i:S)
{
$(<[1]) += $(_i) ;
}
else
{
$(<[1]) += $(_i:S=$(<[2])) ;
}
}
}
else
{
$(<[1]) = $(>) ;
}
}
rule unmakeDir
{
if $(>[1]:D) && $(>[1]:D) != $(>[1]) && $(>[1]:D) != \\\\
{
unmakeDir $(<) : $(>[1]:D) $(>[1]:BS) $(>[2-]) ;
}
else
{
$(<) = $(>) ;
}
}
# -------------------
# Include the Jamfile
# -------------------
{
if $(JAMFILE) { include $(JAMFILE) ; }
}