From 949becdd3c7437c6f6af345e25c80c24d696d487 Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Mon, 15 Nov 2004 12:43:04 +0000 Subject: Easier customization of printable strings for , and . --- doc/man/scons.1 | 27 +++ src/CHANGES.txt | 4 + src/engine/SCons/Action.py | 7 +- src/engine/SCons/ActionTests.py | 23 ++ src/engine/SCons/Defaults.py | 6 +- test/AS.py | 459 ---------------------------------------- test/AS/AS.py | 459 ++++++++++++++++++++++++++++++++++++++++ test/AS/ASCOM.py | 81 +++++++ test/AS/ASCOMSTR.py | 88 ++++++++ test/AS/ASFLAGS.py | 185 ++++++++++++++++ test/ASFLAGS.py | 185 ---------------- test/CC.py | 199 ----------------- test/CC/CC.py | 199 +++++++++++++++++ test/CC/CCCOM.py | 81 +++++++ test/CC/CCCOMSTR.py | 86 ++++++++ test/CC/CCFLAGS.py | 94 ++++++++ test/CCFLAGS.py | 94 -------- test/CXX.py | 229 -------------------- test/CXX/CXX.py | 229 ++++++++++++++++++++ test/CXX/CXXCOM.py | 81 +++++++ test/CXX/CXXCOMSTR.py | 86 ++++++++ test/CXX/CXXFILESUFFIX.py | 75 +++++++ test/CXXFILESUFFIX.py | 75 ------- 23 files changed, 1807 insertions(+), 1245 deletions(-) delete mode 100644 test/AS.py create mode 100644 test/AS/AS.py create mode 100644 test/AS/ASCOM.py create mode 100644 test/AS/ASCOMSTR.py create mode 100644 test/AS/ASFLAGS.py delete mode 100644 test/ASFLAGS.py delete mode 100644 test/CC.py create mode 100644 test/CC/CC.py create mode 100644 test/CC/CCCOM.py create mode 100644 test/CC/CCCOMSTR.py create mode 100644 test/CC/CCFLAGS.py delete mode 100644 test/CCFLAGS.py delete mode 100644 test/CXX.py create mode 100644 test/CXX/CXX.py create mode 100644 test/CXX/CXXCOM.py create mode 100644 test/CXX/CXXCOMSTR.py create mode 100644 test/CXX/CXXFILESUFFIX.py delete mode 100644 test/CXXFILESUFFIX.py diff --git a/doc/man/scons.1 b/doc/man/scons.1 index 59e0d62..b2ccd71 100644 --- a/doc/man/scons.1 +++ b/doc/man/scons.1 @@ -4441,6 +4441,15 @@ The assembler. The command line used to generate an object file from an assembly-language source file. +.IP ASCOMSTR +The string displayed when an object file +is generated from an assembly-language source file. +If this is not set, then $ASCOM (the command line) is displayed. + +.ES +env = Environment(ASCOMSTR = "Assembling $TARGET") +.EE + .IP ASFLAGS General options passed to the assembler. @@ -4518,6 +4527,15 @@ The command line used to compile a C source file to a (static) object file. Any options specified in the $CCFLAGS and $CPPFLAGS construction variables are included on this command line. +.IP CCCOMSTR +The string displayed when a C source file +is compiled to a (static) object file. +If this is not set, then $CCCOM (the command line) is displayed. + +.ES +env = Environment(CCCOMSTR = "Compiling $TARGET") +.EE + .IP CCFLAGS General options that are passed to the C compiler. @@ -4773,6 +4791,15 @@ The command line used to compile a C++ source file to an object file. Any options specified in the $CXXFLAGS and $CPPFLAGS construction variables are included on this command line. +.IP CXXCOMSTR +The string displayed when a C++ source file +is compiled to a (static) object file. +If this is not set, then $CXXCOM (the command line) is displayed. + +.ES +env = Environment(CXXCOMSTR = "Compiling $TARGET") +.EE + .IP CXXFLAGS General options that are passed to the C++ compiler. diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 4755f18..b84f25a 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -130,6 +130,10 @@ RELEASE 0.97 - XXX - Fix expansion of env.Command() overrides within target and source file names. + - Support easier configurability of what's displayed by various default + actions through new construction variables: $ASCOMSTR, $CCCOMSTR, + $CXXCOMSTR. + From Wayne Lee: - Avoid "maximum recursion limit" errors when removing $(-$) pairs diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py index a8e6c5b..545bd61 100644 --- a/src/engine/SCons/Action.py +++ b/src/engine/SCons/Action.py @@ -323,7 +323,7 @@ def _string_from_cmd_list(cmd_list): class CommandAction(_ActionAction): """Class for command-execution actions.""" - def __init__(self, cmd, *args, **kw): + def __init__(self, cmd, cmdstr=None, *args, **kw): # Cmd can actually be a list or a single item; if it's a # single item it should be the command string to execute; if a # list then it should be the words of the command string to @@ -340,6 +340,7 @@ class CommandAction(_ActionAction): raise TypeError, "CommandAction should be given only " \ "a single command" self.cmd_list = cmd + self.cmdstr = cmdstr def __str__(self): if SCons.Util.is_List(self.cmd_list): @@ -347,6 +348,10 @@ class CommandAction(_ActionAction): return str(self.cmd_list) def strfunction(self, target, source, env): + if not self.cmdstr is None: + c = env.subst(self.cmdstr, 0, target, source) + if c: + return c cmd_list = env.subst_list(self.cmd_list, 0, target, source) return _string_from_cmd_list(cmd_list[0]) diff --git a/src/engine/SCons/ActionTests.py b/src/engine/SCons/ActionTests.py index f52496a..315b1ac 100644 --- a/src/engine/SCons/ActionTests.py +++ b/src/engine/SCons/ActionTests.py @@ -674,6 +674,11 @@ class CommandActionTestCase(unittest.TestCase): """ a = SCons.Action.CommandAction(["xyzzy"]) assert a.cmd_list == [ "xyzzy" ], a.cmd_list + assert a.cmdstr is None, a.cmdstr + + a = SCons.Action.CommandAction(["abra"], "cadabra") + assert a.cmd_list == [ "abra" ], a.cmd_list + assert a.cmdstr == "cadabra", a.cmdstr def test___str__(self): """Test fetching the pre-substitution string for command Actions @@ -744,6 +749,15 @@ class CommandActionTestCase(unittest.TestCase): s = act.strfunction([t1, t2], [s1, s2], env) assert s == 'xyzzy t1 s1', s + act = SCons.Action.CommandAction('xyzzy $TARGET $SOURCE', + 'cmdstr - $SOURCE - $TARGET -') + s = act.strfunction([], [], env) + assert s == 'cmdstr - - -', s + s = act.strfunction([t1], [s1], env) + assert s == 'cmdstr - s1 - t1 -', s + s = act.strfunction([t1, t2], [s1, s2], env) + assert s == 'cmdstr - s1 - t1 -', s + act = SCons.Action.CommandAction('xyzzy $TARGETS $SOURCES') s = act.strfunction([], [], env) assert s == 'xyzzy', s @@ -752,6 +766,15 @@ class CommandActionTestCase(unittest.TestCase): s = act.strfunction([t1, t2], [s1, s2], env) assert s == 'xyzzy t1 t2 s1 s2', s + act = SCons.Action.CommandAction('xyzzy $TARGETS $SOURCES', + 'cmdstr = $SOURCES = $TARGETS =') + s = act.strfunction([], [], env) + assert s == 'cmdstr = = =', s + s = act.strfunction([t1], [s1], env) + assert s == 'cmdstr = s1 = t1 =', s + s = act.strfunction([t1, t2], [s1, s2], env) + assert s == 'cmdstr = s1 s2 = t1 t2 =', s + act = SCons.Action.CommandAction(['xyzzy', '$TARGET', '$SOURCE', '$TARGETS', '$SOURCES']) diff --git a/src/engine/SCons/Defaults.py b/src/engine/SCons/Defaults.py index 8924455..05d0ad8 100644 --- a/src/engine/SCons/Defaults.py +++ b/src/engine/SCons/Defaults.py @@ -120,13 +120,13 @@ IDLSuffixes = [".idl", ".IDL"] del suffix # Actions for common languages. -CAction = SCons.Action.Action("$CCCOM") +CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR") DAction = SCons.Action.Action("$DCOM") ShCAction = SCons.Action.Action("$SHCCCOM") -CXXAction = SCons.Action.Action("$CXXCOM") +CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR") ShCXXAction = SCons.Action.Action("$SHCXXCOM") -ASAction = SCons.Action.Action("$ASCOM") +ASAction = SCons.Action.Action("$ASCOM", "$ASCOMSTR") ASPPAction = SCons.Action.Action("$ASPPCOM") LinkAction = SCons.Action.Action("$LINKCOM") diff --git a/test/AS.py b/test/AS.py deleted file mode 100644 index adace1e..0000000 --- a/test/AS.py +++ /dev/null @@ -1,459 +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 string -import sys -import TestSCons - -python = TestSCons.python -_exe = TestSCons._exe - -test = TestSCons.TestSCons() - - - -if sys.platform == 'win32': - - test.write('mylink.py', r""" -import string -import sys -args = sys.argv[1:] -while args: - a = args[0] - if a[0] != '/': - break - args = args[1:] - if string.lower(a[:5]) == '/out:': out = a[5:] -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:5] != '#link': - outfile.write(l) -sys.exit(0) -""") - - test.write('myas.py', r""" -import sys -args = sys.argv[1:] -inf = None -while args: - a = args[0] - args = args[1:] - if not a[0] in "/-": - if not inf: - inf = a - continue - if a[:3] == '/Fo': out = a[3:] - if a == '-o': - out = args[0] - args = args[1:] -infile = open(inf, 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:3] != '#as': - outfile.write(l) -sys.exit(0) -""") - -else: - - test.write('mylink.py', r""" -import getopt -import sys -opts, args = getopt.getopt(sys.argv[1:], 'o:') -for opt, arg in opts: - if opt == '-o': out = arg -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:5] != '#link': - outfile.write(l) -sys.exit(0) -""") - - test.write('myas.py', r""" -import getopt -import sys -opts, args = getopt.getopt(sys.argv[1:], 'co:') -for opt, arg in opts: - if opt == '-o': out = arg -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:3] != '#as': - outfile.write(l) -sys.exit(0) -""") - -test.write('SConstruct', """ -env = Environment(LINK = r'%s mylink.py', - LINKFLAGS = [], - AS = r'%s myas.py', - CC = r'%s myas.py') -env.Program(target = 'test1', source = 'test1.s') -env.Program(target = 'test2', source = 'test2.S') -env.Program(target = 'test3', source = 'test3.asm') -env.Program(target = 'test4', source = 'test4.ASM') -env.Program(target = 'test5', source = 'test5.spp') -env.Program(target = 'test6', source = 'test6.SPP') -""" % (python, python, python)) - -test.write('test1.s', r"""This is a .s file. -#as -#link -""") - -test.write('test2.S', r"""This is a .S file. -#as -#link -""") - -test.write('test3.asm', r"""This is a .asm file. -#as -#link -""") - -test.write('test4.ASM', r"""This is a .ASM file. -#as -#link -""") - -test.write('test5.spp', r"""This is a .spp file. -#as -#link -""") - -test.write('test6.SPP', r"""This is a .SPP file. -#as -#link -""") - -test.run(arguments = '.', stderr = None) - -test.fail_test(test.read('test1' + _exe) != "This is a .s file.\n") - -test.fail_test(test.read('test2' + _exe) != "This is a .S file.\n") - -test.fail_test(test.read('test3' + _exe) != "This is a .asm file.\n") - -test.fail_test(test.read('test4' + _exe) != "This is a .ASM file.\n") - -test.fail_test(test.read('test5' + _exe) != "This is a .spp file.\n") - -test.fail_test(test.read('test6' + _exe) != "This is a .SPP file.\n") - - -as = test.detect('AS', 'as') -x86 = (sys.platform == 'win32' or string.find(sys.platform, 'linux') != -1) - -if as and x86: - - test.write("wrapper.py", """\ -import os -import string -import sys -open('%s', 'wb').write("wrapper.py: %%s\\n" %% sys.argv[-1]) -cmd = string.join(sys.argv[1:]) -os.system(cmd) -""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\')) - - test.write('SConstruct', """\ -aaa = Environment() -bbb = aaa.Copy(AS = r'%s wrapper.py ' + WhereIs('as')) -ccc = aaa.Copy(CPPPATH=['.']) -aaa.Program(target = 'aaa', source = ['aaa.s', 'aaa_main.c']) -bbb.Program(target = 'bbb', source = ['bbb.s', 'bbb_main.c']) -ccc.Program(target = 'ccc', source = ['ccc.S', 'ccc_main.c']) -""" % python) - - test.write('aaa.s', -""" .file "aaa.s" -.data -.align 4 -.globl name -name: - .ascii "aaa.s" - .byte 0 -""") - - test.write('bbb.s', """\ -.file "bbb.s" -.data -.align 4 -.globl name -name: - .ascii "bbb.s" - .byte 0 -""") - - test.write('ccc.h', """\ -#define STRING "ccc.S" -""") - - test.write('ccc.S', """\ -#include -.file STRING -.data -.align 4 -.globl name -name: - .ascii STRING - .byte 0 -""") - - test.write('aaa_main.c', r""" -extern char name[]; - -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("aaa_main.c %s\n", name); - exit (0); -} -""") - - test.write('bbb_main.c', r""" -extern char name[]; - -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("bbb_main.c %s\n", name); - exit (0); -} -""") - - test.write('ccc_main.c', r""" -extern char name[]; - -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("ccc_main.c %s\n", name); - exit (0); -} -""") - - test.write('ddd_main.c', r""" -extern char name[]; - -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("ddd_main.c %s\n", name); - exit (0); -} -""") - - test.run() - - test.run(program = test.workpath('aaa'), stdout = "aaa_main.c aaa.s\n") - test.run(program = test.workpath('bbb'), stdout = "bbb_main.c bbb.s\n") - test.run(program = test.workpath('ccc'), stdout = "ccc_main.c ccc.S\n") - - test.fail_test(test.read('wrapper.out') != "wrapper.py: bbb.s\n") - - test.write("ccc.h", """\ -#define STRING "ccc.S 2" -""") - - test.run() - test.run(program = test.workpath('ccc'), stdout = "ccc_main.c ccc.S 2\n") - - test.unlink('wrapper.out') - - - -ml = test.where_is('ml') - -if ml and sys.platform == 'win32': - - 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', """ -import os -ccc = Environment(tools = ['msvc', 'mslink', 'masm'], - ASFLAGS = '/nologo /coff') -ccc['ENV']['PATH'] = ccc['ENV']['PATH'] + os.pathsep + os.environ['PATH'] -ddd = ccc.Copy(AS = r'%s wrapper.py ' + ccc['AS']) -ccc.Program(target = 'ccc', source = ['ccc.asm', 'ccc_main.c']) -ddd.Program(target = 'ddd', source = ['ddd.asm', 'ddd_main.c']) -""" % python) - - test.write('ccc.asm', -""" -DSEG segment - PUBLIC _name -_name byte "ccc.asm",0 -DSEG ends - end -""") - - test.write('ddd.asm', -""" -DSEG segment - PUBLIC _name -_name byte "ddd.asm",0 -DSEG ends - end -""") - - test.write('ccc_main.c', r""" -extern char name[]; - -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("ccc_main.c %s\n", name); - exit (0); -} -""") - - test.write('ddd_main.c', r""" -extern char name[]; - -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("ddd_main.c %s\n", name); - exit (0); -} -""") - - test.run(arguments = 'ccc' + _exe, stderr = None) - - test.run(program = test.workpath('ccc'), stdout = "ccc_main.c ccc.asm\n") - - test.fail_test(os.path.exists(test.workpath('wrapper.out'))) - - test.run(arguments = 'ddd' + _exe) - - test.run(program = test.workpath('ddd'), stdout = "ddd_main.c ddd.asm\n") - - test.fail_test(test.read('wrapper.out') != "wrapper.py\n") - - - - -nasm = test.where_is('nasm') - -if nasm: - - # Allow flexibility about the type of object/executable format - # needed on different systems. Format_map is a dict that maps - # sys.platform substrings to the correct argument for the nasm -f - # option. The default is "elf," which seems to be a reasonable - # lowest common denominator (works on both Linux and FreeBSD, - # anyway...). - nasm_format = 'elf' - format_map = {} - for k, v in format_map.items(): - if string.find(sys.platform, k) != -1: - nasm_format = v - break - - 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', """ -eee = Environment(tools = ['gcc', 'gnulink', 'nasm'], - ASFLAGS = '-f %s') -fff = eee.Copy(AS = r'%s wrapper.py ' + WhereIs('nasm')) -eee.Program(target = 'eee', source = ['eee.asm', 'eee_main.c']) -fff.Program(target = 'fff', source = ['fff.asm', 'fff_main.c']) -""" % (nasm_format, python)) - - test.write('eee.asm', -""" -global name -name: - db 'eee.asm',0 -""") - - test.write('fff.asm', -""" -global name -name: - db 'fff.asm',0 -""") - - test.write('eee_main.c', r""" -extern char name[]; - -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("eee_main.c %s\n", name); - exit (0); -} -""") - - test.write('fff_main.c', r""" -extern char name[]; - -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("fff_main.c %s\n", name); - exit (0); -} -""") - - test.run(arguments = 'eee' + _exe, stderr = None) - - test.run(program = test.workpath('eee'), stdout = "eee_main.c eee.asm\n") - - test.fail_test(os.path.exists(test.workpath('wrapper.out'))) - - test.run(arguments = 'fff' + _exe) - - test.run(program = test.workpath('fff'), stdout = "fff_main.c fff.asm\n") - - test.fail_test(test.read('wrapper.out') != "wrapper.py\n") - - - -test.pass_test() diff --git a/test/AS/AS.py b/test/AS/AS.py new file mode 100644 index 0000000..adace1e --- /dev/null +++ b/test/AS/AS.py @@ -0,0 +1,459 @@ +#!/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 string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +if sys.platform == 'win32': + + test.write('mylink.py', r""" +import string +import sys +args = sys.argv[1:] +while args: + a = args[0] + if a[0] != '/': + break + args = args[1:] + if string.lower(a[:5]) == '/out:': out = a[5:] +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:5] != '#link': + outfile.write(l) +sys.exit(0) +""") + + test.write('myas.py', r""" +import sys +args = sys.argv[1:] +inf = None +while args: + a = args[0] + args = args[1:] + if not a[0] in "/-": + if not inf: + inf = a + continue + if a[:3] == '/Fo': out = a[3:] + if a == '-o': + out = args[0] + args = args[1:] +infile = open(inf, 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:3] != '#as': + outfile.write(l) +sys.exit(0) +""") + +else: + + test.write('mylink.py', r""" +import getopt +import sys +opts, args = getopt.getopt(sys.argv[1:], 'o:') +for opt, arg in opts: + if opt == '-o': out = arg +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:5] != '#link': + outfile.write(l) +sys.exit(0) +""") + + test.write('myas.py', r""" +import getopt +import sys +opts, args = getopt.getopt(sys.argv[1:], 'co:') +for opt, arg in opts: + if opt == '-o': out = arg +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:3] != '#as': + outfile.write(l) +sys.exit(0) +""") + +test.write('SConstruct', """ +env = Environment(LINK = r'%s mylink.py', + LINKFLAGS = [], + AS = r'%s myas.py', + CC = r'%s myas.py') +env.Program(target = 'test1', source = 'test1.s') +env.Program(target = 'test2', source = 'test2.S') +env.Program(target = 'test3', source = 'test3.asm') +env.Program(target = 'test4', source = 'test4.ASM') +env.Program(target = 'test5', source = 'test5.spp') +env.Program(target = 'test6', source = 'test6.SPP') +""" % (python, python, python)) + +test.write('test1.s', r"""This is a .s file. +#as +#link +""") + +test.write('test2.S', r"""This is a .S file. +#as +#link +""") + +test.write('test3.asm', r"""This is a .asm file. +#as +#link +""") + +test.write('test4.ASM', r"""This is a .ASM file. +#as +#link +""") + +test.write('test5.spp', r"""This is a .spp file. +#as +#link +""") + +test.write('test6.SPP', r"""This is a .SPP file. +#as +#link +""") + +test.run(arguments = '.', stderr = None) + +test.fail_test(test.read('test1' + _exe) != "This is a .s file.\n") + +test.fail_test(test.read('test2' + _exe) != "This is a .S file.\n") + +test.fail_test(test.read('test3' + _exe) != "This is a .asm file.\n") + +test.fail_test(test.read('test4' + _exe) != "This is a .ASM file.\n") + +test.fail_test(test.read('test5' + _exe) != "This is a .spp file.\n") + +test.fail_test(test.read('test6' + _exe) != "This is a .SPP file.\n") + + +as = test.detect('AS', 'as') +x86 = (sys.platform == 'win32' or string.find(sys.platform, 'linux') != -1) + +if as and x86: + + test.write("wrapper.py", """\ +import os +import string +import sys +open('%s', 'wb').write("wrapper.py: %%s\\n" %% sys.argv[-1]) +cmd = string.join(sys.argv[1:]) +os.system(cmd) +""" % string.replace(test.workpath('wrapper.out'), '\\', '\\\\')) + + test.write('SConstruct', """\ +aaa = Environment() +bbb = aaa.Copy(AS = r'%s wrapper.py ' + WhereIs('as')) +ccc = aaa.Copy(CPPPATH=['.']) +aaa.Program(target = 'aaa', source = ['aaa.s', 'aaa_main.c']) +bbb.Program(target = 'bbb', source = ['bbb.s', 'bbb_main.c']) +ccc.Program(target = 'ccc', source = ['ccc.S', 'ccc_main.c']) +""" % python) + + test.write('aaa.s', +""" .file "aaa.s" +.data +.align 4 +.globl name +name: + .ascii "aaa.s" + .byte 0 +""") + + test.write('bbb.s', """\ +.file "bbb.s" +.data +.align 4 +.globl name +name: + .ascii "bbb.s" + .byte 0 +""") + + test.write('ccc.h', """\ +#define STRING "ccc.S" +""") + + test.write('ccc.S', """\ +#include +.file STRING +.data +.align 4 +.globl name +name: + .ascii STRING + .byte 0 +""") + + test.write('aaa_main.c', r""" +extern char name[]; + +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("aaa_main.c %s\n", name); + exit (0); +} +""") + + test.write('bbb_main.c', r""" +extern char name[]; + +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("bbb_main.c %s\n", name); + exit (0); +} +""") + + test.write('ccc_main.c', r""" +extern char name[]; + +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("ccc_main.c %s\n", name); + exit (0); +} +""") + + test.write('ddd_main.c', r""" +extern char name[]; + +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("ddd_main.c %s\n", name); + exit (0); +} +""") + + test.run() + + test.run(program = test.workpath('aaa'), stdout = "aaa_main.c aaa.s\n") + test.run(program = test.workpath('bbb'), stdout = "bbb_main.c bbb.s\n") + test.run(program = test.workpath('ccc'), stdout = "ccc_main.c ccc.S\n") + + test.fail_test(test.read('wrapper.out') != "wrapper.py: bbb.s\n") + + test.write("ccc.h", """\ +#define STRING "ccc.S 2" +""") + + test.run() + test.run(program = test.workpath('ccc'), stdout = "ccc_main.c ccc.S 2\n") + + test.unlink('wrapper.out') + + + +ml = test.where_is('ml') + +if ml and sys.platform == 'win32': + + 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', """ +import os +ccc = Environment(tools = ['msvc', 'mslink', 'masm'], + ASFLAGS = '/nologo /coff') +ccc['ENV']['PATH'] = ccc['ENV']['PATH'] + os.pathsep + os.environ['PATH'] +ddd = ccc.Copy(AS = r'%s wrapper.py ' + ccc['AS']) +ccc.Program(target = 'ccc', source = ['ccc.asm', 'ccc_main.c']) +ddd.Program(target = 'ddd', source = ['ddd.asm', 'ddd_main.c']) +""" % python) + + test.write('ccc.asm', +""" +DSEG segment + PUBLIC _name +_name byte "ccc.asm",0 +DSEG ends + end +""") + + test.write('ddd.asm', +""" +DSEG segment + PUBLIC _name +_name byte "ddd.asm",0 +DSEG ends + end +""") + + test.write('ccc_main.c', r""" +extern char name[]; + +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("ccc_main.c %s\n", name); + exit (0); +} +""") + + test.write('ddd_main.c', r""" +extern char name[]; + +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("ddd_main.c %s\n", name); + exit (0); +} +""") + + test.run(arguments = 'ccc' + _exe, stderr = None) + + test.run(program = test.workpath('ccc'), stdout = "ccc_main.c ccc.asm\n") + + test.fail_test(os.path.exists(test.workpath('wrapper.out'))) + + test.run(arguments = 'ddd' + _exe) + + test.run(program = test.workpath('ddd'), stdout = "ddd_main.c ddd.asm\n") + + test.fail_test(test.read('wrapper.out') != "wrapper.py\n") + + + + +nasm = test.where_is('nasm') + +if nasm: + + # Allow flexibility about the type of object/executable format + # needed on different systems. Format_map is a dict that maps + # sys.platform substrings to the correct argument for the nasm -f + # option. The default is "elf," which seems to be a reasonable + # lowest common denominator (works on both Linux and FreeBSD, + # anyway...). + nasm_format = 'elf' + format_map = {} + for k, v in format_map.items(): + if string.find(sys.platform, k) != -1: + nasm_format = v + break + + 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', """ +eee = Environment(tools = ['gcc', 'gnulink', 'nasm'], + ASFLAGS = '-f %s') +fff = eee.Copy(AS = r'%s wrapper.py ' + WhereIs('nasm')) +eee.Program(target = 'eee', source = ['eee.asm', 'eee_main.c']) +fff.Program(target = 'fff', source = ['fff.asm', 'fff_main.c']) +""" % (nasm_format, python)) + + test.write('eee.asm', +""" +global name +name: + db 'eee.asm',0 +""") + + test.write('fff.asm', +""" +global name +name: + db 'fff.asm',0 +""") + + test.write('eee_main.c', r""" +extern char name[]; + +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("eee_main.c %s\n", name); + exit (0); +} +""") + + test.write('fff_main.c', r""" +extern char name[]; + +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("fff_main.c %s\n", name); + exit (0); +} +""") + + test.run(arguments = 'eee' + _exe, stderr = None) + + test.run(program = test.workpath('eee'), stdout = "eee_main.c eee.asm\n") + + test.fail_test(os.path.exists(test.workpath('wrapper.out'))) + + test.run(arguments = 'fff' + _exe) + + test.run(program = test.workpath('fff'), stdout = "fff_main.c fff.asm\n") + + test.fail_test(test.read('wrapper.out') != "wrapper.py\n") + + + +test.pass_test() diff --git a/test/AS/ASCOM.py b/test/AS/ASCOM.py new file mode 100644 index 0000000..da66bca --- /dev/null +++ b/test/AS/ASCOM.py @@ -0,0 +1,81 @@ +#!/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 $ASCOM construction variable. +""" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python + +test = TestSCons.TestSCons() + + + +test.write('myas.py', r""" +import sys +infile = open(sys.argv[2], 'rb') +outfile = open(sys.argv[1], 'wb') +for l in filter(lambda l: l != "#as\n", infile.readlines()): + outfile.write(l) +sys.exit(0) +""") + +if os.path.normcase('.s') == os.path.normcase('.S'): + alt_s_suffix = '.S' + alt_asm_suffix = '.ASM' +else: + alt_s_suffix = '.s' + alt_asm_suffix = '.asm' + +test.write('SConstruct', """ +env = Environment(ASCOM = r'%(python)s myas.py $TARGET $SOURCE', + OBJSUFFIX = '.obj') +env.Object(target = 'test1', source = 'test1.s') +env.Object(target = 'test2', source = 'test2%(alt_s_suffix)s') +env.Object(target = 'test3', source = 'test3.asm') +env.Object(target = 'test4', source = 'test4%(alt_asm_suffix)s') +""" % locals()) + +test.write('test1.s', "test1.s\n#as\n") +test.write('test2'+alt_s_suffix, "test2.S\n#as\n") +test.write('test3.asm', "test3.asm\n#as\n") +test.write('test4'+alt_asm_suffix, "test4.ASM\n#as\n") + +test.run(arguments = '.') + +test.fail_test(test.read('test1.obj') != "test1.s\n") +test.fail_test(test.read('test2.obj') != "test2.S\n") +test.fail_test(test.read('test3.obj') != "test3.asm\n") +test.fail_test(test.read('test4.obj') != "test4.ASM\n") + + + +test.pass_test() diff --git a/test/AS/ASCOMSTR.py b/test/AS/ASCOMSTR.py new file mode 100644 index 0000000..c8eed62 --- /dev/null +++ b/test/AS/ASCOMSTR.py @@ -0,0 +1,88 @@ +#!/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 $ASCOMSTR construction variable allows you to configure +the assembly output. +""" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python + +test = TestSCons.TestSCons() + + + +test.write('myas.py', r""" +import sys +infile = open(sys.argv[2], 'rb') +outfile = open(sys.argv[1], 'wb') +for l in filter(lambda l: l != "#as\n", infile.readlines()): + outfile.write(l) +sys.exit(0) +""") + +if os.path.normcase('.s') == os.path.normcase('.S'): + alt_s_suffix = '.S' + alt_asm_suffix = '.ASM' +else: + alt_s_suffix = '.s' + alt_asm_suffix = '.asm' + +test.write('SConstruct', """ +env = Environment(ASCOM = r'%(python)s myas.py $TARGET $SOURCE', + ASCOMSTR = 'Assembling $TARGET from $SOURCE', + OBJSUFFIX = '.obj') +env.Object(target = 'test1', source = 'test1.s') +env.Object(target = 'test2', source = 'test2%(alt_s_suffix)s') +env.Object(target = 'test3', source = 'test3.asm') +env.Object(target = 'test4', source = 'test4%(alt_asm_suffix)s') +""" % locals()) + +test.write('test1.s', "test1.s\n#as\n") +test.write('test2'+alt_s_suffix, "test2.S\n#as\n") +test.write('test3.asm', "test3.asm\n#as\n") +test.write('test4'+alt_asm_suffix, "test4.ASM\n#as\n") + +test.run(stdout = test.wrap_stdout("""\ +Assembling test1.obj from test1.s +Assembling test2.obj from test2%(alt_s_suffix)s +Assembling test3.obj from test3.asm +Assembling test4.obj from test4%(alt_asm_suffix)s +""" % locals())) + +test.fail_test(test.read('test1.obj') != "test1.s\n") +test.fail_test(test.read('test2.obj') != "test2.S\n") +test.fail_test(test.read('test3.obj') != "test3.asm\n") +test.fail_test(test.read('test4.obj') != "test4.ASM\n") + + + +test.pass_test() diff --git a/test/AS/ASFLAGS.py b/test/AS/ASFLAGS.py new file mode 100644 index 0000000..6396c45 --- /dev/null +++ b/test/AS/ASFLAGS.py @@ -0,0 +1,185 @@ +#!/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 string +import sys +import TestSCons + +python = TestSCons.python + +test = TestSCons.TestSCons() +_exe = TestSCons._exe + + +if sys.platform == 'win32': + + o = ' -x' + + o_c = ' -x' + + test.write('mylink.py', r""" +import string +import sys +args = sys.argv[1:] +while args: + a = args[0] + if a[0] != '/': + break + args = args[1:] + if string.lower(a[:5]) == '/out:': out = a[5:] +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:5] != '#link': + outfile.write(l) +sys.exit(0) +""") + + test.write('myas.py', r""" +import sys +args = sys.argv[1:] +inf = None +optstring = '' +while args: + a = args[0] + args = args[1:] + if not a[0] in '/-': + if not inf: + inf = a + continue + if a[:2] == '/c': + continue + if a[:3] == '/Fo': + out = a[3:] + continue + optstring = optstring + ' ' + a +infile = open(inf, 'rb') +outfile = open(out, 'wb') +outfile.write(optstring + "\n") +for l in infile.readlines(): + if l[:3] != '#as': + outfile.write(l) +sys.exit(0) +""") + +else: + + o = ' -x' + + o_c = ' -x -c' + + test.write('mylink.py', r""" +import getopt +import sys +opts, args = getopt.getopt(sys.argv[1:], 'o:') +for opt, arg in opts: + if opt == '-o': out = arg +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:5] != '#link': + outfile.write(l) +sys.exit(0) +""") + + test.write('myas.py', r""" +import getopt +import sys +opts, args = getopt.getopt(sys.argv[1:], 'co:x') +optstring = '' +for opt, arg in opts: + if opt == '-o': out = arg + else: optstring = optstring + ' ' + opt +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +outfile.write(optstring + "\n") +for l in infile.readlines(): + if l[:3] != '#as': + outfile.write(l) +sys.exit(0) +""") + + + +test.write('SConstruct', """ +env = Environment(LINK = r'%s mylink.py', + LINKFLAGS = [], + AS = r'%s myas.py', ASFLAGS = '-x', + CC = r'%s myas.py') +env.Program(target = 'test1', source = 'test1.s') +env.Program(target = 'test2', source = 'test2.S') +env.Program(target = 'test3', source = 'test3.asm') +env.Program(target = 'test4', source = 'test4.ASM') +env.Program(target = 'test5', source = 'test5.spp') +env.Program(target = 'test6', source = 'test6.SPP') +""" % (python, python, python)) + +test.write('test1.s', r"""This is a .s file. +#as +#link +""") + +test.write('test2.S', r"""This is a .S file. +#as +#link +""") + +test.write('test3.asm', r"""This is a .asm file. +#as +#link +""") + +test.write('test4.ASM', r"""This is a .ASM file. +#as +#link +""") + +test.write('test5.spp', r"""This is a .spp file. +#as +#link +""") + +test.write('test6.SPP', r"""This is a .SPP file. +#as +#link +""") + +test.run(arguments = '.', stderr = None) + +if TestSCons.case_sensitive_suffixes('.s', '.S'): + o_css = o_c +else: + o_css = o + +test.must_match('test1' + _exe, "%s\nThis is a .s file.\n" % o) +test.must_match('test2' + _exe, "%s\nThis is a .S file.\n" % o_css) +test.must_match('test3' + _exe, "%s\nThis is a .asm file.\n" % o) +test.must_match('test4' + _exe, "%s\nThis is a .ASM file.\n" % o) +test.must_match('test5' + _exe, "%s\nThis is a .spp file.\n" % o_c) +test.must_match('test6' + _exe, "%s\nThis is a .SPP file.\n" % o_c) + +test.pass_test() diff --git a/test/ASFLAGS.py b/test/ASFLAGS.py deleted file mode 100644 index 6396c45..0000000 --- a/test/ASFLAGS.py +++ /dev/null @@ -1,185 +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 string -import sys -import TestSCons - -python = TestSCons.python - -test = TestSCons.TestSCons() -_exe = TestSCons._exe - - -if sys.platform == 'win32': - - o = ' -x' - - o_c = ' -x' - - test.write('mylink.py', r""" -import string -import sys -args = sys.argv[1:] -while args: - a = args[0] - if a[0] != '/': - break - args = args[1:] - if string.lower(a[:5]) == '/out:': out = a[5:] -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:5] != '#link': - outfile.write(l) -sys.exit(0) -""") - - test.write('myas.py', r""" -import sys -args = sys.argv[1:] -inf = None -optstring = '' -while args: - a = args[0] - args = args[1:] - if not a[0] in '/-': - if not inf: - inf = a - continue - if a[:2] == '/c': - continue - if a[:3] == '/Fo': - out = a[3:] - continue - optstring = optstring + ' ' + a -infile = open(inf, 'rb') -outfile = open(out, 'wb') -outfile.write(optstring + "\n") -for l in infile.readlines(): - if l[:3] != '#as': - outfile.write(l) -sys.exit(0) -""") - -else: - - o = ' -x' - - o_c = ' -x -c' - - test.write('mylink.py', r""" -import getopt -import sys -opts, args = getopt.getopt(sys.argv[1:], 'o:') -for opt, arg in opts: - if opt == '-o': out = arg -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:5] != '#link': - outfile.write(l) -sys.exit(0) -""") - - test.write('myas.py', r""" -import getopt -import sys -opts, args = getopt.getopt(sys.argv[1:], 'co:x') -optstring = '' -for opt, arg in opts: - if opt == '-o': out = arg - else: optstring = optstring + ' ' + opt -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -outfile.write(optstring + "\n") -for l in infile.readlines(): - if l[:3] != '#as': - outfile.write(l) -sys.exit(0) -""") - - - -test.write('SConstruct', """ -env = Environment(LINK = r'%s mylink.py', - LINKFLAGS = [], - AS = r'%s myas.py', ASFLAGS = '-x', - CC = r'%s myas.py') -env.Program(target = 'test1', source = 'test1.s') -env.Program(target = 'test2', source = 'test2.S') -env.Program(target = 'test3', source = 'test3.asm') -env.Program(target = 'test4', source = 'test4.ASM') -env.Program(target = 'test5', source = 'test5.spp') -env.Program(target = 'test6', source = 'test6.SPP') -""" % (python, python, python)) - -test.write('test1.s', r"""This is a .s file. -#as -#link -""") - -test.write('test2.S', r"""This is a .S file. -#as -#link -""") - -test.write('test3.asm', r"""This is a .asm file. -#as -#link -""") - -test.write('test4.ASM', r"""This is a .ASM file. -#as -#link -""") - -test.write('test5.spp', r"""This is a .spp file. -#as -#link -""") - -test.write('test6.SPP', r"""This is a .SPP file. -#as -#link -""") - -test.run(arguments = '.', stderr = None) - -if TestSCons.case_sensitive_suffixes('.s', '.S'): - o_css = o_c -else: - o_css = o - -test.must_match('test1' + _exe, "%s\nThis is a .s file.\n" % o) -test.must_match('test2' + _exe, "%s\nThis is a .S file.\n" % o_css) -test.must_match('test3' + _exe, "%s\nThis is a .asm file.\n" % o) -test.must_match('test4' + _exe, "%s\nThis is a .ASM file.\n" % o) -test.must_match('test5' + _exe, "%s\nThis is a .spp file.\n" % o_c) -test.must_match('test6' + _exe, "%s\nThis is a .SPP file.\n" % o_c) - -test.pass_test() diff --git a/test/CC.py b/test/CC.py deleted file mode 100644 index e7795d3..0000000 --- a/test/CC.py +++ /dev/null @@ -1,199 +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 string -import sys -import TestSCons - -python = TestSCons.python -_exe = TestSCons._exe - -test = TestSCons.TestSCons() - - - -if sys.platform == 'win32': - - test.write('mylink.py', r""" -import string -import sys -args = sys.argv[1:] -while args: - a = args[0] - if a[0] != '/': - break - args = args[1:] - if string.lower(a[:5]) == '/out:': out = a[5:] -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:8] != '/*link*/': - outfile.write(l) -sys.exit(0) -""") - - test.write('mycc.py', r""" -import sys -args = sys.argv[1:] -inf = None -while args: - a = args[0] - args = args[1:] - if a[0] != '/': - if not inf: - inf = a - continue - if a[:3] == '/Fo': out = a[3:] -infile = open(inf, 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:6] != '/*cc*/': - outfile.write(l) -sys.exit(0) -""") - -else: - - test.write('mylink.py', r""" -import getopt -import sys -opts, args = getopt.getopt(sys.argv[1:], 'o:') -for opt, arg in opts: - if opt == '-o': out = arg -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:8] != '/*link*/': - outfile.write(l) -sys.exit(0) -""") - - test.write('mycc.py', r""" -import getopt -import sys -opts, args = getopt.getopt(sys.argv[1:], 'co:') -for opt, arg in opts: - if opt == '-o': out = arg -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:6] != '/*cc*/': - outfile.write(l) -sys.exit(0) -""") - -test.write('SConstruct', """ -cc = Environment().Dictionary('CC') -env = Environment(LINK = r'%s mylink.py', - LINKFLAGS = [], - CC = r'%s mycc.py', - CXX = cc, - CXXFLAGS = []) -env.Program(target = 'test1', source = 'test1.c') -""" % (python, python)) - -test.write('test1.c', r"""This is a .c file. -/*cc*/ -/*link*/ -""") - -test.run(arguments = '.', stderr = None) - -test.fail_test(test.read('test1' + _exe) != "This is a .c file.\n") - -if os.path.normcase('.c') == os.path.normcase('.C'): - - test.write('SConstruct', """ -cc = Environment().Dictionary('CC') -env = Environment(LINK = r'%s mylink.py', - CC = r'%s mycc.py', - CXX = cc) -env.Program(target = 'test2', source = 'test2.C') -""" % (python, python)) - - test.write('test2.C', r"""This is a .C file. -/*cc*/ -/*link*/ -""") - - test.run(arguments = '.', stderr = None) - - test.fail_test(test.read('test2' + _exe) != "This is a .C file.\n") - - - - -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() -cc = foo.Dictionary('CC') -bar = Environment(CC = r'%s wrapper.py ' + cc) -foo.Program(target = 'foo', source = 'foo.c') -bar.Program(target = 'bar', source = 'bar.c') -""" % python) - -test.write('foo.c', r""" -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("foo.c\n"); - exit (0); -} -""") - -test.write('bar.c', r""" -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("foo.c\n"); - exit (0); -} -""") - - -test.run(arguments = 'foo' + _exe) - -test.fail_test(os.path.exists(test.workpath('wrapper.out'))) - -test.up_to_date(arguments = 'foo' + _exe) - -test.run(arguments = 'bar' + _exe) - -test.fail_test(test.read('wrapper.out') != "wrapper.py\n") - -test.up_to_date(arguments = 'bar' + _exe) - -test.pass_test() diff --git a/test/CC/CC.py b/test/CC/CC.py new file mode 100644 index 0000000..e7795d3 --- /dev/null +++ b/test/CC/CC.py @@ -0,0 +1,199 @@ +#!/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 string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +if sys.platform == 'win32': + + test.write('mylink.py', r""" +import string +import sys +args = sys.argv[1:] +while args: + a = args[0] + if a[0] != '/': + break + args = args[1:] + if string.lower(a[:5]) == '/out:': out = a[5:] +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:8] != '/*link*/': + outfile.write(l) +sys.exit(0) +""") + + test.write('mycc.py', r""" +import sys +args = sys.argv[1:] +inf = None +while args: + a = args[0] + args = args[1:] + if a[0] != '/': + if not inf: + inf = a + continue + if a[:3] == '/Fo': out = a[3:] +infile = open(inf, 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:6] != '/*cc*/': + outfile.write(l) +sys.exit(0) +""") + +else: + + test.write('mylink.py', r""" +import getopt +import sys +opts, args = getopt.getopt(sys.argv[1:], 'o:') +for opt, arg in opts: + if opt == '-o': out = arg +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:8] != '/*link*/': + outfile.write(l) +sys.exit(0) +""") + + test.write('mycc.py', r""" +import getopt +import sys +opts, args = getopt.getopt(sys.argv[1:], 'co:') +for opt, arg in opts: + if opt == '-o': out = arg +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:6] != '/*cc*/': + outfile.write(l) +sys.exit(0) +""") + +test.write('SConstruct', """ +cc = Environment().Dictionary('CC') +env = Environment(LINK = r'%s mylink.py', + LINKFLAGS = [], + CC = r'%s mycc.py', + CXX = cc, + CXXFLAGS = []) +env.Program(target = 'test1', source = 'test1.c') +""" % (python, python)) + +test.write('test1.c', r"""This is a .c file. +/*cc*/ +/*link*/ +""") + +test.run(arguments = '.', stderr = None) + +test.fail_test(test.read('test1' + _exe) != "This is a .c file.\n") + +if os.path.normcase('.c') == os.path.normcase('.C'): + + test.write('SConstruct', """ +cc = Environment().Dictionary('CC') +env = Environment(LINK = r'%s mylink.py', + CC = r'%s mycc.py', + CXX = cc) +env.Program(target = 'test2', source = 'test2.C') +""" % (python, python)) + + test.write('test2.C', r"""This is a .C file. +/*cc*/ +/*link*/ +""") + + test.run(arguments = '.', stderr = None) + + test.fail_test(test.read('test2' + _exe) != "This is a .C file.\n") + + + + +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() +cc = foo.Dictionary('CC') +bar = Environment(CC = r'%s wrapper.py ' + cc) +foo.Program(target = 'foo', source = 'foo.c') +bar.Program(target = 'bar', source = 'bar.c') +""" % python) + +test.write('foo.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("foo.c\n"); + exit (0); +} +""") + +test.write('bar.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("foo.c\n"); + exit (0); +} +""") + + +test.run(arguments = 'foo' + _exe) + +test.fail_test(os.path.exists(test.workpath('wrapper.out'))) + +test.up_to_date(arguments = 'foo' + _exe) + +test.run(arguments = 'bar' + _exe) + +test.fail_test(test.read('wrapper.out') != "wrapper.py\n") + +test.up_to_date(arguments = 'bar' + _exe) + +test.pass_test() diff --git a/test/CC/CCCOM.py b/test/CC/CCCOM.py new file mode 100644 index 0000000..1be89a3 --- /dev/null +++ b/test/CC/CCCOM.py @@ -0,0 +1,81 @@ +#!/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 $CCCOM construction variable. +""" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('mycc.py', r""" +import sys +outfile = open(sys.argv[1], 'wb') +infile = open(sys.argv[2], 'rb') +for l in filter(lambda l: l[:6] != '/*cc*/', infile.readlines()): + outfile.write(l) +sys.exit(0) +""") + +if os.path.normcase('.c') == os.path.normcase('.C'): + alt_c_suffix = '.C' +else: + alt_c_suffix = '.c' + +test.write('SConstruct', """ +env = Environment(CCCOM = r'%(python)s mycc.py $TARGET $SOURCE', + OBJSUFFIX='.obj') +env.Object(target = 'test1', source = 'test1.c') +env.Object(target = 'test2', source = 'test2%(alt_c_suffix)s') +""" % locals()) + +test.write('test1.c', """\ +test1.c +/*cc*/ +""") + +test.write('test2'+alt_c_suffix, """\ +test2.C +/*cc*/ +""") + +test.run() + +test.must_match('test1.obj', "test1.c\n") +test.must_match('test2.obj', "test2.C\n") + + + +test.pass_test() diff --git a/test/CC/CCCOMSTR.py b/test/CC/CCCOMSTR.py new file mode 100644 index 0000000..1dd6a57 --- /dev/null +++ b/test/CC/CCCOMSTR.py @@ -0,0 +1,86 @@ +#!/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 $CCCOMSTR construction variable allows you to configure +the C compilation output. +""" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('mycc.py', r""" +import sys +outfile = open(sys.argv[1], 'wb') +infile = open(sys.argv[2], 'rb') +for l in filter(lambda l: l[:6] != '/*cc*/', infile.readlines()): + outfile.write(l) +sys.exit(0) +""") + +if os.path.normcase('.c') == os.path.normcase('.C'): + alt_c_suffix = '.C' +else: + alt_c_suffix = '.c' + +test.write('SConstruct', """ +env = Environment(CCCOM = r'%(python)s mycc.py $TARGET $SOURCE', + CCCOMSTR = 'Building $TARGET from $SOURCE', + OBJSUFFIX='.obj') +env.Object(target = 'test1', source = 'test1.c') +env.Object(target = 'test2', source = 'test2%(alt_c_suffix)s') +""" % locals()) + +test.write('test1.c', """\ +test1.c +/*cc*/ +""") + +test.write('test2'+alt_c_suffix, """\ +test2.C +/*cc*/ +""") + +test.run(stdout = test.wrap_stdout("""\ +Building test1.obj from test1.c +Building test2.obj from test2%(alt_c_suffix)s +""" % locals())) + +test.must_match('test1.obj', "test1.c\n") +test.must_match('test2.obj', "test2.C\n") + + + +test.pass_test() diff --git a/test/CC/CCFLAGS.py b/test/CC/CCFLAGS.py new file mode 100644 index 0000000..6664010 --- /dev/null +++ b/test/CC/CCFLAGS.py @@ -0,0 +1,94 @@ +#!/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 sys +import TestSCons + +if sys.platform == 'win32': + _obj = '.obj' + fooflags = '/nologo -DFOO' + barflags = '/nologo -DBAR' +else: + _obj = '.o' + fooflags = '-DFOO' + barflags = '-DBAR' + +test = TestSCons.TestSCons() + +test.write('SConstruct', """ +foo = Environment(CCFLAGS = '%s') +bar = Environment(CCFLAGS = '%s') +foo.Object(target = 'foo%s', source = 'prog.c') +bar.Object(target = 'bar%s', source = 'prog.c') +foo.Program(target = 'foo', source = 'foo%s') +bar.Program(target = 'bar', source = 'bar%s') +foo.Program(target = 'prog', source = 'prog.c', + CCFLAGS = '$CCFLAGS -DBAR $BAZ', BAZ = '-DBAZ') +""" % (fooflags, barflags, _obj, _obj, _obj, _obj)) + +test.write('prog.c', r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; +#ifdef FOO + printf("prog.c: FOO\n"); +#endif +#ifdef BAR + printf("prog.c: BAR\n"); +#endif +#ifdef BAZ + printf("prog.c: BAZ\n"); +#endif + exit (0); +} +""") + + +test.run(arguments = '.') + +test.run(program = test.workpath('foo'), stdout = "prog.c: FOO\n") +test.run(program = test.workpath('bar'), stdout = "prog.c: BAR\n") +test.run(program = test.workpath('prog'), stdout = """\ +prog.c: FOO +prog.c: BAR +prog.c: BAZ +""") + +test.write('SConstruct', """ +bar = Environment(CCFLAGS = '%s') +bar.Object(target = 'foo%s', source = 'prog.c') +bar.Object(target = 'bar%s', source = 'prog.c') +bar.Program(target = 'foo', source = 'foo%s') +bar.Program(target = 'bar', source = 'bar%s') +""" % (barflags, _obj, _obj, _obj, _obj)) + +test.run(arguments = '.') + +test.run(program = test.workpath('foo'), stdout = "prog.c: BAR\n") +test.run(program = test.workpath('bar'), stdout = "prog.c: BAR\n") + +test.pass_test() diff --git a/test/CCFLAGS.py b/test/CCFLAGS.py deleted file mode 100644 index 6664010..0000000 --- a/test/CCFLAGS.py +++ /dev/null @@ -1,94 +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 sys -import TestSCons - -if sys.platform == 'win32': - _obj = '.obj' - fooflags = '/nologo -DFOO' - barflags = '/nologo -DBAR' -else: - _obj = '.o' - fooflags = '-DFOO' - barflags = '-DBAR' - -test = TestSCons.TestSCons() - -test.write('SConstruct', """ -foo = Environment(CCFLAGS = '%s') -bar = Environment(CCFLAGS = '%s') -foo.Object(target = 'foo%s', source = 'prog.c') -bar.Object(target = 'bar%s', source = 'prog.c') -foo.Program(target = 'foo', source = 'foo%s') -bar.Program(target = 'bar', source = 'bar%s') -foo.Program(target = 'prog', source = 'prog.c', - CCFLAGS = '$CCFLAGS -DBAR $BAZ', BAZ = '-DBAZ') -""" % (fooflags, barflags, _obj, _obj, _obj, _obj)) - -test.write('prog.c', r""" -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; -#ifdef FOO - printf("prog.c: FOO\n"); -#endif -#ifdef BAR - printf("prog.c: BAR\n"); -#endif -#ifdef BAZ - printf("prog.c: BAZ\n"); -#endif - exit (0); -} -""") - - -test.run(arguments = '.') - -test.run(program = test.workpath('foo'), stdout = "prog.c: FOO\n") -test.run(program = test.workpath('bar'), stdout = "prog.c: BAR\n") -test.run(program = test.workpath('prog'), stdout = """\ -prog.c: FOO -prog.c: BAR -prog.c: BAZ -""") - -test.write('SConstruct', """ -bar = Environment(CCFLAGS = '%s') -bar.Object(target = 'foo%s', source = 'prog.c') -bar.Object(target = 'bar%s', source = 'prog.c') -bar.Program(target = 'foo', source = 'foo%s') -bar.Program(target = 'bar', source = 'bar%s') -""" % (barflags, _obj, _obj, _obj, _obj)) - -test.run(arguments = '.') - -test.run(program = test.workpath('foo'), stdout = "prog.c: BAR\n") -test.run(program = test.workpath('bar'), stdout = "prog.c: BAR\n") - -test.pass_test() diff --git a/test/CXX.py b/test/CXX.py deleted file mode 100644 index 6f9f0ce..0000000 --- a/test/CXX.py +++ /dev/null @@ -1,229 +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 string -import sys -import TestSCons - -python = TestSCons.python -_exe = TestSCons._exe - -test = TestSCons.TestSCons() - - - -if sys.platform == 'win32': - - test.write('mylink.py', r""" -import string -import sys -args = sys.argv[1:] -while args: - a = args[0] - if a[0] != '/': - break - args = args[1:] - if string.lower(a[:5]) == '/out:': out = a[5:] -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:8] != '/*link*/': - outfile.write(l) -sys.exit(0) -""") - - test.write('myc++.py', r""" -import sys -args = sys.argv[1:] -inf = None -while args: - a = args[0] - args = args[1:] - if a[0] != '/': - if not inf: - inf = a - continue - if a[:3] == '/Fo': out = a[3:] -infile = open(inf, 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:7] != '/*c++*/': - outfile.write(l) -sys.exit(0) -""") - -else: - - test.write('mylink.py', r""" -import getopt -import sys -opts, args = getopt.getopt(sys.argv[1:], 'o:') -for opt, arg in opts: - if opt == '-o': out = arg -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:8] != '/*link*/': - outfile.write(l) -sys.exit(0) -""") - - test.write('myc++.py', r""" -import getopt -import sys -opts, args = getopt.getopt(sys.argv[1:], 'co:') -for opt, arg in opts: - if opt == '-o': out = arg -infile = open(args[0], 'rb') -outfile = open(out, 'wb') -for l in infile.readlines(): - if l[:7] != '/*c++*/': - outfile.write(l) -sys.exit(0) -""") - -test.write('SConstruct', """ -env = Environment(LINK = r'%s mylink.py', - LINKFLAGS = [], - CXX = r'%s myc++.py', - CXXFLAGS = []) -env.Program(target = 'test1', source = 'test1.cc') -env.Program(target = 'test2', source = 'test2.cpp') -env.Program(target = 'test3', source = 'test3.cxx') -env.Program(target = 'test4', source = 'test4.c++') -env.Program(target = 'test5', source = 'test5.C++') -""" % (python, python)) - -test.write('test1.cc', r"""This is a .cc file. -/*c++*/ -/*link*/ -""") - -test.write('test2.cpp', r"""This is a .cpp file. -/*c++*/ -/*link*/ -""") - -test.write('test3.cxx', r"""This is a .cxx file. -/*c++*/ -/*link*/ -""") - -test.write('test4.c++', r"""This is a .c++ file. -/*c++*/ -/*link*/ -""") - -test.write('test5.C++', r"""This is a .C++ file. -/*c++*/ -/*link*/ -""") - -test.run(arguments = '.', stderr = None) - -test.must_match('test1' + _exe, "This is a .cc file.\n") - -test.must_match('test2' + _exe, "This is a .cpp file.\n") - -test.must_match('test3' + _exe, "This is a .cxx file.\n") - -test.must_match('test4' + _exe, "This is a .c++ file.\n") - -test.must_match('test5' + _exe, "This is a .C++ file.\n") - -if TestSCons.case_sensitive_suffixes('.c', '.C'): - - test.write('SConstruct', """ -env = Environment(LINK = r'%s mylink.py', - LINKFLAGS = [], - CXX = r'%s myc++.py', - CXXFLAGS = []) -env.Program(target = 'test6', source = 'test6.C') -""" % (python, python)) - - test.write('test6.C', r"""This is a .C file. -/*c++*/ -/*link*/ -""") - - test.run(arguments = '.', stderr = None) - - test.must_match('test6' + _exe, "This is a .C file.\n") - - - - -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() -cxx = foo.Dictionary('CXX') -bar = Environment(CXX = r'%s wrapper.py ' + cxx) -foo.Program(target = 'foo', source = 'foo.cxx') -bar.Program(target = 'bar', source = 'bar.cxx') -""" % python) - -test.write('foo.cxx', r""" -#include -#include -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("foo.cxx\n"); - exit (0); -} -""") - -test.write('bar.cxx', r""" -#include -#include -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("foo.cxx\n"); - exit (0); -} -""") - - -test.run(arguments = 'foo' + _exe) - -test.must_not_exist(test.workpath('wrapper.out')) - -test.run(arguments = 'bar' + _exe) - -test.must_match('wrapper.out', "wrapper.py\n") - -test.pass_test() diff --git a/test/CXX/CXX.py b/test/CXX/CXX.py new file mode 100644 index 0000000..6f9f0ce --- /dev/null +++ b/test/CXX/CXX.py @@ -0,0 +1,229 @@ +#!/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 string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +if sys.platform == 'win32': + + test.write('mylink.py', r""" +import string +import sys +args = sys.argv[1:] +while args: + a = args[0] + if a[0] != '/': + break + args = args[1:] + if string.lower(a[:5]) == '/out:': out = a[5:] +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:8] != '/*link*/': + outfile.write(l) +sys.exit(0) +""") + + test.write('myc++.py', r""" +import sys +args = sys.argv[1:] +inf = None +while args: + a = args[0] + args = args[1:] + if a[0] != '/': + if not inf: + inf = a + continue + if a[:3] == '/Fo': out = a[3:] +infile = open(inf, 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:7] != '/*c++*/': + outfile.write(l) +sys.exit(0) +""") + +else: + + test.write('mylink.py', r""" +import getopt +import sys +opts, args = getopt.getopt(sys.argv[1:], 'o:') +for opt, arg in opts: + if opt == '-o': out = arg +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:8] != '/*link*/': + outfile.write(l) +sys.exit(0) +""") + + test.write('myc++.py', r""" +import getopt +import sys +opts, args = getopt.getopt(sys.argv[1:], 'co:') +for opt, arg in opts: + if opt == '-o': out = arg +infile = open(args[0], 'rb') +outfile = open(out, 'wb') +for l in infile.readlines(): + if l[:7] != '/*c++*/': + outfile.write(l) +sys.exit(0) +""") + +test.write('SConstruct', """ +env = Environment(LINK = r'%s mylink.py', + LINKFLAGS = [], + CXX = r'%s myc++.py', + CXXFLAGS = []) +env.Program(target = 'test1', source = 'test1.cc') +env.Program(target = 'test2', source = 'test2.cpp') +env.Program(target = 'test3', source = 'test3.cxx') +env.Program(target = 'test4', source = 'test4.c++') +env.Program(target = 'test5', source = 'test5.C++') +""" % (python, python)) + +test.write('test1.cc', r"""This is a .cc file. +/*c++*/ +/*link*/ +""") + +test.write('test2.cpp', r"""This is a .cpp file. +/*c++*/ +/*link*/ +""") + +test.write('test3.cxx', r"""This is a .cxx file. +/*c++*/ +/*link*/ +""") + +test.write('test4.c++', r"""This is a .c++ file. +/*c++*/ +/*link*/ +""") + +test.write('test5.C++', r"""This is a .C++ file. +/*c++*/ +/*link*/ +""") + +test.run(arguments = '.', stderr = None) + +test.must_match('test1' + _exe, "This is a .cc file.\n") + +test.must_match('test2' + _exe, "This is a .cpp file.\n") + +test.must_match('test3' + _exe, "This is a .cxx file.\n") + +test.must_match('test4' + _exe, "This is a .c++ file.\n") + +test.must_match('test5' + _exe, "This is a .C++ file.\n") + +if TestSCons.case_sensitive_suffixes('.c', '.C'): + + test.write('SConstruct', """ +env = Environment(LINK = r'%s mylink.py', + LINKFLAGS = [], + CXX = r'%s myc++.py', + CXXFLAGS = []) +env.Program(target = 'test6', source = 'test6.C') +""" % (python, python)) + + test.write('test6.C', r"""This is a .C file. +/*c++*/ +/*link*/ +""") + + test.run(arguments = '.', stderr = None) + + test.must_match('test6' + _exe, "This is a .C file.\n") + + + + +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() +cxx = foo.Dictionary('CXX') +bar = Environment(CXX = r'%s wrapper.py ' + cxx) +foo.Program(target = 'foo', source = 'foo.cxx') +bar.Program(target = 'bar', source = 'bar.cxx') +""" % python) + +test.write('foo.cxx', r""" +#include +#include +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("foo.cxx\n"); + exit (0); +} +""") + +test.write('bar.cxx', r""" +#include +#include +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("foo.cxx\n"); + exit (0); +} +""") + + +test.run(arguments = 'foo' + _exe) + +test.must_not_exist(test.workpath('wrapper.out')) + +test.run(arguments = 'bar' + _exe) + +test.must_match('wrapper.out', "wrapper.py\n") + +test.pass_test() diff --git a/test/CXX/CXXCOM.py b/test/CXX/CXXCOM.py new file mode 100644 index 0000000..4641473 --- /dev/null +++ b/test/CXX/CXXCOM.py @@ -0,0 +1,81 @@ +#!/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 $CXXCOM construction variable. +""" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('mycc.py', r""" +import sys +outfile = open(sys.argv[1], 'wb') +infile = open(sys.argv[2], 'rb') +for l in filter(lambda l: l[:7] != '/*c++*/', infile.readlines()): + outfile.write(l) +sys.exit(0) +""") + +if os.path.normcase('.c') == os.path.normcase('.C'): + alt_cc_suffix = '.CC' +else: + alt_cc_suffix = '.cc' + +test.write('SConstruct', """ +env = Environment(CXXCOM = r'%(python)s mycc.py $TARGET $SOURCE', + OBJSUFFIX='.obj') +env.Object(target = 'test1', source = 'test1.cc') +env.Object(target = 'test2', source = 'test2%(alt_cc_suffix)s') +""" % locals()) + +test.write('test1.cc', """\ +test1.cc +/*c++*/ +""") + +test.write('test2'+alt_cc_suffix, """\ +test2.CC +/*c++*/ +""") + +test.run() + +test.must_match('test1.obj', "test1.cc\n") +test.must_match('test2.obj', "test2.CC\n") + + + +test.pass_test() diff --git a/test/CXX/CXXCOMSTR.py b/test/CXX/CXXCOMSTR.py new file mode 100644 index 0000000..0a2dce6 --- /dev/null +++ b/test/CXX/CXXCOMSTR.py @@ -0,0 +1,86 @@ +#!/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 $CXXCOMSTR construction variable allows you to configure +the C++ compilation output. +""" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('mycc.py', r""" +import sys +outfile = open(sys.argv[1], 'wb') +infile = open(sys.argv[2], 'rb') +for l in filter(lambda l: l[:6] != '/*cc*/', infile.readlines()): + outfile.write(l) +sys.exit(0) +""") + +if os.path.normcase('.c') == os.path.normcase('.C'): + alt_cc_suffix = '.CC' +else: + alt_cc_suffix = '.cc' + +test.write('SConstruct', """ +env = Environment(CXXCOM = r'%(python)s mycc.py $TARGET $SOURCE', + CXXCOMSTR = 'Building $TARGET from $SOURCE', + OBJSUFFIX='.obj') +env.Object(target = 'test1', source = 'test1.cc') +env.Object(target = 'test2', source = 'test2%(alt_cc_suffix)s') +""" % locals()) + +test.write('test1.cc', """\ +test1.cc +/*cc*/ +""") + +test.write('test2'+alt_cc_suffix, """\ +test2.CC +/*cc*/ +""") + +test.run(stdout = test.wrap_stdout("""\ +Building test1.obj from test1.cc +Building test2.obj from test2%(alt_cc_suffix)s +""" % locals())) + +test.must_match('test1.obj', "test1.cc\n") +test.must_match('test2.obj', "test2.CC\n") + + + +test.pass_test() diff --git a/test/CXX/CXXFILESUFFIX.py b/test/CXX/CXXFILESUFFIX.py new file mode 100644 index 0000000..d729076 --- /dev/null +++ b/test/CXX/CXXFILESUFFIX.py @@ -0,0 +1,75 @@ +#!/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 + +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 = ['lex']) +env.CXXFile(target = 'foo', source = 'foo.ll') +env.Copy(CXXFILESUFFIX = '.xyz').CXXFile(target = 'bar', source = 'bar.ll') +""" % python) + +input = r""" +int +main(int argc, char *argv[]) +{ + argv[argc++] = "--"; + printf("LEX\n"); + printf("%s\n"); + exit (0); +} +""" + +test.write('foo.ll', input % 'foo.ll') + +test.write('bar.ll', input % 'bar.ll') + +test.run(arguments = '.') + +test.fail_test(not os.path.exists(test.workpath('foo.cc'))) + +test.fail_test(not os.path.exists(test.workpath('bar.xyz'))) + +test.pass_test() diff --git a/test/CXXFILESUFFIX.py b/test/CXXFILESUFFIX.py deleted file mode 100644 index d729076..0000000 --- a/test/CXXFILESUFFIX.py +++ /dev/null @@ -1,75 +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 - -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 = ['lex']) -env.CXXFile(target = 'foo', source = 'foo.ll') -env.Copy(CXXFILESUFFIX = '.xyz').CXXFile(target = 'bar', source = 'bar.ll') -""" % python) - -input = r""" -int -main(int argc, char *argv[]) -{ - argv[argc++] = "--"; - printf("LEX\n"); - printf("%s\n"); - exit (0); -} -""" - -test.write('foo.ll', input % 'foo.ll') - -test.write('bar.ll', input % 'bar.ll') - -test.run(arguments = '.') - -test.fail_test(not os.path.exists(test.workpath('foo.cc'))) - -test.fail_test(not os.path.exists(test.workpath('bar.xyz'))) - -test.pass_test() -- cgit v0.12