From: g0dil Date: Wed, 4 Aug 2010 14:53:35 +0000 (+0000) Subject: Fix CPPDFINES handling in scons X-Git-Url: http://g0dil.de/git?p=senf.git;a=commitdiff_plain;h=e691d9f37d0f569ff6ad46f76282cfc057cdf197 Fix CPPDFINES handling in scons git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1661 270642c3-0616-0410-b53a-bc976706d245 --- diff --git a/SConstruct b/SConstruct index 08a96af..0bb858a 100644 --- a/SConstruct +++ b/SConstruct @@ -131,6 +131,10 @@ env.SetDefault( FLAVOR = '', ) +env.Replace( + _defines = senfutil.expandDefines +) + # Set variables from command line senfutil.parseArguments( env, diff --git a/senf/.gitignore b/senf/.gitignore index a4de1b0..1f1b46d 100644 --- a/senf/.gitignore +++ b/senf/.gitignore @@ -1,2 +1,3 @@ /local_config.hh /autoconf.hh +/Version.hh diff --git a/site_scons/senfutil.py b/site_scons/senfutil.py index 29992a3..498f7f0 100644 --- a/site_scons/senfutil.py +++ b/site_scons/senfutil.py @@ -1,6 +1,8 @@ import os.path, glob, site_tools.Yaptu from SCons.Script import * +import SCons.Defaults, SCons.Util import senfconf +import types, re senfutildir = os.path.dirname(__file__) @@ -32,6 +34,62 @@ class BuildTypeOptions: type = env['final'] and "final" or env['debug'] and "debug" or "normal" return env[self._var + "_" + type] +_DOLLAR_RE = re.compile(r'\$([a-zA-Z_][\.\w]*)|\${([^}]*)}') + +def _expandDefines(defs, target, source, env, for_signature): + rv = [] + if SCons.Util.is_Dict(defs): + keys = defs.keys() + keys.sort() + defs = [ (k,defs[k]) for k in keys ] + elif not SCons.Util.is_List(defs): + defs = [ defs ] + for elt in defs: + if SCons.Util.is_String(elt): + m = _DOLLAR_RE.match(elt) + if m: + match = m.group(1) or m.group(2) + try: rv.extend(_expandDefines(eval(match, env.gvars(), env.lvars()), + target, source, env, for_signature)) + except NameError: pass + except IndexError: pass + else: + rv.append(env.subst(elt)) + elif callable(elt): + rv.extend(_expandDefines(elt(target, source, env, for_signature), + target, source, env, for_signature)) + elif SCons.Util.is_Sequence(elt): + if len(elt)<2 or elt[1] is None: + rv.append(env.subst(elt[0])) + else: + rv.append(env.subst(elt[0]) + "=" + env.subst(elt[1])) + else: + rv.append(str(elt)) + return rv + +def expandDefines(prefix, defs, suffix, env): + """Expand defines in using . Calls SCons.Defaults._concat_ixes +to append prefix/suffix before/after each define. + + callable + Call the callable and replace it with the call result. If the result + is a list, the list is processed recursively. It the result is a + dictionary it is converted into a list of typles and processed + recursively. + '$' or '${}' + Replace the element with the variable expansion. If the result is a + list, the list is processed recursively. It the result is a + dictionary it is converted into a list of typles and processed + recursively. + '' + Define a symbol with that (expanded!) name + iterable + The iteratble must have two elments. The first element defines the + symbol name, the second the symbol value.""" + + defs = _expandDefines(defs, None, None, env, False) + return SCons.Defaults._concat_ixes(prefix, defs, suffix, env) + def loadTools(env): global senfutildir tooldir = os.path.join(senfutildir, 'site_tools') @@ -117,6 +175,8 @@ def SetupForSENF(env, senf_path = []): REVISION = "unknown", ) + env.Replace( _defines = expandDefines ) + # Interpret command line options parseArguments( env,