It turns out that the desired behavior can be achieved by extending the interface of path.glob in util/path.jam and adding a few lines of jam code.  I added two optional parameters, 'recurse' and 'maxdepth'.  If a non-null argument is passed to 'recurse', then up to 'maxdepth' levels of subdirectories are globbed.  By default 'maxdepth' is MAXINT.  I will submit a patch after I do the hard work of documentation and selftest after some discovery of what needs to be done there.  In-line documentation reads as follows:

#    Returns the list of files matching the given pattern in the
#    specified directory.  Both directories and patterns are
#    supplied as portable paths. Each pattern should be non-absolute
#    path, and can't contain "." or ".." elements. Each slash separated
#    element of pattern can contain the following special characters:
#    -  '?', which match any character
#    -  '*', which matches arbitrary number of characters.
#    A file $(d)/e1/e2/e3 (where 'd' is in $(dirs)) matches pattern p1/p2/p3
#    if and only if e1 matches p1, e2 matches p2 and so on.
#   
#    If optional parameter 'recurse' is passed a non-null argument, the
#    entire tree is walked.  The maximum number of subtree levels to be walked
#    can be controlled by the optional 'maxdepth' parameter.  The default
#    is no limit.  Maxdepth of 1 limits the search to one sublevel.  For
#    example, [ glob . : *.cpp *.h : t : 2 ] matches all *.cpp and *.h
#    files in the current directory and two levels of subdirectories.
#
#    For example:
#        [ glob . : *.cpp ]
#        [ glob . : */build/Jamfile ]
#        [ glob . : *.cpp *.h : t ]
rule glob ( dirs * : patterns + : recurse ? : maxdepth ? )

How does this sound?

Cheers,
Mark