From 3329c3567f5770a30830b70983b381cee205949c Mon Sep 17 00:00:00 2001 From: stevenknight Date: Tue, 11 Dec 2001 04:32:16 +0000 Subject: [PATCH] Move autogeneration of PATH-based variables from Environment initialization to variable interpolation. git-svn-id: http://scons.tigris.org/svn/scons/trunk@138 fdb21ef1-2011-0410-befe-b5e4ea1792b1 --- src/engine/SCons/Builder.py | 5 ++- src/engine/SCons/BuilderTests.py | 12 ++++++ src/engine/SCons/Environment.py | 59 ---------------------------- src/engine/SCons/EnvironmentTests.py | 25 +----------- src/engine/SCons/Util.py | 59 ++++++++++++++++++++++++++++ src/engine/SCons/UtilTests.py | 26 ++++++++++++ 6 files changed, 102 insertions(+), 84 deletions(-) diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py index 60aafb10..59d2affb 100644 --- a/src/engine/SCons/Builder.py +++ b/src/engine/SCons/Builder.py @@ -34,7 +34,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import os import os.path import SCons.Node.FS -from SCons.Util import PathList, scons_str2nodes, scons_subst, scons_subst_list +from SCons.Util import PathList, scons_str2nodes, scons_subst, scons_subst_list, autogenerate import string import types from UserList import UserList @@ -364,6 +364,9 @@ class ActionBase: dict.update(kw) + # Autogenerate necessary construction variables. + autogenerate(dict) + return dict class CommandAction(ActionBase): diff --git a/src/engine/SCons/BuilderTests.py b/src/engine/SCons/BuilderTests.py index fd55f03a..31135c01 100644 --- a/src/engine/SCons/BuilderTests.py +++ b/src/engine/SCons/BuilderTests.py @@ -275,6 +275,18 @@ class BuilderTestCase(unittest.TestCase): contents = b3.get_contents() assert contents == "foo\177\036\000\177\037\000d\000\000Sbar", repr(contents) + b4 = SCons.Builder.Builder(action = "$_LIBFLAGS $_LIBDIRFLAGS $_INCFLAGS") + contents = b4.get_contents(LIBS = ['foo', 'bar'], + LIBLINKPREFIX = '-l', + LIBLINKSUFFIX = '', + LIBPATH = ['lib'], + LIBDIRPREFIX = '-L', + LIBDIRSUFFIX = '/', + CPPPATH = ['c', 'p'], + INCPREFIX = '-I', + INCSUFFIX = '') + assert contents == "-lfoo -lbar -Llib/ -Ic -Ip", contents + def test_name(self): """Test Builder creation with a specified name """ diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py index f85f7238..b93a3dd2 100644 --- a/src/engine/SCons/Environment.py +++ b/src/engine/SCons/Environment.py @@ -73,21 +73,6 @@ class Environment: Environment. """ - # See the documentation for the __autogenerate() method - # for an explanation of this variable... - AUTO_GEN_VARS = ( ( '_LIBFLAGS', - 'LIBS', - 'LIBLINKPREFIX', - 'LIBLINKSUFFIX' ), - ( '_LIBDIRFLAGS', - 'LIBPATH', - 'LIBDIRPREFIX', - 'LIBDIRSUFFIX' ), - ( '_INCFLAGS', - 'CPPPATH', - 'INCPREFIX', - 'INCSUFFIX' ) ) - def __init__(self, **kw): import SCons.Defaults self._dict = copy.deepcopy(SCons.Defaults.ConstructionEnvironment) @@ -96,7 +81,6 @@ class Environment: if kw.has_key('SCANNERS') and type(kw['SCANNERS']) != type([]): kw['SCANNERS'] = [kw['SCANNERS']] self._dict.update(copy.deepcopy(kw)) - self.__autogenerate() class BuilderWrapper: """Wrapper class that allows an environment to @@ -126,48 +110,6 @@ class Environment: for s in self._dict['SCANNERS']: setattr(self, s.name, s) - def __autogenerate(self): - """Autogenerate the "interpolated" environment variables. - We read a static structure that tells us how. AUTO_GEN_VARS - is a tuple of tuples. Each inner tuple has four elements, - each strings referring to an environment variable, and describing - how to autogenerate a particular variable. The elements are: - - 0 - The variable to generate - 1 - The "source" variable, usually a list - 2 - The "prefix" variable - 3 - The "suffix" variable - - The autogenerated variable is a list, consisting of every - element of the source list, or a single element if the source - is a string, with the prefix and suffix - concatenated.""" - - for strVarAuto, strSrc, strPref, strSuff, in self.AUTO_GEN_VARS: - if self._dict.has_key(strSrc): - src_var = self._dict[strSrc] - if type(src_var) is types.ListType or \ - isinstance(src_var, UserList): - src_var = map(str, src_var) - else: - src_var = [ str(src_var), ] - else: - src_var = [] - - try: - prefix = str(self._dict[strPref]) - except KeyError: - prefix='' - - try: - suffix = str(self._dict[strSuff]) - except KeyError: - suffix ='' - - self._dict[strVarAuto] = map(lambda x, suff=suffix, pref=prefix: \ - pref + os.path.normpath(str(x)) + suff, - src_var) - def __cmp__(self, other): return cmp(self._dict, other._dict) @@ -194,7 +136,6 @@ class Environment: construction variables and/or values. """ self._dict.update(copy.deepcopy(kw)) - self.__autogenerate() def Depends(self, target, dependency): """Explicity specify that 'target's depend on 'dependency'.""" diff --git a/src/engine/SCons/EnvironmentTests.py b/src/engine/SCons/EnvironmentTests.py index 82b19bef..af9ccb73 100644 --- a/src/engine/SCons/EnvironmentTests.py +++ b/src/engine/SCons/EnvironmentTests.py @@ -262,30 +262,7 @@ class EnvironmentTestCase(unittest.TestCase): str = env.subst("$AAA ${AAA}A ${AAA}B $BBB") assert str == "c c", str - def test_autogenerate(self): - """Test autogenerated environment variables.""" - env = Environment(LIBS = [ 'foo', 'bar', 'baz' ], - LIBLINKPREFIX = 'foo', - LIBLINKSUFFIX = 'bar') - assert len(env.Dictionary('_LIBFLAGS')) == 3, env.Dictionary('_LIBFLAGS') - assert env.Dictionary('_LIBFLAGS')[0] == 'foofoobar', \ - env.Dictionary('_LIBFLAGS')[0] - assert env.Dictionary('_LIBFLAGS')[1] == 'foobarbar', \ - env.Dictionary('_LIBFLAGS')[1] - assert env.Dictionary('_LIBFLAGS')[2] == 'foobazbar', \ - env.Dictionary('_LIBFLAGS')[2] - - env = Environment(CPPPATH = [ 'foo', 'bar', 'baz' ], - INCPREFIX = 'foo', - INCSUFFIX = 'bar') - assert len(env.Dictionary('_INCFLAGS')) == 3, env.Dictionary('_INCFLAGS') - assert env.Dictionary('_INCFLAGS')[0] == 'foofoobar', \ - env.Dictionary('_INCFLAGS')[0] - assert env.Dictionary('_INCFLAGS')[1] == 'foobarbar', \ - env.Dictionary('_INCFLAGS')[1] - assert env.Dictionary('_INCFLAGS')[2] == 'foobazbar', \ - env.Dictionary('_INCFLAGS')[2] - + if __name__ == "__main__": suite = unittest.makeSuite(EnvironmentTestCase, 'test_') diff --git a/src/engine/SCons/Util.py b/src/engine/SCons/Util.py index 9108f146..b8286d1f 100644 --- a/src/engine/SCons/Util.py +++ b/src/engine/SCons/Util.py @@ -254,3 +254,62 @@ def find_files(filenames, paths, pass return nodes + + + +# See the documentation for the __autogenerate() method +# for an explanation of this variable... +AUTO_GEN_VARS = ( ( '_LIBFLAGS', + 'LIBS', + 'LIBLINKPREFIX', + 'LIBLINKSUFFIX' ), + ( '_LIBDIRFLAGS', + 'LIBPATH', + 'LIBDIRPREFIX', + 'LIBDIRSUFFIX' ), + ( '_INCFLAGS', + 'CPPPATH', + 'INCPREFIX', + 'INCSUFFIX' ) ) + +def autogenerate(dict): + """Autogenerate the "interpolated" environment variables. + We read a static structure that tells us how. AUTO_GEN_VARS + is a tuple of tuples. Each inner tuple has four elements, + each strings referring to an environment variable, and describing + how to autogenerate a particular variable. The elements are: + + 0 - The variable to generate + 1 - The "source" variable, usually a list + 2 - The "prefix" variable + 3 - The "suffix" variable + + The autogenerated variable is a list, consisting of every + element of the source list, or a single element if the source + is a string, with the prefix and suffix + concatenated.""" + + for strVarAuto, strSrc, strPref, strSuff, in AUTO_GEN_VARS: + if dict.has_key(strSrc): + src_var = dict[strSrc] + if type(src_var) is types.ListType or \ + isinstance(src_var, UserList): + src_var = map(str, src_var) + else: + src_var = [ str(src_var), ] + else: + src_var = [] + + try: + prefix = str(dict[strPref]) + except KeyError: + prefix='' + + try: + suffix = str(dict[strSuff]) + except KeyError: + suffix ='' + + dict[strVarAuto] = map(lambda x, suff=suffix, pref=prefix: \ + pref + os.path.normpath(str(x)) + suff, + src_var) diff --git a/src/engine/SCons/UtilTests.py b/src/engine/SCons/UtilTests.py index 58e81b5f..7eadc9dc 100644 --- a/src/engine/SCons/UtilTests.py +++ b/src/engine/SCons/UtilTests.py @@ -173,6 +173,32 @@ class UtilTestCase(unittest.TestCase): file_names = map(os.path.normpath, file_names) assert os.path.normpath('./foo') in file_names, file_names assert os.path.normpath('./bar/baz') in file_names, file_names + + def test_autogenerate(dict): + """Test autogenerating variables in a dictionary.""" + dict = {'LIBS' : [ 'foo', 'bar', 'baz' ], + 'LIBLINKPREFIX' : 'foo', + 'LIBLINKSUFFIX' : 'bar'} + autogenerate(dict) + assert len(dict['_LIBFLAGS']) == 3, dict('_LIBFLAGS') + assert dict['_LIBFLAGS'][0] == 'foofoobar', \ + dict['_LIBFLAGS'][0] + assert dict['_LIBFLAGS'][1] == 'foobarbar', \ + dict['_LIBFLAGS'][1] + assert dict['_LIBFLAGS'][2] == 'foobazbar', \ + dict['_LIBFLAGS'][2] + + dict = {'CPPPATH' : [ 'foo', 'bar', 'baz' ], + 'INCPREFIX' : 'foo', + 'INCSUFFIX' : 'bar'} + autogenerate(dict) + assert len(dict['_INCFLAGS']) == 3, dict('_INCFLAGS') + assert dict['_INCFLAGS'][0] == 'foofoobar', \ + dict['_INCFLAGS'][0] + assert dict['_INCFLAGS'][1] == 'foobarbar', \ + dict['_INCFLAGS'][1] + assert dict['_INCFLAGS'][2] == 'foobazbar', \ + dict['_INCFLAGS'][2] if __name__ == "__main__": -- 2.26.2