From ef16e30c75234061b97203234d94f3776087631a Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Mon, 15 Nov 2004 16:52:55 +0000 Subject: Add more command-line customizability: and . --- doc/man/scons.1 | 18 ++++ src/CHANGES.txt | 5 +- src/engine/SCons/Defaults.py | 4 +- test/LEX.py | 138 --------------------------- test/LEX/LEX.py | 138 +++++++++++++++++++++++++++ test/LEX/LEXCOM.py | 66 +++++++++++++ test/LEX/LEXCOMSTR.py | 71 ++++++++++++++ test/LEX/LEXFLAGS.py | 120 ++++++++++++++++++++++++ test/LEXFLAGS.py | 120 ------------------------ test/YACC.py | 219 ------------------------------------------- test/YACC/YACC.py | 219 +++++++++++++++++++++++++++++++++++++++++++ test/YACC/YACCCOM.py | 66 +++++++++++++ test/YACC/YACCCOMSTR.py | 71 ++++++++++++++ test/YACC/YACCFLAGS.py | 145 ++++++++++++++++++++++++++++ test/YACCFLAGS.py | 145 ---------------------------- 15 files changed, 919 insertions(+), 626 deletions(-) delete mode 100644 test/LEX.py create mode 100644 test/LEX/LEX.py create mode 100644 test/LEX/LEXCOM.py create mode 100644 test/LEX/LEXCOMSTR.py create mode 100644 test/LEX/LEXFLAGS.py delete mode 100644 test/LEXFLAGS.py delete mode 100644 test/YACC.py create mode 100644 test/YACC/YACC.py create mode 100644 test/YACC/YACCCOM.py create mode 100644 test/YACC/YACCCOMSTR.py create mode 100644 test/YACC/YACCFLAGS.py delete mode 100644 test/YACCFLAGS.py diff --git a/doc/man/scons.1 b/doc/man/scons.1 index 511dbac..6c11a6e 100644 --- a/doc/man/scons.1 +++ b/doc/man/scons.1 @@ -5500,6 +5500,15 @@ General options passed to the lexical analyzer generator. The command line used to call the lexical analyzer generator to generate a source file. +.IP LEXCOMSTR +The string displayed when generating a source file +using the lexical analyzer generator. +If this is not set, then $LEXCOM (the command line) is displayed. + +.ES +env = Environment(LEXCOMSTR = "Lex'ing $TARGET from $SOURCES") +.EE + .IP _LIBDIRFLAGS An automatically-generated construction variable containing the linker command-line options @@ -6622,6 +6631,15 @@ The parser generator. The command line used to call the parser generator to generate a source file. +.IP YACCCOMSTR +The string displayed when generating a source file +using the parser generator. +If this is not set, then $YACCCOM (the command line) is displayed. + +.ES +env = Environment(YACCCOMSTR = "Yacc'ing $TARGET from $SOURCES") +.EE + .IP YACCFLAGS General options passed to the parser generator. If $YACCFLAGS contains a \-d option, diff --git a/src/CHANGES.txt b/src/CHANGES.txt index de6502c..d89d29c 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -131,8 +131,9 @@ RELEASE 0.97 - XXX source file names. - Support easier configurability of what's displayed by various default - actions through new construction variables: $ASCOMSTR, $CCCOMSTR, - $CXXCOMSTR, $LINKCOMSTR, $SHCCCOMSTR and $SHCXXCOMSTR, $SHLINKCOMSTR. + actions by adding new construction variables: $ASCOMSTR, $CCCOMSTR, + $CXXCOMSTR, $LEXCOMSTR, $LINKCOMSTR, $SHCCCOMSTR, $SHCXXCOMSTR, + $SHLINKCOMSTR and $YACCCOMSTR. From Wayne Lee: diff --git a/src/engine/SCons/Defaults.py b/src/engine/SCons/Defaults.py index 45e09e6..6f90f5b 100644 --- a/src/engine/SCons/Defaults.py +++ b/src/engine/SCons/Defaults.py @@ -134,8 +134,8 @@ ShLinkAction = SCons.Action.Action("$SHLINKCOM", "$SHLINKCOMSTR") ArAction = SCons.Action.Action("$ARCOM") -LexAction = SCons.Action.Action("$LEXCOM") -YaccAction = SCons.Action.Action("$YACCCOM") +LexAction = SCons.Action.Action("$LEXCOM", "$LEXCOMSTR") +YaccAction = SCons.Action.Action("$YACCCOM", "$YACCCOMSTR") ProgScan = SCons.Scanner.Prog.ProgScan() diff --git a/test/LEX.py b/test/LEX.py deleted file mode 100644 index 3f596fb..0000000 --- a/test/LEX.py +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env python -# -# __COPYRIGHT__ -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" - -import os -import os.path -import string -import sys -import TestSCons - -python = TestSCons.python -_exe = TestSCons._exe - -test = TestSCons.TestSCons() - - - -test.write('mylex.py', """ -import getopt -import string -import sys -cmd_opts, args = getopt.getopt(sys.argv[1:], 't', []) -for a in args: - contents = open(a, 'rb').read() - sys.stdout.write(string.replace(contents, 'LEX', 'mylex.py')) -sys.exit(0) -""") - -test.write('SConstruct', """ -env = Environment(LEX = r'%s mylex.py', tools=['default', 'lex']) -env.Program(target = 'aaa', source = 'aaa.l') -env.Program(target = 'bbb', source = 'bbb.lex') -""" % python) - -test.write('aaa.l', r""" -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("LEX\n"); - printf("aaa.l\n"); - exit (0); -} -""") - -test.write('bbb.lex', r""" -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("LEX\n"); - printf("bbb.lex\n"); - exit (0); -} -""") - -test.run(arguments = '.', stderr = None) - -test.run(program = test.workpath('aaa' + _exe), stdout = "mylex.py\naaa.l\n") -test.run(program = test.workpath('bbb' + _exe), stdout = "mylex.py\nbbb.lex\n") - - - -lex = test.where_is('lex') - -if lex: - - test.write("wrapper.py", """import os -import string -import sys -open('%s', 'wb').write("wrapper.py\\n") -os.system(string.join(sys.argv[1:], " ")) -""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\')) - - test.write('SConstruct', """ -foo = Environment() -lex = foo.Dictionary('LEX') -bar = Environment(LEX = r'%s wrapper.py ' + lex) -foo.Program(target = 'foo', source = 'foo.l') -bar.Program(target = 'bar', source = 'bar.l') -""" % python) - - lex = r""" -%%%% -a printf("A%sA"); -b printf("B%sB"); -%%%% -int -yywrap() -{ - return 1; -} - -main() -{ - yylex(); -} -""" - - test.write('foo.l', lex % ('foo.l', 'foo.l')) - - test.write('bar.l', lex % ('bar.l', 'bar.l')) - - test.run(arguments = 'foo' + _exe, stderr = None) - - test.fail_test(os.path.exists(test.workpath('wrapper.out'))) - - test.run(program = test.workpath('foo'), stdin = "a\n", stdout = "Afoo.lA\n") - - test.run(arguments = 'bar' + _exe) - - test.fail_test(test.read('wrapper.out') != "wrapper.py\n") - - test.run(program = test.workpath('bar'), stdin = "b\n", stdout = "Bbar.lB\n") - -test.pass_test() diff --git a/test/LEX/LEX.py b/test/LEX/LEX.py new file mode 100644 index 0000000..3f596fb --- /dev/null +++ b/test/LEX/LEX.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import os.path +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('mylex.py', """ +import getopt +import string +import sys +cmd_opts, args = getopt.getopt(sys.argv[1:], 't', []) +for a in args: + contents = open(a, 'rb').read() + sys.stdout.write(string.replace(contents, 'LEX', 'mylex.py')) +sys.exit(0) +""") + +test.write('SConstruct', """ +env = Environment(LEX = r'%s mylex.py', tools=['default', 'lex']) +env.Program(target = 'aaa', source = 'aaa.l') +env.Program(target = 'bbb', source = 'bbb.lex') +""" % python) + +test.write('aaa.l', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("LEX\n"); + printf("aaa.l\n"); + exit (0); +} +""") + +test.write('bbb.lex', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("LEX\n"); + printf("bbb.lex\n"); + exit (0); +} +""") + +test.run(arguments = '.', stderr = None) + +test.run(program = test.workpath('aaa' + _exe), stdout = "mylex.py\naaa.l\n") +test.run(program = test.workpath('bbb' + _exe), stdout = "mylex.py\nbbb.lex\n") + + + +lex = test.where_is('lex') + +if lex: + + test.write("wrapper.py", """import os +import string +import sys +open('%s', 'wb').write("wrapper.py\\n") +os.system(string.join(sys.argv[1:], " ")) +""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\')) + + test.write('SConstruct', """ +foo = Environment() +lex = foo.Dictionary('LEX') +bar = Environment(LEX = r'%s wrapper.py ' + lex) +foo.Program(target = 'foo', source = 'foo.l') +bar.Program(target = 'bar', source = 'bar.l') +""" % python) + + lex = r""" +%%%% +a printf("A%sA"); +b printf("B%sB"); +%%%% +int +yywrap() +{ + return 1; +} + +main() +{ + yylex(); +} +""" + + test.write('foo.l', lex % ('foo.l', 'foo.l')) + + test.write('bar.l', lex % ('bar.l', 'bar.l')) + + test.run(arguments = 'foo' + _exe, stderr = None) + + test.fail_test(os.path.exists(test.workpath('wrapper.out'))) + + test.run(program = test.workpath('foo'), stdin = "a\n", stdout = "Afoo.lA\n") + + test.run(arguments = 'bar' + _exe) + + test.fail_test(test.read('wrapper.out') != "wrapper.py\n") + + test.run(program = test.workpath('bar'), stdin = "b\n", stdout = "Bbar.lB\n") + +test.pass_test() diff --git a/test/LEX/LEXCOM.py b/test/LEX/LEXCOM.py new file mode 100644 index 0000000..ea4626d --- /dev/null +++ b/test/LEX/LEXCOM.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +""" +Test the ability to configure the $LEXCOM construction variable. +""" + +import TestSCons + +python = TestSCons.python + +test = TestSCons.TestSCons() + + + +test.write('mylex.py', """ +import sys +outfile = open(sys.argv[1], 'wb') +for f in sys.argv[2:]: + infile = open(f, 'rb') + for l in filter(lambda l: l != '/*lex*/\\n', infile.readlines()): + outfile.write(l) +sys.exit(0) +""") + +test.write('SConstruct', """ +env = Environment(tools=['default', 'lex'], + LEXCOM = r'%s mylex.py $TARGET $SOURCES') +env.CFile(target = 'aaa', source = 'aaa.l') +env.CFile(target = 'bbb', source = 'bbb.lex') +""" % python) + +test.write('aaa.l', "aaa.l\n/*lex*/\n") +test.write('bbb.lex', "bbb.lex\n/*lex*/\n") + +test.run(arguments = '.') + +test.must_match('aaa.c', "aaa.l\n") +test.must_match('bbb.c', "bbb.lex\n") + + + +test.pass_test() diff --git a/test/LEX/LEXCOMSTR.py b/test/LEX/LEXCOMSTR.py new file mode 100644 index 0000000..5b01df7 --- /dev/null +++ b/test/LEX/LEXCOMSTR.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +""" +Test that the $LEXCOMSTR construction variable allows you to customize +the displayed string when lex is called. +""" + +import TestSCons + +python = TestSCons.python + +test = TestSCons.TestSCons() + + + +test.write('mylex.py', """ +import sys +outfile = open(sys.argv[1], 'wb') +for f in sys.argv[2:]: + infile = open(f, 'rb') + for l in filter(lambda l: l != '/*lex*/\\n', infile.readlines()): + outfile.write(l) +sys.exit(0) +""") + +test.write('SConstruct', """ +env = Environment(tools=['default', 'lex'], + LEXCOM = r'%s mylex.py $TARGET $SOURCES', + LEXCOMSTR = 'Lexing $TARGET from $SOURCE') +env.CFile(target = 'aaa', source = 'aaa.l') +env.CFile(target = 'bbb', source = 'bbb.lex') +""" % python) + +test.write('aaa.l', "aaa.l\n/*lex*/\n") +test.write('bbb.lex', "bbb.lex\n/*lex*/\n") + +test.run(stdout = test.wrap_stdout("""\ +Lexing aaa.c from aaa.l +Lexing bbb.c from bbb.lex +""")) + +test.must_match('aaa.c', "aaa.l\n") +test.must_match('bbb.c', "bbb.lex\n") + + + +test.pass_test() diff --git a/test/LEX/LEXFLAGS.py b/test/LEX/LEXFLAGS.py new file mode 100644 index 0000000..ba440da --- /dev/null +++ b/test/LEX/LEXFLAGS.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import os.path +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('mylex.py', """ +import getopt +import string +import sys +cmd_opts, args = getopt.getopt(sys.argv[1:], 'tx', []) +opt_string = '' +for opt, arg in cmd_opts: + opt_string = opt_string + ' ' + opt +for a in args: + contents = open(a, 'rb').read() + sys.stdout.write(string.replace(contents, 'LEXFLAGS', opt_string)) +sys.exit(0) +""") + +test.write('SConstruct', """ +env = Environment(LEX = r'%s mylex.py', LEXFLAGS = '-x', tools=['default', 'lex']) +env.Program(target = 'aaa', source = 'aaa.l') +""" % python) + +test.write('aaa.l', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("LEXFLAGS\n"); + printf("aaa.l\n"); + exit (0); +} +""") + +test.run(arguments = 'aaa' + _exe, stderr = None) + +test.run(program = test.workpath('aaa' + _exe), stdout = " -x -t\naaa.l\n") + + + +lex = test.where_is('lex') + +if lex: + + test.write('SConstruct', """ +foo = Environment() +bar = Environment(LEXFLAGS = '-b') +foo.Program(target = 'foo', source = 'foo.l') +bar.Program(target = 'bar', source = 'bar.l') +""") + + lex = r""" +%%%% +a printf("A%sA"); +b printf("B%sB"); +%%%% +int +yywrap() +{ + return 1; +} + +main() +{ + yylex(); +} +""" + + test.write('foo.l', lex % ('foo.l', 'foo.l')) + + test.write('bar.l', lex % ('bar.l', 'bar.l')) + + test.run(arguments = 'foo' + _exe, stderr = None) + + test.fail_test(os.path.exists(test.workpath('lex.backup'))) + + test.run(program = test.workpath('foo'), stdin = "a\n", stdout = "Afoo.lA\n") + + test.run(arguments = 'bar' + _exe) + + test.fail_test(not os.path.exists(test.workpath('lex.backup'))) + + test.run(program = test.workpath('bar'), stdin = "b\n", stdout = "Bbar.lB\n") + +test.pass_test() diff --git a/test/LEXFLAGS.py b/test/LEXFLAGS.py deleted file mode 100644 index ba440da..0000000 --- a/test/LEXFLAGS.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python -# -# __COPYRIGHT__ -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" - -import os -import os.path -import string -import sys -import TestSCons - -python = TestSCons.python -_exe = TestSCons._exe - -test = TestSCons.TestSCons() - - - -test.write('mylex.py', """ -import getopt -import string -import sys -cmd_opts, args = getopt.getopt(sys.argv[1:], 'tx', []) -opt_string = '' -for opt, arg in cmd_opts: - opt_string = opt_string + ' ' + opt -for a in args: - contents = open(a, 'rb').read() - sys.stdout.write(string.replace(contents, 'LEXFLAGS', opt_string)) -sys.exit(0) -""") - -test.write('SConstruct', """ -env = Environment(LEX = r'%s mylex.py', LEXFLAGS = '-x', tools=['default', 'lex']) -env.Program(target = 'aaa', source = 'aaa.l') -""" % python) - -test.write('aaa.l', r""" -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("LEXFLAGS\n"); - printf("aaa.l\n"); - exit (0); -} -""") - -test.run(arguments = 'aaa' + _exe, stderr = None) - -test.run(program = test.workpath('aaa' + _exe), stdout = " -x -t\naaa.l\n") - - - -lex = test.where_is('lex') - -if lex: - - test.write('SConstruct', """ -foo = Environment() -bar = Environment(LEXFLAGS = '-b') -foo.Program(target = 'foo', source = 'foo.l') -bar.Program(target = 'bar', source = 'bar.l') -""") - - lex = r""" -%%%% -a printf("A%sA"); -b printf("B%sB"); -%%%% -int -yywrap() -{ - return 1; -} - -main() -{ - yylex(); -} -""" - - test.write('foo.l', lex % ('foo.l', 'foo.l')) - - test.write('bar.l', lex % ('bar.l', 'bar.l')) - - test.run(arguments = 'foo' + _exe, stderr = None) - - test.fail_test(os.path.exists(test.workpath('lex.backup'))) - - test.run(program = test.workpath('foo'), stdin = "a\n", stdout = "Afoo.lA\n") - - test.run(arguments = 'bar' + _exe) - - test.fail_test(not os.path.exists(test.workpath('lex.backup'))) - - test.run(program = test.workpath('bar'), stdin = "b\n", stdout = "Bbar.lB\n") - -test.pass_test() diff --git a/test/YACC.py b/test/YACC.py deleted file mode 100644 index 062e4bc..0000000 --- a/test/YACC.py +++ /dev/null @@ -1,219 +0,0 @@ -#!/usr/bin/env python -# -# __COPYRIGHT__ -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" - -import os -import os.path -import string -import sys -import TestSCons - -python = TestSCons.python -_exe = TestSCons._exe - -if sys.platform == 'win32': - compiler = 'msvc' - linker = 'mslink' -else: - compiler = 'gcc' - linker = 'gnulink' - -test = TestSCons.TestSCons() - - - -test.write('myyacc.py', """ -import getopt -import string -import sys -cmd_opts, args = getopt.getopt(sys.argv[1:], 'o:', []) -output = None -opt_string = '' -for opt, arg in cmd_opts: - if opt == '-o': output = open(arg, 'wb') - else: opt_string = opt_string + ' ' + opt -for a in args: - contents = open(a, 'rb').read() - output.write(string.replace(contents, 'YACC', 'myyacc.py')) -output.close() -sys.exit(0) -""") - - - -test.write('SConstruct', """ -env = Environment(YACC = r'%s myyacc.py', tools=['default', 'yacc']) -env.Program(target = 'aaa', source = 'aaa.y') -env.Program(target = 'bbb', source = 'bbb.yacc') -""" % python) - -test.write('aaa.y', r""" -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("YACC\n"); - printf("aaa.y\n"); - exit (0); -} -""") - -test.write('bbb.yacc', r""" -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("YACC\n"); - printf("bbb.yacc\n"); - exit (0); -} -""") - -test.run(arguments = '.', stderr = None) - -test.run(program = test.workpath('aaa' + _exe), stdout = "myyacc.py\naaa.y\n") -test.run(program = test.workpath('bbb' + _exe), stdout = "myyacc.py\nbbb.yacc\n") - - - -yacc = test.where_is('yacc') - -if yacc: - - test.write("wrapper.py", -"""import os -import string -import sys -open('%s', 'wb').write("wrapper.py\\n") -os.system(string.join(sys.argv[1:], " ")) -""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\')) - - test.write('SConstruct', """ -foo = Environment(YACCFLAGS='-d') -yacc = foo.Dictionary('YACC') -bar = Environment(YACC = r'%s wrapper.py ' + yacc) -foo.Program(target = 'foo', source = 'foo.y') -bar.Program(target = 'bar', source = 'bar.y') -foo.Program(target = 'hello', source = ['hello.cpp']) -foo.CXXFile(target = 'file.cpp', source = ['file.yy'], YACCFLAGS='-d') -foo.CFile(target = 'not_foo', source = 'foo.y') -""" % python) - - yacc = r""" -%%{ -#include - -main() -{ - yyparse(); -} - -yyerror(s) -char *s; -{ - fprintf(stderr, "%%s\n", s); - return 0; -} - -yylex() -{ - int c; - - c = fgetc(stdin); - return (c == EOF) ? 0 : c; -} -%%} -%%%% -input: letter newline { printf("%s\n"); }; -letter: 'a' | 'b'; -newline: '\n'; -""" - - test.write("file.yy", """\ -%token GRAPH_T NODE_T EDGE_T DIGRAPH_T EDGEOP_T SUBGRAPH_T - -%pure_parser - -%% -graph: GRAPH_T - ; - -%% -""") - - test.write("hello.cpp", """\ -#include "file.hpp" - -int main() -{ -} -""") - - test.write('foo.y', yacc % 'foo.y') - - test.write('bar.y', yacc % 'bar.y') - - # Build the foo program - test.run(arguments = 'foo' + _exe, stderr = None) - - test.up_to_date(arguments = 'foo' + _exe) - - test.fail_test(os.path.exists(test.workpath('wrapper.out'))) - - test.run(program = test.workpath('foo'), stdin = "a\n", stdout = "foo.y\n") - - test.fail_test(not os.path.exists(test.workpath('foo.h'))) - - test.run(arguments = '-c .') - - test.fail_test(os.path.exists(test.workpath('foo.h'))) - - # - test.run(arguments = 'not_foo.c') - - test.up_to_date(arguments = 'not_foo.c') - - test.fail_test(os.path.exists(test.workpath('foo.h'))) - test.fail_test(not os.path.exists(test.workpath('not_foo.h'))) - - test.run(arguments = '-c .') - - test.fail_test(os.path.exists(test.workpath('not_foo.h'))) - - # - test.run(arguments = 'bar' + _exe) - - test.up_to_date(arguments = 'bar' + _exe) - - test.fail_test(test.read('wrapper.out') != "wrapper.py\n") - - test.run(program = test.workpath('bar'), stdin = "b\n", stdout = "bar.y\n") - - # - test.run(arguments = '.') - - test.up_to_date(arguments = '.') - -test.pass_test() diff --git a/test/YACC/YACC.py b/test/YACC/YACC.py new file mode 100644 index 0000000..062e4bc --- /dev/null +++ b/test/YACC/YACC.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import os.path +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +if sys.platform == 'win32': + compiler = 'msvc' + linker = 'mslink' +else: + compiler = 'gcc' + linker = 'gnulink' + +test = TestSCons.TestSCons() + + + +test.write('myyacc.py', """ +import getopt +import string +import sys +cmd_opts, args = getopt.getopt(sys.argv[1:], 'o:', []) +output = None +opt_string = '' +for opt, arg in cmd_opts: + if opt == '-o': output = open(arg, 'wb') + else: opt_string = opt_string + ' ' + opt +for a in args: + contents = open(a, 'rb').read() + output.write(string.replace(contents, 'YACC', 'myyacc.py')) +output.close() +sys.exit(0) +""") + + + +test.write('SConstruct', """ +env = Environment(YACC = r'%s myyacc.py', tools=['default', 'yacc']) +env.Program(target = 'aaa', source = 'aaa.y') +env.Program(target = 'bbb', source = 'bbb.yacc') +""" % python) + +test.write('aaa.y', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("YACC\n"); + printf("aaa.y\n"); + exit (0); +} +""") + +test.write('bbb.yacc', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("YACC\n"); + printf("bbb.yacc\n"); + exit (0); +} +""") + +test.run(arguments = '.', stderr = None) + +test.run(program = test.workpath('aaa' + _exe), stdout = "myyacc.py\naaa.y\n") +test.run(program = test.workpath('bbb' + _exe), stdout = "myyacc.py\nbbb.yacc\n") + + + +yacc = test.where_is('yacc') + +if yacc: + + test.write("wrapper.py", +"""import os +import string +import sys +open('%s', 'wb').write("wrapper.py\\n") +os.system(string.join(sys.argv[1:], " ")) +""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\')) + + test.write('SConstruct', """ +foo = Environment(YACCFLAGS='-d') +yacc = foo.Dictionary('YACC') +bar = Environment(YACC = r'%s wrapper.py ' + yacc) +foo.Program(target = 'foo', source = 'foo.y') +bar.Program(target = 'bar', source = 'bar.y') +foo.Program(target = 'hello', source = ['hello.cpp']) +foo.CXXFile(target = 'file.cpp', source = ['file.yy'], YACCFLAGS='-d') +foo.CFile(target = 'not_foo', source = 'foo.y') +""" % python) + + yacc = r""" +%%{ +#include + +main() +{ + yyparse(); +} + +yyerror(s) +char *s; +{ + fprintf(stderr, "%%s\n", s); + return 0; +} + +yylex() +{ + int c; + + c = fgetc(stdin); + return (c == EOF) ? 0 : c; +} +%%} +%%%% +input: letter newline { printf("%s\n"); }; +letter: 'a' | 'b'; +newline: '\n'; +""" + + test.write("file.yy", """\ +%token GRAPH_T NODE_T EDGE_T DIGRAPH_T EDGEOP_T SUBGRAPH_T + +%pure_parser + +%% +graph: GRAPH_T + ; + +%% +""") + + test.write("hello.cpp", """\ +#include "file.hpp" + +int main() +{ +} +""") + + test.write('foo.y', yacc % 'foo.y') + + test.write('bar.y', yacc % 'bar.y') + + # Build the foo program + test.run(arguments = 'foo' + _exe, stderr = None) + + test.up_to_date(arguments = 'foo' + _exe) + + test.fail_test(os.path.exists(test.workpath('wrapper.out'))) + + test.run(program = test.workpath('foo'), stdin = "a\n", stdout = "foo.y\n") + + test.fail_test(not os.path.exists(test.workpath('foo.h'))) + + test.run(arguments = '-c .') + + test.fail_test(os.path.exists(test.workpath('foo.h'))) + + # + test.run(arguments = 'not_foo.c') + + test.up_to_date(arguments = 'not_foo.c') + + test.fail_test(os.path.exists(test.workpath('foo.h'))) + test.fail_test(not os.path.exists(test.workpath('not_foo.h'))) + + test.run(arguments = '-c .') + + test.fail_test(os.path.exists(test.workpath('not_foo.h'))) + + # + test.run(arguments = 'bar' + _exe) + + test.up_to_date(arguments = 'bar' + _exe) + + test.fail_test(test.read('wrapper.out') != "wrapper.py\n") + + test.run(program = test.workpath('bar'), stdin = "b\n", stdout = "bar.y\n") + + # + test.run(arguments = '.') + + test.up_to_date(arguments = '.') + +test.pass_test() diff --git a/test/YACC/YACCCOM.py b/test/YACC/YACCCOM.py new file mode 100644 index 0000000..5f7cd38 --- /dev/null +++ b/test/YACC/YACCCOM.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +""" +Test the ability to configure the $YACCCOM construction variable. +""" + +import TestSCons + +python = TestSCons.python + +test = TestSCons.TestSCons() + + + +test.write('myyacc.py', """ +import sys +outfile = open(sys.argv[1], 'wb') +for f in sys.argv[2:]: + infile = open(f, 'rb') + for l in filter(lambda l: l != '/*yacc*/\\n', infile.readlines()): + outfile.write(l) +sys.exit(0) +""") + +test.write('SConstruct', """ +env = Environment(tools=['default', 'yacc'], + YACCCOM = r'%s myyacc.py $TARGET $SOURCES') +env.CFile(target = 'aaa', source = 'aaa.y') +env.CFile(target = 'bbb', source = 'bbb.yacc') +""" % python) + +test.write('aaa.y', "aaa.y\n/*yacc*/\n") +test.write('bbb.yacc', "bbb.yacc\n/*yacc*/\n") + +test.run(arguments = '.') + +test.must_match('aaa.c', "aaa.y\n") +test.must_match('bbb.c', "bbb.yacc\n") + + + +test.pass_test() diff --git a/test/YACC/YACCCOMSTR.py b/test/YACC/YACCCOMSTR.py new file mode 100644 index 0000000..cfb48b7 --- /dev/null +++ b/test/YACC/YACCCOMSTR.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +""" +Test that the $YACCCOMSTR construction variable allows you to customize +the displayed string when yacc is called. +""" + +import TestSCons + +python = TestSCons.python + +test = TestSCons.TestSCons() + + + +test.write('myyacc.py', """ +import sys +outfile = open(sys.argv[1], 'wb') +for f in sys.argv[2:]: + infile = open(f, 'rb') + for l in filter(lambda l: l != '/*yacc*/\\n', infile.readlines()): + outfile.write(l) +sys.exit(0) +""") + +test.write('SConstruct', """ +env = Environment(tools=['default', 'yacc'], + YACCCOM = r'%s myyacc.py $TARGET $SOURCES', + YACCCOMSTR = 'Yaccing $TARGET from $SOURCE') +env.CFile(target = 'aaa', source = 'aaa.y') +env.CFile(target = 'bbb', source = 'bbb.yacc') +""" % python) + +test.write('aaa.y', "aaa.y\n/*yacc*/\n") +test.write('bbb.yacc', "bbb.yacc\n/*yacc*/\n") + +test.run(stdout = test.wrap_stdout("""\ +Yaccing aaa.c from aaa.y +Yaccing bbb.c from bbb.yacc +""")) + +test.must_match('aaa.c', "aaa.y\n") +test.must_match('bbb.c', "bbb.yacc\n") + + + +test.pass_test() diff --git a/test/YACC/YACCFLAGS.py b/test/YACC/YACCFLAGS.py new file mode 100644 index 0000000..022b238 --- /dev/null +++ b/test/YACC/YACCFLAGS.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import os.path +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +if sys.platform == 'win32': + compiler = 'msvc' + linker = 'mslink' +else: + compiler = 'gcc' + linker = 'gnulink' + +test = TestSCons.TestSCons() + + + +test.write('myyacc.py', """ +import getopt +import string +import sys +cmd_opts, args = getopt.getopt(sys.argv[1:], 'o:x', []) +output = None +opt_string = '' +for opt, arg in cmd_opts: + if opt == '-o': output = open(arg, 'wb') + else: opt_string = opt_string + ' ' + opt +for a in args: + contents = open(a, 'rb').read() + output.write(string.replace(contents, 'YACCFLAGS', opt_string)) +output.close() +sys.exit(0) +""") + +test.write('SConstruct', """ +env = Environment(YACC = r'%s myyacc.py', YACCFLAGS = '-x', tools=['yacc', '%s', '%s']) +env.Program(target = 'aaa', source = 'aaa.y') +""" % (python, linker, compiler)) + +test.write('aaa.y', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("YACCFLAGS\n"); + printf("aaa.y\n"); + exit (0); +} +""") + +test.run(arguments = 'aaa' + _exe, stderr = None) + +test.run(program = test.workpath('aaa' + _exe), stdout = " -x\naaa.y\n") + + + +yacc = test.where_is('yacc') + +if yacc: + + test.write('SConstruct', """ +foo = Environment() +bar = Environment(YACCFLAGS = '-v') +foo.Program(target = 'foo', source = 'foo.y') +bar.Program(target = 'bar', source = 'bar.y') +""") + + yacc = r""" +%%{ +#include + +main() +{ + yyparse(); +} + +yyerror(s) +char *s; +{ + fprintf(stderr, "%%s\n", s); + return 0; +} + +yylex() +{ + int c; + + c = fgetc(stdin); + return (c == EOF) ? 0 : c; +} +%%} +%%%% +input: letter newline { printf("%s\n"); }; +letter: 'a' | 'b'; +newline: '\n'; +""" + + test.write('foo.y', yacc % 'foo.y') + + test.write('bar.y', yacc % 'bar.y') + + test.run(arguments = 'foo' + _exe, stderr = None) + + test.fail_test(os.path.exists(test.workpath('foo.output')) + or os.path.exists(test.workpath('y.output'))) + + test.run(program = test.workpath('foo'), stdin = "a\n", stdout = "foo.y\n") + + test.run(arguments = 'bar' + _exe) + + test.fail_test(not os.path.exists(test.workpath('bar.output')) + and not os.path.exists(test.workpath('y.output'))) + + test.run(program = test.workpath('bar'), stdin = "b\n", stdout = "bar.y\n") + +test.pass_test() diff --git a/test/YACCFLAGS.py b/test/YACCFLAGS.py deleted file mode 100644 index 022b238..0000000 --- a/test/YACCFLAGS.py +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env python -# -# __COPYRIGHT__ -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" - -import os -import os.path -import string -import sys -import TestSCons - -python = TestSCons.python -_exe = TestSCons._exe - -if sys.platform == 'win32': - compiler = 'msvc' - linker = 'mslink' -else: - compiler = 'gcc' - linker = 'gnulink' - -test = TestSCons.TestSCons() - - - -test.write('myyacc.py', """ -import getopt -import string -import sys -cmd_opts, args = getopt.getopt(sys.argv[1:], 'o:x', []) -output = None -opt_string = '' -for opt, arg in cmd_opts: - if opt == '-o': output = open(arg, 'wb') - else: opt_string = opt_string + ' ' + opt -for a in args: - contents = open(a, 'rb').read() - output.write(string.replace(contents, 'YACCFLAGS', opt_string)) -output.close() -sys.exit(0) -""") - -test.write('SConstruct', """ -env = Environment(YACC = r'%s myyacc.py', YACCFLAGS = '-x', tools=['yacc', '%s', '%s']) -env.Program(target = 'aaa', source = 'aaa.y') -""" % (python, linker, compiler)) - -test.write('aaa.y', r""" -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("YACCFLAGS\n"); - printf("aaa.y\n"); - exit (0); -} -""") - -test.run(arguments = 'aaa' + _exe, stderr = None) - -test.run(program = test.workpath('aaa' + _exe), stdout = " -x\naaa.y\n") - - - -yacc = test.where_is('yacc') - -if yacc: - - test.write('SConstruct', """ -foo = Environment() -bar = Environment(YACCFLAGS = '-v') -foo.Program(target = 'foo', source = 'foo.y') -bar.Program(target = 'bar', source = 'bar.y') -""") - - yacc = r""" -%%{ -#include - -main() -{ - yyparse(); -} - -yyerror(s) -char *s; -{ - fprintf(stderr, "%%s\n", s); - return 0; -} - -yylex() -{ - int c; - - c = fgetc(stdin); - return (c == EOF) ? 0 : c; -} -%%} -%%%% -input: letter newline { printf("%s\n"); }; -letter: 'a' | 'b'; -newline: '\n'; -""" - - test.write('foo.y', yacc % 'foo.y') - - test.write('bar.y', yacc % 'bar.y') - - test.run(arguments = 'foo' + _exe, stderr = None) - - test.fail_test(os.path.exists(test.workpath('foo.output')) - or os.path.exists(test.workpath('y.output'))) - - test.run(program = test.workpath('foo'), stdin = "a\n", stdout = "foo.y\n") - - test.run(arguments = 'bar' + _exe) - - test.fail_test(not os.path.exists(test.workpath('bar.output')) - and not os.path.exists(test.workpath('y.output'))) - - test.run(program = test.workpath('bar'), stdin = "b\n", stdout = "bar.y\n") - -test.pass_test() -- cgit v0.12