From 476e33ed8a5c34ae0a6ec55e0587df99794a217f Mon Sep 17 00:00:00 2001 From: stevenknight Date: Tue, 7 Jan 2003 06:08:53 +0000 Subject: [PATCH] Fix specifying only the source argument to a MultiStepBuilder (such as Program). git-svn-id: http://scons.tigris.org/svn/scons/trunk@537 fdb21ef1-2011-0410-befe-b5e4ea1792b1 --- src/CHANGES.txt | 3 + src/engine/SCons/Builder.py | 6 +- src/engine/SCons/BuilderTests.py | 6 ++ test/Program.py | 102 ++++++++++++++++++++++++++++++- 4 files changed, 115 insertions(+), 2 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 0c608da5..c2977184 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -34,6 +34,9 @@ RELEASE 0.10 - XXX - Significant performance improvement from using a more efficient check, throughout the code, for whether a Node has a Builder. + - Fix specifying only the source file to MultiStepBuilders such as + the Program Builder. (Bug reported by Dean Bair.) + From Steve Leblanc: - Add a Clean() method to support removing user-specified targets diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py index 15358c1c..2c458556 100644 --- a/src/engine/SCons/Builder.py +++ b/src/engine/SCons/Builder.py @@ -425,7 +425,11 @@ class MultiStepBuilder(BuilderBase): self.sdict = {} self.cached_src_suffixes = {} # source suffixes keyed on id(env) - def __call__(self, env, target = None, source = None, **kw): + def __call__(self, env, target = None, source = _null, **kw): + if source is _null: + source = target + target = None + slist = SCons.Node.arg2nodes(source, self.source_factory) final_sources = [] diff --git a/src/engine/SCons/BuilderTests.py b/src/engine/SCons/BuilderTests.py index 9905eb90..57069dfc 100644 --- a/src/engine/SCons/BuilderTests.py +++ b/src/engine/SCons/BuilderTests.py @@ -420,6 +420,12 @@ class BuilderTestCase(unittest.TestCase): assert str(tgt.sources[1]) == 'test2.foo', str(tgt.sources[1]) assert str(tgt.sources[2]) == 'test3.txt', str(tgt.sources[2]) + tgt = builder2(env, 'aaa.bar') + assert str(tgt) == 'aaa', str(tgt) + assert str(tgt.sources[0]) == 'aaa.foo', str(tgt.sources[0]) + assert str(tgt.sources[0].sources[0]) == 'aaa.bar', \ + str(tgt.sources[0].sources[0]) + builder3 = SCons.Builder.MultiStepBuilder(name = "builder3", action = 'foo', src_builder = 'xyzzy', diff --git a/test/Program.py b/test/Program.py index 5e1f259d..ee892998 100644 --- a/test/Program.py +++ b/test/Program.py @@ -39,13 +39,17 @@ test = TestSCons.TestSCons() foo1 = test.workpath('foo1' + _exe) foo2 = test.workpath('foo2' + _exe) foo3 = test.workpath('foo3' + _exe) -foo_args = 'foo1%s foo2%s foo3%s' % (_exe, _exe, _exe) +foo4 = test.workpath('foo4' + _exe) +foo5 = test.workpath('foo5' + _exe) +foo_args = 'foo1%s foo2%s foo3%s foo4%s foo5%s' % (_exe, _exe, _exe, _exe, _exe) test.write('SConstruct', """ env = Environment() env.Program(target = 'foo1', source = 'f1.c') env.Program(target = 'foo2', source = Split('f2a.c f2b.c f2c.c')) env.Program(target = 'foo3', source = ['f3a.c', 'f3b.c', 'f3c.c']) +env.Program('foo4', 'f4.c') +env.Program('foo5.c') """) test.write('f1.c', r""" @@ -118,11 +122,33 @@ main(int argc, char *argv[]) } """) +test.write('f4.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("f4.c\n"); + exit (0); +} +""") + +test.write('foo5.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("foo5.c\n"); + exit (0); +} +""") + test.run(arguments = '.') test.run(program = foo1, stdout = "f1.c\n") test.run(program = foo2, stdout = "f2a.c\nf2b.c\nf2c.c\n") test.run(program = foo3, stdout = "f3a.c\nf3b.c\nf3c.c\n") +test.run(program = foo4, stdout = "f4.c\n") +test.run(program = foo5, stdout = "foo5.c\n") test.up_to_date(arguments = '.') @@ -144,11 +170,33 @@ f3b(void) } """) +test.write('f4.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("f4.c X\n"); + exit (0); +} +""") + +test.write('foo5.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("foo5.c X\n"); + exit (0); +} +""") + test.run(arguments = '.') test.run(program = foo1, stdout = "f1.c X\n") test.run(program = foo2, stdout = "f2a.c\nf2b.c\nf2c.c\n") test.run(program = foo3, stdout = "f3a.c\nf3b.c X\nf3c.c\n") +test.run(program = foo4, stdout = "f4.c X\n") +test.run(program = foo5, stdout = "foo5.c X\n") test.up_to_date(arguments = '.') @@ -156,6 +204,8 @@ test.up_to_date(arguments = '.') oldtime1 = os.path.getmtime(foo1) oldtime2 = os.path.getmtime(foo2) oldtime3 = os.path.getmtime(foo3) +oldtime4 = os.path.getmtime(foo4) +oldtime5 = os.path.getmtime(foo5) time.sleep(2) # introduce a small delay, to make the test valid @@ -164,6 +214,8 @@ test.run(arguments = foo_args) test.fail_test(oldtime1 != os.path.getmtime(foo1)) test.fail_test(oldtime2 != os.path.getmtime(foo2)) test.fail_test(oldtime3 != os.path.getmtime(foo3)) +test.fail_test(oldtime4 != os.path.getmtime(foo4)) +test.fail_test(oldtime5 != os.path.getmtime(foo5)) test.write('f1.c', r""" int @@ -183,11 +235,33 @@ f3b(void) } """) +test.write('f4.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("f4.c Y\n"); + exit (0); +} +""") + +test.write('foo5.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("foo5.c Y\n"); + exit (0); +} +""") + test.run(arguments = foo_args) test.run(program = foo1, stdout = "f1.c Y\n") test.run(program = foo2, stdout = "f2a.c\nf2b.c\nf2c.c\n") test.run(program = foo3, stdout = "f3a.c\nf3b.c Y\nf3c.c\n") +test.run(program = foo4, stdout = "f4.c Y\n") +test.run(program = foo5, stdout = "foo5.c Y\n") test.up_to_date(arguments = foo_args) @@ -209,11 +283,33 @@ f3b(void) } """) +test.write('f4.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("f4.c Z\n"); + exit (0); +} +""") + +test.write('foo5.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("foo5.c Z\n"); + exit (0); +} +""") + test.run(arguments = foo_args) test.run(program = foo1, stdout = "f1.c Z\n") test.run(program = foo2, stdout = "f2a.c\nf2b.c\nf2c.c\n") test.run(program = foo3, stdout = "f3a.c\nf3b.c Z\nf3c.c\n") +test.run(program = foo4, stdout = "f4.c Z\n") +test.run(program = foo5, stdout = "foo5.c Z\n") test.up_to_date(arguments = foo_args) @@ -221,6 +317,8 @@ test.up_to_date(arguments = foo_args) oldtime1 = os.path.getmtime(foo1) oldtime2 = os.path.getmtime(foo2) oldtime3 = os.path.getmtime(foo3) +oldtime4 = os.path.getmtime(foo4) +oldtime5 = os.path.getmtime(foo5) time.sleep(2) # introduce a small delay, to make the test valid @@ -229,5 +327,7 @@ test.run(arguments = foo_args) test.fail_test(not (oldtime1 == os.path.getmtime(foo1))) test.fail_test(not (oldtime2 == os.path.getmtime(foo2))) test.fail_test(not (oldtime3 == os.path.getmtime(foo3))) +test.fail_test(not (oldtime4 == os.path.getmtime(foo4))) +test.fail_test(not (oldtime5 == os.path.getmtime(foo5))) test.pass_test() -- 2.26.2