From 505226b97a4aaf41695e3e1c818f768e35565bf9 Mon Sep 17 00:00:00 2001 From: Alexey Klimkin Date: Tue, 13 Jan 2015 17:40:33 -0800 Subject: Fix incomplete LIBS flattening and substitution in Program scanner --- src/engine/SCons/Scanner/Prog.py | 14 ++++++++++++-- src/engine/SCons/Scanner/ProgTests.py | 28 +++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/engine/SCons/Scanner/Prog.py b/src/engine/SCons/Scanner/Prog.py index 49e93a5..848f874 100644 --- a/src/engine/SCons/Scanner/Prog.py +++ b/src/engine/SCons/Scanner/Prog.py @@ -38,6 +38,15 @@ def ProgramScanner(**kw): ps = SCons.Scanner.Base(scan, "ProgramScanner", **kw) return ps +def _split_libs(env, libs): + """ + Substitute environment variables and split into list. + """ + libs = env.subst(libs) + if SCons.Util.is_String(libs): + libs = libs.split() + return libs + def scan(node, env, libpath = ()): """ This scanner scans program files for static-library @@ -51,9 +60,11 @@ def scan(node, env, libpath = ()): # There are no LIBS in this environment, so just return a null list: return [] if SCons.Util.is_String(libs): - libs = libs.split() + libs = _split_libs(env, libs) else: libs = SCons.Util.flatten(libs) + libs = map(lambda x: _split_libs(env, x) if SCons.Util.is_String(x) else x, libs) + libs = SCons.Util.flatten(libs) try: prefix = env['LIBPREFIXES'] @@ -83,7 +94,6 @@ def scan(node, env, libpath = ()): adjustixes = SCons.Util.adjustixes for lib in libs: if SCons.Util.is_String(lib): - lib = env.subst(lib) for pref, suf in pairs: l = adjustixes(lib, pref, suf) l = find_file(l, libpath, verbose=print_find_libs) diff --git a/src/engine/SCons/Scanner/ProgTests.py b/src/engine/SCons/Scanner/ProgTests.py index 144addb..98e20cc 100644 --- a/src/engine/SCons/Scanner/ProgTests.py +++ b/src/engine/SCons/Scanner/ProgTests.py @@ -73,7 +73,7 @@ class DummyEnvironment(object): def subst(self, s, target=None, source=None, conv=None): try: - if s[0] == '$': + if isinstance(s, str) and s[0] == '$': return self._dict[s[1:]] except IndexError: return '' @@ -223,6 +223,30 @@ class ProgramScannerTestCase8(unittest.TestCase): deps = s(DummyNode('dummy'), env, path) assert deps == [n1, n2], deps +class ProgramScannerTestCase9(unittest.TestCase): + def runTest(self): + env = DummyEnvironment(LIBPATH=[ test.workpath("dir") ], + LIBS=['foo', '$LIBBAR'], + LIBPREFIXES=['lib'], + LIBSUFFIXES=['.a'], + LIBBAR=['sub/libbar', 'xyz.other']) + s = SCons.Scanner.Prog.ProgramScanner() + path = s.path(env) + deps = s(DummyNode('dummy'), env, path) + assert deps_match(deps, ['dir/libfoo.a', 'dir/sub/libbar.a', 'dir/libxyz.other']), list(map(str, deps)) + +class ProgramScannerTestCase10(unittest.TestCase): + def runTest(self): + env = DummyEnvironment(LIBPATH=[ test.workpath("dir") ], + LIBS=['foo', '$LIBBAR'], + LIBPREFIXES=['lib'], + LIBSUFFIXES=['.a'], + LIBBAR='sub/libbar xyz.other') + s = SCons.Scanner.Prog.ProgramScanner() + path = s.path(env) + deps = s(DummyNode('dummy'), env, path) + assert deps_match(deps, ['dir/libfoo.a', 'dir/sub/libbar.a', 'dir/libxyz.other']), list(map(str, deps)) + def suite(): suite = unittest.TestSuite() suite.addTest(ProgramScannerTestCase1()) @@ -232,6 +256,8 @@ def suite(): suite.addTest(ProgramScannerTestCase6()) suite.addTest(ProgramScannerTestCase7()) suite.addTest(ProgramScannerTestCase8()) + suite.addTest(ProgramScannerTestCase9()) + suite.addTest(ProgramScannerTestCase10()) try: unicode except NameError: pass else: -- cgit v0.12 From 8e4b5aca7a47a60ed3a5f0b98bf0804e91e182b4 Mon Sep 17 00:00:00 2001 From: Alexey Klimkin Date: Tue, 20 Jan 2015 13:26:56 -0800 Subject: Improve readability of LIB substitution code --- src/engine/SCons/Scanner/Prog.py | 22 +++++++++++++--------- src/engine/SCons/Scanner/ProgTests.py | 11 ++++------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/engine/SCons/Scanner/Prog.py b/src/engine/SCons/Scanner/Prog.py index 848f874..4781175 100644 --- a/src/engine/SCons/Scanner/Prog.py +++ b/src/engine/SCons/Scanner/Prog.py @@ -38,13 +38,21 @@ def ProgramScanner(**kw): ps = SCons.Scanner.Base(scan, "ProgramScanner", **kw) return ps -def _split_libs(env, libs): +def _subst_libs(env, libs): """ Substitute environment variables and split into list. """ - libs = env.subst(libs) if SCons.Util.is_String(libs): - libs = libs.split() + libs = env.subst(libs) + if SCons.Util.is_String(libs): + libs = libs.split() + elif SCons.Util.is_Sequence(libs): + _libs = [] + for l in libs: + _libs += _subst_libs(env, l) + libs = _libs + else: + libs = [libs] return libs def scan(node, env, libpath = ()): @@ -59,12 +67,8 @@ def scan(node, env, libpath = ()): except KeyError: # There are no LIBS in this environment, so just return a null list: return [] - if SCons.Util.is_String(libs): - libs = _split_libs(env, libs) - else: - libs = SCons.Util.flatten(libs) - libs = map(lambda x: _split_libs(env, x) if SCons.Util.is_String(x) else x, libs) - libs = SCons.Util.flatten(libs) + + libs = _subst_libs(env, libs) try: prefix = env['LIBPREFIXES'] diff --git a/src/engine/SCons/Scanner/ProgTests.py b/src/engine/SCons/Scanner/ProgTests.py index 98e20cc..ace3ff4 100644 --- a/src/engine/SCons/Scanner/ProgTests.py +++ b/src/engine/SCons/Scanner/ProgTests.py @@ -32,6 +32,7 @@ import TestUnit import SCons.Node.FS import SCons.Scanner.Prog +import SCons.Subst test = TestCmd.TestCmd(workdir = '') @@ -72,12 +73,7 @@ class DummyEnvironment(object): del self.Dictionary()[key] def subst(self, s, target=None, source=None, conv=None): - try: - if isinstance(s, str) and s[0] == '$': - return self._dict[s[1:]] - except IndexError: - return '' - return s + return SCons.Subst.scons_subst(s, self, gvars=self._dict, lvars=self._dict) def subst_path(self, path, target=None, source=None, conv=None): if not isinstance(path, list): @@ -241,7 +237,8 @@ class ProgramScannerTestCase10(unittest.TestCase): LIBS=['foo', '$LIBBAR'], LIBPREFIXES=['lib'], LIBSUFFIXES=['.a'], - LIBBAR='sub/libbar xyz.other') + LIBBAR='sub/libbar $LIBBAR2', + LIBBAR2=['xyz.other']) s = SCons.Scanner.Prog.ProgramScanner() path = s.path(env) deps = s(DummyNode('dummy'), env, path) -- cgit v0.12 From 3c229dfb912628cede20119af721862d87202c0b Mon Sep 17 00:00:00 2001 From: Alexey Klimkin Date: Mon, 26 Jan 2015 20:07:11 -0800 Subject: Add comment for a case where LIBS (or part of it) is an object --- src/engine/SCons/Scanner/Prog.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/engine/SCons/Scanner/Prog.py b/src/engine/SCons/Scanner/Prog.py index 4781175..6567b3d 100644 --- a/src/engine/SCons/Scanner/Prog.py +++ b/src/engine/SCons/Scanner/Prog.py @@ -52,6 +52,7 @@ def _subst_libs(env, libs): _libs += _subst_libs(env, l) libs = _libs else: + # libs is an object (Node, for example) libs = [libs] return libs -- cgit v0.12