Easier customization of printable strings for , and .
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Mon, 15 Nov 2004 12:43:04 +0000 (12:43 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Mon, 15 Nov 2004 12:43:04 +0000 (12:43 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1162 fdb21ef1-2011-0410-befe-b5e4ea1792b1

17 files changed:
doc/man/scons.1
src/CHANGES.txt
src/engine/SCons/Action.py
src/engine/SCons/ActionTests.py
src/engine/SCons/Defaults.py
test/AS/AS.py [moved from test/AS.py with 100% similarity]
test/AS/ASCOM.py [new file with mode: 0644]
test/AS/ASCOMSTR.py [new file with mode: 0644]
test/AS/ASFLAGS.py [moved from test/ASFLAGS.py with 100% similarity]
test/CC/CC.py [moved from test/CC.py with 100% similarity]
test/CC/CCCOM.py [new file with mode: 0644]
test/CC/CCCOMSTR.py [new file with mode: 0644]
test/CC/CCFLAGS.py [moved from test/CCFLAGS.py with 100% similarity]
test/CXX/CXX.py [moved from test/CXX.py with 100% similarity]
test/CXX/CXXCOM.py [new file with mode: 0644]
test/CXX/CXXCOMSTR.py [new file with mode: 0644]
test/CXX/CXXFILESUFFIX.py [moved from test/CXXFILESUFFIX.py with 100% similarity]

index 59e0d629df72728407e0711d44da9e13b8d84837..b2ccd711cb9c3e3605d2a6ce9efb1165b9fc01a8 100644 (file)
@@ -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.
 
index 4755f18a2a119b978a449efae3f1003e7db6a70c..b84f25afa5a661e29f48bd3fc511ea2e79b224ac 100644 (file)
@@ -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
index a8e6c5b2f3f877069159f42d90f90c4b5f91a035..545bd6181364f0a7673458915e1a80beb6304a93 100644 (file)
@@ -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])
 
index f52496a25e4ef59fc2b5e2db4ebd3a523a7b30af..315b1ac0fd1dfc7e711edec69adb93ded9a71354 100644 (file)
@@ -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'])
index 89244558aa9ceb0d24b14d347c4becd2f22ce52e..05d0ad82e77a71c4cdef24f8b000f1a449338d40 100644 (file)
@@ -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")
similarity index 100%
rename from test/AS.py
rename to test/AS/AS.py
diff --git a/test/AS/ASCOM.py b/test/AS/ASCOM.py
new file mode 100644 (file)
index 0000000..da66bca
--- /dev/null
@@ -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 (file)
index 0000000..c8eed62
--- /dev/null
@@ -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()
similarity index 100%
rename from test/ASFLAGS.py
rename to test/AS/ASFLAGS.py
similarity index 100%
rename from test/CC.py
rename to test/CC/CC.py
diff --git a/test/CC/CCCOM.py b/test/CC/CCCOM.py
new file mode 100644 (file)
index 0000000..1be89a3
--- /dev/null
@@ -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 (file)
index 0000000..1dd6a57
--- /dev/null
@@ -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()
similarity index 100%
rename from test/CCFLAGS.py
rename to test/CC/CCFLAGS.py
similarity index 100%
rename from test/CXX.py
rename to test/CXX/CXX.py
diff --git a/test/CXX/CXXCOM.py b/test/CXX/CXXCOM.py
new file mode 100644 (file)
index 0000000..4641473
--- /dev/null
@@ -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 (file)
index 0000000..0a2dce6
--- /dev/null
@@ -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()