diff --git a/admin/scons/Buildhelper.py b/admin/scons/Buildhelper.py index a8a76a600..cfde75994 100644 --- a/admin/scons/Buildhelper.py +++ b/admin/scons/Buildhelper.py @@ -91,6 +91,38 @@ def globRootdirs(roots): +def findSrcTrees(location, patterns=SRCPATTERNS): + """ find possible source tree roots, starting with the given location. + When delving down from the initial location(s), a source tree is defined + as a directory containing source files and possibly further sub directories. + After having initially expanded the given location with #globRootdirs, each + directory is examined depth first, until encountering a directory containing + source files, which then yields a result. Especially, this can be used to traverse + an organisational directory structure and find out all possible source trees of + to be built into packages, plugins, individual tool executables etc. + @return: the relative path names of all source root dirs found (generator function). + """ + for dir in globRootdirs(location): + if isSrcDir(dir,patterns): + yield dir + else: + for result in findSrcTrees(str(dir)+'/*'): + yield result + + +def isSrcDir(path, patterns=SRCPATTERNS): + """ helper: investigate the given (relative) path + @param patterns: list of wildcards defining what counts as "source file" + @return: True if it's a directory containing any source file + """ + if not os.path.isdir(path): + return False + else: + for p in patterns: + if glob.glob(path+'/'+p): + return True + + def filterNodes(nlist, removeName=None): """ filter out scons build nodes using the given criteria. @@ -115,6 +147,19 @@ def getDirname(dir): +def createPlugins(env, dir): + """ investigate the given source directory to identify all contained source trees. + @return: a list of build nodes defining a plugin for each of these source trees. + """ + return [env.LoadableModule( '$PLUGDIR/%s' % getDirname(tree) + , srcSubtree(env, tree) + , SHLIBPREFIX='', SHLIBSUFFIX='.lum' + ) + for tree in findSrcTrees(dir) + ] + + + def checkCommandOption(env, optID, val=None, cmdName=None): """ evaluate and verify an option, which may point at a command. besides specifying a path, the option may read True, yes or 1,