diff options
author | Steven Knight <knight@baldmt.com> | 2003-01-07 06:08:53 (GMT) |
---|---|---|
committer | Steven Knight <knight@baldmt.com> | 2003-01-07 06:08:53 (GMT) |
commit | cbb5c537f33929ddf7795d627ccae0f42b5b361f (patch) | |
tree | e044335901f538f41beb05fae0ca16c15623748a | |
parent | 7fbd5909a526fc1ad282c7e701b0f7832af2e3ed (diff) | |
download | SCons-cbb5c537f33929ddf7795d627ccae0f42b5b361f.zip SCons-cbb5c537f33929ddf7795d627ccae0f42b5b361f.tar.gz SCons-cbb5c537f33929ddf7795d627ccae0f42b5b361f.tar.bz2 |
Fix specifying only the source argument to a MultiStepBuilder (such as Program).
-rw-r--r-- | src/CHANGES.txt | 3 | ||||
-rw-r--r-- | src/engine/SCons/Builder.py | 6 | ||||
-rw-r--r-- | src/engine/SCons/BuilderTests.py | 6 | ||||
-rw-r--r-- | test/Program.py | 102 |
4 files changed, 115 insertions, 2 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 0c608da..c297718 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 15358c1..2c45855 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 9905eb9..57069df 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 5e1f259..ee89299 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() |