Have Visual Studio echo that we're using SCons to build things, to work around a...
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 20 Aug 2005 04:13:59 +0000 (04:13 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 20 Aug 2005 04:13:59 +0000 (04:13 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1337 fdb21ef1-2011-0410-befe-b5e4ea1792b1

18 files changed:
etc/TestCmd.py
etc/TestSCons.py
src/CHANGES.txt
src/engine/SCons/Node/FS.py
src/engine/SCons/SConsign.py
src/engine/SCons/Tool/msvs.py
test/Case.py
test/Configure.py
test/IDL/midl.py
test/MSVC/msvc.py
test/MSVS/vs-6.0.py [new file with mode: 0644]
test/MSVS/vs-7.0.py [new file with mode: 0644]
test/MSVS/vs-7.1.py [new file with mode: 0644]
test/bad-drive.py
test/mingw.py
test/msvs.py [deleted file]
test/timestamp-fallback.py
test/win32pathmadness.py

index 79ec8dc4d2c2796bc0b0f0682b6647bf74042aad..e4cae74a1a8d1b831eb0e9ab8d83f81d44a6ae11 100644 (file)
@@ -175,8 +175,8 @@ version.
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 
 __author__ = "Steven Knight <knight at baldmt dot com>"
-__revision__ = "TestCmd.py 0.15.D001 2005/08/16 17:14:33 knight"
-__version__ = "0.15"
+__revision__ = "TestCmd.py 0.16.D002 2005/08/19 16:58:31 knight"
+__version__ = "0.16"
 
 import os
 import os.path
@@ -217,9 +217,11 @@ else:
 
 tempfile.template = 'testcmd.'
 
+re_space = re.compile('\s')
+
 if os.name == 'posix':
 
-    def escape_cmd(arg):
+    def escape(arg):
         "escape shell special characters"
         slash = '\\'
         special = '"$'
@@ -228,14 +230,19 @@ if os.name == 'posix':
         for c in special:
             arg = string.replace(arg, c, slash+c)
 
-        return '"' + arg + '"'
+        if re_space.search(arg):
+            arg = '"' + arg + '"'
+        return arg
 
 else:
 
     # Windows does not allow special characters in file names
     # anyway, so no need for an escape function, we will just quote
     # the arg.
-    escape_cmd = lambda x: '"' + x + '"'
+    def escape(arg):
+        if re_space.search(arg):
+            arg = '"' + arg + '"'
+        return arg
 
 _Cleanup = []
 
@@ -633,6 +640,9 @@ class TestCmd:
         """Runs a test of the program or script for the test
         environment.  Standard output and error output are saved for
         future retrieval via the stdout() and stderr() methods.
+
+        The specified program will have the original directory
+        prepending unless it is enclosed in a [list].
         """
         if chdir:
             oldcwd = os.getcwd()
@@ -642,26 +652,28 @@ class TestCmd:
                 sys.stderr.write("chdir(" + chdir + ")\n")
             os.chdir(chdir)
         if program:
-            if not os.path.isabs(program):
+            if type(program) == type('') and not os.path.isabs(program):
                 program = os.path.join(self._cwd, program)
         else:
             program = self.program
             if not interpreter:
                 interpreter = self.interpreter
-        cmd = [program]
+        if type(program) != type([]):
+            program = [program]
+        cmd = program
         if interpreter:
             cmd = [interpreter] + cmd
         if arguments:
             if type(arguments) == type(''):
                 arguments = string.split(arguments)
             cmd.extend(arguments)
-        cmd_string = string.join(cmd, ' ')
+        cmd_string = string.join(map(escape, cmd), ' ')
         if self.verbose:
             sys.stderr.write(cmd_string + "\n")
         try:
             p = popen2.Popen3(cmd, 1)
         except AttributeError:
-            (tochild, fromchild, childerr) = os.popen3(cmd_string)
+            (tochild, fromchild, childerr) = os.popen3(' ' + cmd_string)
             if stdin:
                 if is_List(stdin):
                     for line in stdin:
index 7fd76d2b5e510342660c0b9a7931fc3551870eda..520bbfd61d46a5181e271211db8930af8f5ad985 100644 (file)
@@ -12,7 +12,7 @@ from those classes, as well as any overridden or additional methods or
 attributes defined in this subclass.
 """
 
-# Copyright 2001, 2002, 2003 Steven Knight
+# __COPYRIGHT__
 
 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
@@ -424,6 +424,57 @@ Export("env dup")
 SConscript( sconscript )
 """ % (self.QT, self.QT_LIB, self.QT_MOC, self.QT_UIC))
 
+    def msvs_versions(self):
+        if not hasattr(self, '_msvs_versions'):
+
+            # Determine the SCons version and the versions of the MSVS
+            # environments installed on the test machine.
+            #
+            # We do this by executing SCons with an SConstruct file
+            # (piped on stdin) that spits out Python assignments that
+            # we can just exec().  We construct the SCons.__"version"__
+            # string in the input here so that the SCons build itself
+            # doesn't fill it in when packaging SCons.
+            input = """\
+import SCons
+print "self._scons_version =", repr(SCons.__%s__)
+env = Environment();
+print "self._msvs_versions =", str(env['MSVS']['VERSIONS'])
+""" % 'version'
+        
+            self.run(arguments = '-n -q -Q -f -', stdin = input)
+            exec(self.stdout())
+
+        return self._msvs_versions
+
+    def vcproj_sys_path(self, fname):
+        """
+        """
+        orig = 'sys.path = [ join(sys'
+
+        enginepath = repr(os.path.join(self._cwd, '..', 'engine'))
+        replace = 'sys.path = [ %s, join(sys' % enginepath
+
+        contents = self.read(fname)
+        contents = string.replace(contents, orig, replace)
+        self.write(fname, contents)
+
+    def msvs_substitute(self, input, msvs_ver, python=sys.executable):
+        if not hasattr(self, '_msvs_versions'):
+            self.msvs_versions()
+
+        if msvs_ver in ['7.1']:
+            python = '&quot;' + python + '&quot;'
+
+        exec_script_main = "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-%s'), join(sys.prefix, 'scons-%s'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons') ] + sys.path; import SCons.Script; SCons.Script.main()" % (self._scons_version, self._scons_version)
+        exec_script_main_xml = string.replace(exec_script_main, "'", "&apos;")
+
+        result = string.replace(input, r'<WORKPATH>', self.workpath())
+        result = string.replace(result, r'<PYTHON>', python)
+        result = string.replace(result, r'<SCONS_SCRIPT_MAIN>', exec_script_main)
+        result = string.replace(result, r'<SCONS_SCRIPT_MAIN_XML>', exec_script_main_xml)
+        return result
+
 # In some environments, $AR will generate a warning message to stderr
 # if the library doesn't previously exist and is being created.  One
 # way to fix this is to tell AR to be quiet (sometimes the 'c' flag),
index b95268d8b66698eabb3d6d639a51a3ff88681e15..b62fbef11ae40e2d3dde11a5a4d6281ab1f18f1f 100644 (file)
@@ -334,6 +334,12 @@ RELEASE 0.97 - XXX
   - Fix a bad use of Copy() in an example in the man page, and a
     bad regular expression example in the man page and User's Guide.
 
+  From Shannon Mann:
+
+  - Have the Visual Studio project file(s) echo "Starting SCons" before
+    executing SCons, mainly to work around a quote-stripping bug in
+    (some versions of?) the Windows cmd command executor.
+
   From Michael McCracken:
 
   - Add a new "applelink" tool to handle the things like Frameworks and
index d073d539e750e44e97b60fe20ce20bfb81c4dd32..c7905b5bcb6eb9ae49b24bb71573967b87571cdb 100644 (file)
@@ -902,13 +902,14 @@ class FS(LocalFS):
             path_orig = [ path_first, ] + path_orig
             path_norm = [ _my_normcase(path_first), ] + path_norm
         else:
+            drive = _my_normcase(drive)
             # Absolute path
             try:
                 directory = self.Root[drive]
             except KeyError:
                 if not create:
                     raise SCons.Errors.UserError
-                directory = RootDir(_my_normcase(drive), self)
+                directory = RootDir(drive, self)
                 self.Root[drive] = directory
 
         if not path_orig:
index 10bb98dc245eaf5ca897b1714aeb0fc036b489f4..d99df4e407f192c8e016f08d925d70c73b9b85d0 100644 (file)
@@ -95,11 +95,7 @@ def Reset():
     sig_files = []
     DB_sync_list = []
 
-if os.sep == '/':
-    norm_entry = lambda s: s
-else:
-    def norm_entry(str):
-        return string.replace(str, os.sep, '/')
+normcase = os.path.normcase
 
 def write():
     global sig_files
@@ -163,7 +159,7 @@ class DB(Base):
         # Read using the path relative to the top of the Repository
         # (self.dir.tpath) from which we're fetching the signature
         # information.
-        path = norm_entry(dir.tpath)
+        path = normcase(dir.tpath)
         try:
             rawentries = db[path]
         except KeyError:
@@ -202,7 +198,7 @@ class DB(Base):
         # directory (self.dir.path), not relative to the top of
         # the Repository; we only write to our own .sconsign file,
         # not to .sconsign files in Repositories.
-        path = norm_entry(self.dir.path)
+        path = normcase(self.dir.path)
         for key, entry in self.entries.items():
             entry.convert_to_sconsign()
         db[path] = cPickle.dumps(self.entries, 1)
index 90b756cdf936f617793d56d70af119e7834169f9..7870695ffc3d3dfba01926fb04ef063541ad0925 100644 (file)
@@ -256,9 +256,8 @@ class _GenerateV6DSP(_DSPGenerator):
                 self.file.write('# PROP %sOutput_Dir "%s"\n'
                                 '# PROP %sIntermediate_Dir "%s"\n' % (base,outdir,base,outdir))
                 (d,c) = os.path.split(str(self.conspath))
-                cmd = '"%s" -c "%s" -C %s -f %s %s' % (python_executable,
-                                                       exec_script_main,
-                                                       d, c, buildtarget)
+                cmd = 'echo Starting SCons && "%s" -c "%s" -C %s -f %s %s'
+                cmd = cmd % (python_executable, exec_script_main, d, c, buildtarget)
                 self.file.write('# PROP %sCmd_Line "%s"\n' 
                                 '# PROP %sRebuild_Opt "-c && %s"\n'
                                 '# PROP %sTarget_File "%s"\n'
@@ -414,11 +413,11 @@ class _GenerateV7DSP(_DSPGenerator):
             buildtarget = self.configs[kind].buildtarget
 
             (d,c) = os.path.split(str(self.conspath))
-            cmd = '&quot;%s&quot; -c &quot;%s&quot; -C %s -f %s %s' % (python_executable,
+            cmd = 'echo Starting SCons &amp;&amp; &quot;%s&quot; -c &quot;%s&quot; -C %s -f %s %s' % (python_executable,
                                                    exec_script_main_xml,
                                                    d, c, buildtarget)
 
-            cleancmd = '&quot;%s&quot; -c &quot;%s&quot; -C %s -f %s -c %s' % (python_executable,
+            cleancmd = 'echo Starting SCons &amp;&amp; &quot;%s&quot; -c &quot;%s&quot; -C %s -f %s -c %s' % (python_executable,
                                                          exec_script_main_xml,
                                                          d, c, buildtarget)
 
index b6f2a93d68738a8235154937335141894b814fc7..dd782ab063471185898c71edbd54dcd991b875c0 100644 (file)
@@ -64,18 +64,18 @@ void bar() {
 """)
 
 if sys.platform in ['cygwin', 'win32']:
-    print "Using case-insensitive filesystem, testing for failure"
+    sys.stdout.write("Using case-insensitive filesystem, testing for failure\n")
+    sys.stdout.flush()
 
     test.run(stderr = None, status = None)
     test.fail_test(string.split(test.stderr(), '\n')[0] ==
                    "scons: *** Multiple ways to build the same target were specified for: foo.o")
 
-    test.pass_test()
-    
 else:
-    print "Not using case-insensitive filesystem, testing for success"
+    sys.stdout.write("Not using case-insensitive filesystem, testing for success\n")
+    sys.stdout.flush()
 
     test.run()
     test.run(program = test.workpath('main' + _exe), stdout = "foo\nbar\n")
 
-    test.pass_test()
+test.pass_test()
index 83155bbdcdc1a06713319aeccd460bb0efd6b3f2..2512907bd6b1d8ff3e7bd8e8561b81072f088057 100644 (file)
@@ -916,9 +916,6 @@ scons: Configure: creating config.h
         print test.stdout()
         print "---------------------------------------------------------"
         test.fail_test()
-    
-
-    test.pass_test()
 
 finally:
     pass
@@ -927,3 +924,6 @@ finally:
     #print test.read( test.workpath(work_dir, 'config.log'))
     #print "-------------build/config.log------------"
     #print test.read( test.workpath('build/config.log' ))
+
+
+test.pass_test()
index a41ac0136b61b761db9b408ce91b45b5dda857a6..1de9640bd9682eb6188898fbb9606af3a7a09805 100644 (file)
@@ -34,7 +34,8 @@ import time
 test = TestSCons.TestSCons(match = TestCmd.match_re)
 
 if sys.platform != 'win32':
-    test.pass_test()
+    msg = "Skipping test on non-Windows platform '%s'\n" % sys.platform
+    test.skip_test(msg)
 
 #####
 # Test the basics
index c3a9fdccc968d1693d340aa58499ca14708bdf6d..dd0f5ca0990178b51e6e92d4f02fdccea3aea8af 100644 (file)
@@ -34,7 +34,8 @@ import time
 test = TestSCons.TestSCons(match = TestCmd.match_re)
 
 if sys.platform != 'win32':
-    test.pass_test()
+    msg = "Skipping Visual C/C++ test on non-Windows platform '%s'\n" % sys.platform
+    test.skip_test(msg)
 
 #####
 # Test the basics
diff --git a/test/MSVS/vs-6.0.py b/test/MSVS/vs-6.0.py
new file mode 100644 (file)
index 0000000..b993aad
--- /dev/null
@@ -0,0 +1,285 @@
+#!/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 TestCmd
+import TestSCons
+
+test = TestSCons.TestSCons(match = TestCmd.match_re)
+
+if sys.platform != 'win32':
+    msg = "Skipping Visual Studio test on non-Windows platform '%s'\n" % sys.platform
+    test.skip_test(msg)
+
+if not '6.0' in test.msvs_versions():
+    msg = "Visual Studio 6 not installed; skipping test.\n"
+    test.skip_test(msg)
+
+def diff_section(expect, actual):
+    i = 0
+    for x, y in zip(expect, actual):
+        if x != y:
+            return "Actual did not match expect at char %d:\n" \
+                   "    Expect:  %s\n" \
+                   "    Actual:  %s\n" \
+                   % (i, repr(expect[i-20:i+40]), repr(actual[i-20:i+40]))
+        i = i + 1
+    return "Actual matched the expected output???"
+
+expected_dspfile = '''\
+# Microsoft Developer Studio Project File - Name="Test" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) External Target" 0x0106
+
+CFG=Test - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "Test.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "Test.mak" CFG="Test - Win32 Release"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "Test - Win32 Release" (based on "Win32 (x86) External Target")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+
+!IF  "$(CFG)" == "Test - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "<WORKPATH>"
+# PROP BASE Intermediate_Dir "<WORKPATH>"
+# PROP BASE Cmd_Line "echo Starting SCons && "<PYTHON>" -c "<SCONS_SCRIPT_MAIN>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
+# PROP BASE Rebuild_Opt "-c && echo Starting SCons && "<PYTHON>" -c "<SCONS_SCRIPT_MAIN>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
+# PROP BASE Target_File "<WORKPATH>\Test.exe"
+# PROP BASE Bsc_Name ""
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "<WORKPATH>"
+# PROP Intermediate_Dir "<WORKPATH>"
+# PROP Cmd_Line "echo Starting SCons && "<PYTHON>" -c "<SCONS_SCRIPT_MAIN>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
+# PROP Rebuild_Opt "-c && echo Starting SCons && "<PYTHON>" -c "<SCONS_SCRIPT_MAIN>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
+# PROP Target_File "<WORKPATH>\Test.exe"
+# PROP Bsc_Name ""
+# PROP Target_Dir ""
+
+!ENDIF
+
+# Begin Target
+
+# Name "Test - Win32 Release"
+
+!IF  "$(CFG)" == "Test - Win32 Release"
+
+!ENDIF 
+
+# Begin Group " Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;l;y;def;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="test.c"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="sdk.h"
+# End Source File
+# End Group
+# Begin Group "Local Headers"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="test.h"
+# End Source File
+# End Group
+# Begin Group "Other Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE="readme.txt"
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE="test.rc"
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE="<WORKPATH>\SConstruct"
+# End Source File
+# End Target
+# End Project
+'''
+
+expected_dswfile = '''\
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "Test"="<WORKPATH>\Test.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+'''
+
+
+
+test.write('SConstruct','''
+env=Environment(MSVS_VERSION = '6.0')
+
+testsrc = ['test.c']
+testincs = ['sdk.h']
+testlocalincs = ['test.h']
+testresources = ['test.rc']
+testmisc = ['readme.txt']
+
+env.MSVSProject(target = 'Test.dsp',
+                srcs = testsrc,
+                incs = testincs,
+                localincs = testlocalincs,
+                resources = testresources,
+                misc = testmisc,
+                buildtarget = 'Test.exe',
+                variant = 'Release')
+''')
+
+test.run(arguments="Test.dsp")
+
+test.must_exist(test.workpath('Test.dsp'))
+dsp = test.read('Test.dsp', 'r')
+expect = test.msvs_substitute(expected_dspfile, '6.0')
+# don't compare the pickled data
+assert dsp[:len(expect)] == expect, diff_section(expect, dsp)
+
+test.must_exist(test.workpath('Test.dsw'))
+dsw = test.read('Test.dsw', 'r')
+expect = test.msvs_substitute(expected_dswfile, '6.0')
+assert dsw == expect, diff_section(expect, dsw)
+
+test.run(arguments='-c .')
+
+test.must_not_exist(test.workpath('Test.dsp'))
+test.must_not_exist(test.workpath('Test.dsw'))
+
+test.run(arguments='Test.dsp')
+
+test.must_exist(test.workpath('Test.dsp'))
+test.must_exist(test.workpath('Test.dsw'))
+
+test.run(arguments='-c Test.dsw')
+
+test.must_not_exist(test.workpath('Test.dsp'))
+test.must_not_exist(test.workpath('Test.dsw'))
+
+
+
+test.write('SConstruct','''
+env=Environment(MSVS_VERSION = '6.0')
+
+env.MSVSProject(target = 'Test.dsp',
+                srcs = ['test.c'],
+                buildtarget = 'Test.exe',
+                variant = 'Release')
+
+env.Program('test.c')
+''')
+
+test.write('test.c', r"""
+int
+main(int argc, char *argv)
+{
+    printf("test.c\n");
+    exit (0);
+}
+""")
+
+# Let SCons figure out the Visual Studio environment variables for us and
+# print out a statement that we can exec to suck them into our external
+# environment so we can execute msdev and really try to build something.
+
+test.run(arguments = '-n -q -Q -f -', stdin = """\
+env = Environment(tools = ['msvc'])
+print "os.environ.update(%s)" % repr(env['ENV'])
+""")
+
+exec(test.stdout())
+
+test.run(arguments='Test.dsp')
+
+test.run(program=['msdev'],
+         arguments=['Test.dsp', '/MAKE', 'test - Win32 Release'])
+
+test.run(program=test.workpath('test'), stdout = "test.c\n")
+
+
+
+test.pass_test()
diff --git a/test/MSVS/vs-7.0.py b/test/MSVS/vs-7.0.py
new file mode 100644 (file)
index 0000000..bbc7585
--- /dev/null
@@ -0,0 +1,259 @@
+#!/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 sys
+
+import TestCmd
+import TestSCons
+
+test = TestSCons.TestSCons(match = TestCmd.match_re)
+
+if sys.platform != 'win32':
+    msg = "Skipping Visual Studio test on non-Windows platform '%s'\n" % sys.platform
+    test.skip_test(msg)
+
+if not '7.0' in test.msvs_versions():
+    msg = "Visual Studio 7.0 not installed; skipping test.\n"
+    test.skip_test(msg)
+
+def diff_section(expect, actual):
+    i = 0
+    for x, y in zip(expect, actual):
+        if x != y:
+            return "Actual did not match expect at char %d:\n" \
+                   "    Expect:  %s\n" \
+                   "    Actual:  %s\n" \
+                   % (i, repr(expect[i-20:i+40]), repr(actual[i-20:i+40]))
+        i = i + 1
+    return "Actual matched the expected output???"
+
+expected_slnfile = """\
+Microsoft Visual Studio Solution File, Format Version 7.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test", "Test.vcproj", "{SLNGUID}"
+EndProject
+Global
+       GlobalSection(SolutionConfiguration) = preSolution
+               ConfigName.0 = Release
+       EndGlobalSection
+       GlobalSection(ProjectDependencies) = postSolution
+       EndGlobalSection
+       GlobalSection(ProjectConfiguration) = postSolution
+               {SLNGUID}.Release.ActiveCfg = Release|Win32
+               {SLNGUID}.Release.Build.0 = Release|Win32
+       EndGlobalSection
+       GlobalSection(ExtensibilityGlobals) = postSolution
+       EndGlobalSection
+       GlobalSection(ExtensibilityAddIns) = postSolution
+       EndGlobalSection
+EndGlobal
+"""
+
+expected_vcprojfile = """\
+<?xml version="1.0" encoding = "Windows-1252"?>
+<VisualStudioProject
+       ProjectType="Visual C++"
+       Version="7.00"
+       Name="Test"
+       SccProjectName=""
+       SccLocalPath=""
+       Keyword="MakeFileProj">
+       <Platforms>
+               <Platform
+                       Name="Win32"/>
+       </Platforms>
+       <Configurations>
+               <Configuration
+                       Name="Release|Win32"
+                       OutputDirectory="<WORKPATH>"
+                       IntermediateDirectory="<WORKPATH>"
+                       ConfigurationType="0"
+                       UseOfMFC="0"
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE">
+                       <Tool
+                               Name="VCNMakeTool"
+                               BuildCommandLine="echo Starting SCons &amp;&amp; <PYTHON> -c "<SCONS_SCRIPT_MAIN_XML>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
+                               CleanCommandLine="echo Starting SCons &amp;&amp; <PYTHON> -c "<SCONS_SCRIPT_MAIN_XML>" -C <WORKPATH> -f SConstruct -c <WORKPATH>\Test.exe"
+                               RebuildCommandLine="echo Starting SCons &amp;&amp; <PYTHON> -c "<SCONS_SCRIPT_MAIN_XML>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
+                               Output="<WORKPATH>\Test.exe"/>
+               </Configuration>
+       </Configurations>
+       <Files>
+               <Filter
+                       Name=" Source Files"
+                       Filter="cpp;c;cxx;l;y;def;odl;idl;hpj;bat">
+                       <File
+                               RelativePath="test.cpp">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Header Files"
+                       Filter="h;hpp;hxx;hm;inl">
+                       <File
+                               RelativePath="sdk.h">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Local Headers"
+                       Filter="h;hpp;hxx;hm;inl">
+                       <File
+                               RelativePath="test.h">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Other Files"
+                       Filter="">
+                       <File
+                               RelativePath="readme.txt">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Resource Files"
+                       Filter="r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe">
+                       <File
+                               RelativePath="test.rc">
+                       </File>
+               </Filter>
+               <File
+                       RelativePath="<WORKPATH>\SConstruct">
+               </File>
+       </Files>
+       <Globals>
+       </Globals>
+</VisualStudioProject>
+"""
+
+test.write('SConstruct', """\
+env=Environment(MSVS_VERSION = '7.0')
+
+testsrc = ['test.cpp']
+testincs = ['sdk.h']
+testlocalincs = ['test.h']
+testresources = ['test.rc']
+testmisc = ['readme.txt']
+
+env.MSVSProject(target = 'Test.vcproj',
+                slnguid = '{SLNGUID}',
+                srcs = testsrc,
+                incs = testincs,
+                localincs = testlocalincs,
+                resources = testresources,
+                misc = testmisc,
+                buildtarget = 'Test.exe',
+                variant = 'Release')
+""")
+
+test.run(arguments="Test.vcproj")
+
+test.must_exist(test.workpath('Test.vcproj'))
+vcproj = test.read('Test.vcproj', 'r')
+expect = test.msvs_substitute(expected_vcprojfile, '7.0')
+# don't compare the pickled data
+assert vcproj[:len(expect)] == expect, diff_section(expect, vcproj)
+
+test.must_exist(test.workpath('Test.sln'))
+sln = test.read('Test.sln', 'r')
+expect = test.msvs_substitute(expected_slnfile, '7.0')
+# don't compare the pickled data
+assert sln[:len(expect)] == expect, diff_section(expect, sln)
+
+test.run(arguments='-c .')
+
+test.must_not_exist(test.workpath('Test.vcproj'))
+test.must_not_exist(test.workpath('Test.sln'))
+
+test.run(arguments='Test.vcproj')
+
+test.must_exist(test.workpath('Test.vcproj'))
+test.must_exist(test.workpath('Test.sln'))
+
+test.run(arguments='-c Test.sln')
+
+test.must_not_exist(test.workpath('Test.vcproj'))
+test.must_not_exist(test.workpath('Test.sln'))
+
+
+
+# Test that running SCons with $PYTHON_ROOT in the environment
+# changes the .vcproj output as expected.
+os.environ['PYTHON_ROOT'] = 'xyzzy'
+
+test.run(arguments='Test.vcproj')
+
+python = os.path.join('$(PYTHON_ROOT)', os.path.split(sys.executable)[1])
+
+test.must_exist(test.workpath('Test.vcproj'))
+vcproj = test.read('Test.vcproj', 'r')
+expect = test.msvs_substitute(expected_vcprojfile, '7.0', python=python)
+# don't compare the pickled data
+assert vcproj[:len(expect)] == expect, diff_section(expect, vcproj)
+
+os.environ['PYTHON_ROOT'] = ''
+
+
+
+test.write('SConstruct', """\
+env=Environment(MSVS_VERSION = '7.0')
+
+env.MSVSProject(target = 'Test.vcproj',
+                srcs = ['test.c'],
+                buildtarget = 'test.exe',
+                variant = 'Release')
+
+env.Program('test.c')
+""")
+
+test.write('test.c', r"""
+int
+main(int argc, char *argv)
+{
+    printf("test.c\n");
+    exit (0);
+}
+""")
+
+# Let SCons figure out the Visual Studio environment variables for us and
+# print out a statement that we can exec to suck them into our external
+# environment so we can execute devenv and really try to build something.
+
+test.run(arguments = '-n -q -Q -f -', stdin = """\
+env = Environment(tools = ['msvc'])
+print "os.environ.update(%s)" % repr(env['ENV'])
+""")
+
+exec(test.stdout())
+
+test.run(arguments='Test.vcproj')
+
+test.run(program=['devenv'],
+         arguments=['Test.sln', '/build', 'Release'])
+
+test.run(program=test.workpath('test'), stdout = "test.c\n")
+
+
+
+test.pass_test()
diff --git a/test/MSVS/vs-7.1.py b/test/MSVS/vs-7.1.py
new file mode 100644 (file)
index 0000000..894ec01
--- /dev/null
@@ -0,0 +1,270 @@
+#!/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 TestCmd
+import TestSCons
+
+test = TestSCons.TestSCons(match = TestCmd.match_re)
+
+if sys.platform != 'win32':
+    msg = "Skipping Visual Studio test on non-Windows platform '%s'\n" % sys.platform
+    test.skip_test(msg)
+
+if not '7.1' in test.msvs_versions():
+    msg = "Visual Studio 7.1 not installed; skipping test.\n"
+    test.skip_test(msg)
+
+def diff_section(expect, actual):
+    i = 0
+    for x, y in zip(expect, actual):
+        if x != y:
+            return "Actual did not match expect at char %d:\n" \
+                   "    Expect:  %s\n" \
+                   "    Actual:  %s\n" \
+                   % (i, repr(expect[i-20:i+40]), repr(actual[i-20:i+40]))
+        i = i + 1
+    return "Actual matched the expected output???"
+
+expected_slnfile = """\
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test", "Test.vcproj", "{SLNGUID}"
+       ProjectSection(ProjectDependencies) = postProject
+       EndProjectSection
+EndProject
+Global
+       GlobalSection(SolutionConfiguration) = preSolution
+               ConfigName.0 = Release
+       EndGlobalSection
+       GlobalSection(ProjectConfiguration) = postSolution
+               {SLNGUID}.Release.ActiveCfg = Release|Win32
+               {SLNGUID}.Release.Build.0 = Release|Win32
+       EndGlobalSection
+       GlobalSection(ExtensibilityGlobals) = postSolution
+       EndGlobalSection
+       GlobalSection(ExtensibilityAddIns) = postSolution
+       EndGlobalSection
+EndGlobal
+"""
+
+expected_vcprojfile = """\
+<?xml version="1.0" encoding = "Windows-1252"?>
+<VisualStudioProject
+       ProjectType="Visual C++"
+       Version="7.10"
+       Name="Test"
+       SccProjectName=""
+       SccLocalPath=""
+       Keyword="MakeFileProj">
+       <Platforms>
+               <Platform
+                       Name="Win32"/>
+       </Platforms>
+       <Configurations>
+               <Configuration
+                       Name="Release|Win32"
+                       OutputDirectory="<WORKPATH>"
+                       IntermediateDirectory="<WORKPATH>"
+                       ConfigurationType="0"
+                       UseOfMFC="0"
+                       ATLMinimizesCRunTimeLibraryUsage="FALSE">
+                       <Tool
+                               Name="VCNMakeTool"
+                               BuildCommandLine="echo Starting SCons &amp;&amp; <PYTHON> -c &quot;<SCONS_SCRIPT_MAIN_XML>&quot; -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
+                               CleanCommandLine="echo Starting SCons &amp;&amp; <PYTHON> -c &quot;<SCONS_SCRIPT_MAIN_XML>&quot; -C <WORKPATH> -f SConstruct -c <WORKPATH>\Test.exe"
+                               RebuildCommandLine="echo Starting SCons &amp;&amp; <PYTHON> -c &quot;<SCONS_SCRIPT_MAIN_XML>&quot; -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
+                               Output="<WORKPATH>\Test.exe"/>
+               </Configuration>
+       </Configurations>
+       <References>
+       </References>
+       <Files>
+               <Filter
+                       Name=" Source Files"
+                       Filter="cpp;c;cxx;l;y;def;odl;idl;hpj;bat">
+                       <File
+                               RelativePath="test.cpp">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Header Files"
+                       Filter="h;hpp;hxx;hm;inl">
+                       <File
+                               RelativePath="sdk.h">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Local Headers"
+                       Filter="h;hpp;hxx;hm;inl">
+                       <File
+                               RelativePath="test.h">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Other Files"
+                       Filter="">
+                       <File
+                               RelativePath="readme.txt">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Resource Files"
+                       Filter="r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe">
+                       <File
+                               RelativePath="test.rc">
+                       </File>
+               </Filter>
+               <File
+                       RelativePath="<WORKPATH>\SConstruct">
+               </File>
+       </Files>
+       <Globals>
+       </Globals>
+</VisualStudioProject>
+"""
+
+test.write('SConstruct', """\
+env=Environment(MSVS_VERSION = '7.1')
+
+testsrc = ['test.cpp']
+testincs = ['sdk.h']
+testlocalincs = ['test.h']
+testresources = ['test.rc']
+testmisc = ['readme.txt']
+
+env.MSVSProject(target = 'Test.vcproj',
+                slnguid = '{SLNGUID}',
+                srcs = testsrc,
+                incs = testincs,
+                localincs = testlocalincs,
+                resources = testresources,
+                misc = testmisc,
+                buildtarget = 'Test.exe',
+                variant = 'Release')
+""")
+
+test.run(arguments="Test.vcproj")
+
+test.must_exist(test.workpath('Test.vcproj'))
+vcproj = test.read('Test.vcproj', 'r')
+expect = test.msvs_substitute(expected_vcprojfile, '7.1')
+# don't compare the pickled data
+assert vcproj[:len(expect)] == expect, diff_section(expect, vcproj)
+    
+
+test.must_exist(test.workpath('Test.sln'))
+sln = test.read('Test.sln', 'r')
+expect = test.msvs_substitute(expected_slnfile, '7.1')
+# don't compare the pickled data
+assert sln[:len(expect)] == expect, diff_section(expect, sln)
+
+test.run(arguments='-c .')
+
+test.must_not_exist(test.workpath('Test.vcproj'))
+test.must_not_exist(test.workpath('Test.sln'))
+
+test.run(arguments='Test.vcproj')
+
+test.must_exist(test.workpath('Test.vcproj'))
+test.must_exist(test.workpath('Test.sln'))
+
+test.run(arguments='-c Test.sln')
+
+test.must_not_exist(test.workpath('Test.vcproj'))
+test.must_not_exist(test.workpath('Test.sln'))
+
+
+
+
+# Test that running SCons with $PYTHON_ROOT in the environment
+# changes the .vcproj output as expected.
+os.environ['PYTHON_ROOT'] = 'xyzzy'
+
+test.run(arguments='Test.vcproj')
+
+python = os.path.join('$(PYTHON_ROOT)', os.path.split(sys.executable)[1])
+
+test.must_exist(test.workpath('Test.vcproj'))
+vcproj = test.read('Test.vcproj', 'r')
+expect = test.msvs_substitute(expected_vcprojfile, '7.1', python=python)
+# don't compare the pickled data
+assert vcproj[:len(expect)] == expect, diff_section(expect, vcproj)
+
+os.environ['PYTHON_ROOT'] = ''
+
+
+
+test.write('SConstruct', """\
+env=Environment(MSVS_VERSION = '7.1')
+
+env.MSVSProject(target = 'foo.vcproj',
+                srcs = ['foo.c'],
+                buildtarget = 'foo.exe',
+                variant = 'Release')
+
+t = env.Program('foo.c')
+print "t =", t[0]
+print "t =", t[0].abspath
+import sys
+print sys.argv
+""")
+
+test.write('foo.c', r"""
+int
+main(int argc, char *argv)
+{
+    printf("test.c\n");
+    exit (0);
+}
+""")
+
+# Let SCons figure out the Visual Studio environment variables for us and
+# print out a statement that we can exec to suck them into our external
+# environment so we can execute devenv and really try to build something.
+
+test.run(arguments = '-n -q -Q -f -', stdin = """\
+env = Environment(tools = ['msvc'])
+print "os.environ.update(%s)" % repr(env['ENV'])
+""")
+
+exec(test.stdout())
+
+test.run(arguments='foo.vcproj')
+
+test.vcproj_sys_path('foo.vcproj')
+
+test.run(program=['devenv'],
+         arguments=['foo.sln', '/build', 'Release'])
+
+test.run(program=test.workpath('foo'), stdout = "test.c\n")
+
+
+
+test.pass_test()
index 1b733a5dcb2239e96a8d3fbd7d3eb11ca6945ac8..35b3b38436b603461fcd9e62f3c511bbd825360c 100644 (file)
@@ -40,7 +40,8 @@ import TestSCons
 test = TestSCons.TestSCons()
 
 if sys.platform != 'win32':
-    test.pass_test()
+    msg = "Skipping drive-letter test on non-Windows platform '%s'\n" % sys.platform
+    test.skip_test(msg)
 
 bad_drive = None
 for i in range(len(string.uppercase)-1, -1, -1):
index 6db5cc162f0b7221a129b50539503ab9c1ccce4c..d2039b5139156c00034613fd640da0d55a9ed88f 100644 (file)
@@ -40,7 +40,8 @@ test = TestSCons.TestSCons(match = TestCmd.match_re_dotall)
 
 # MinGW is win32 only:
 if sys.platform != 'win32':
-    test.pass_test()
+    msg = "Skipping mingw test on non-Windows platform '%s'\n" % sys.platform
+    test.skip_test(msg)
 
 # This test requires MingW to be installed:
 test.write('SConstruct',"""
diff --git a/test/msvs.py b/test/msvs.py
deleted file mode 100644 (file)
index 9dfd6f7..0000000
+++ /dev/null
@@ -1,422 +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 re
-import string
-import sys
-import time
-
-import TestCmd
-import TestSCons
-
-expected_dspfile = '''\
-# Microsoft Developer Studio Project File - Name="Test" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) External Target" 0x0106
-
-CFG=Test - Win32 Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "Test.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "Test.mak" CFG="Test - Win32 Release"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "Test - Win32 Release" (based on "Win32 (x86) External Target")
-!MESSAGE 
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-
-!IF  "$(CFG)" == "Test - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "<WORKPATH>"
-# PROP BASE Intermediate_Dir "<WORKPATH>"
-# PROP BASE Cmd_Line ""<PYTHON>" -c "<SCONS_SCRIPT_MAIN>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
-# PROP BASE Rebuild_Opt "-c && "<PYTHON>" -c "<SCONS_SCRIPT_MAIN>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
-# PROP BASE Target_File "<WORKPATH>\Test.exe"
-# PROP BASE Bsc_Name ""
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "<WORKPATH>"
-# PROP Intermediate_Dir "<WORKPATH>"
-# PROP Cmd_Line ""<PYTHON>" -c "<SCONS_SCRIPT_MAIN>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
-# PROP Rebuild_Opt "-c && "<PYTHON>" -c "<SCONS_SCRIPT_MAIN>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe"
-# PROP Target_File "<WORKPATH>\Test.exe"
-# PROP Bsc_Name ""
-# PROP Target_Dir ""
-
-!ENDIF
-
-# Begin Target
-
-# Name "Test - Win32 Release"
-
-!IF  "$(CFG)" == "Test - Win32 Release"
-
-!ENDIF 
-
-# Begin Group " Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;l;y;def;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE="test.cpp"
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE="sdk.h"
-# End Source File
-# End Group
-# Begin Group "Local Headers"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE="test.h"
-# End Source File
-# End Group
-# Begin Group "Other Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE="readme.txt"
-# End Source File
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
-# Begin Source File
-
-SOURCE="test.rc"
-# End Source File
-# End Group
-# Begin Source File
-
-SOURCE="<WORKPATH>\SConstruct"
-# End Source File
-# End Target
-# End Project
-'''
-
-expected_dswfile = '''\
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "Test"="<WORKPATH>\Test.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-'''
-
-expected_slnfile = '''\
-Microsoft Visual Studio Solution File, Format Version 7.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test", "Test.vcproj", "{SLNGUID}"
-EndProject
-Global
-       GlobalSection(SolutionConfiguration) = preSolution
-               ConfigName.0 = Release
-       EndGlobalSection
-       GlobalSection(ProjectDependencies) = postSolution
-       EndGlobalSection
-       GlobalSection(ProjectConfiguration) = postSolution
-               {SLNGUID}.Release.ActiveCfg = Release|Win32
-               {SLNGUID}.Release.Build.0 = Release|Win32
-       EndGlobalSection
-       GlobalSection(ExtensibilityGlobals) = postSolution
-       EndGlobalSection
-       GlobalSection(ExtensibilityAddIns) = postSolution
-       EndGlobalSection
-EndGlobal
-'''
-
-expected_vcprojfile = '''\
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
-       ProjectType="Visual C++"
-       Version="7.00"
-       Name="Test"
-       SccProjectName=""
-       SccLocalPath=""
-       Keyword="MakeFileProj">
-       <Platforms>
-               <Platform
-                       Name="Win32"/>
-       </Platforms>
-       <Configurations>
-               <Configuration
-                       Name="Release|Win32"
-                       OutputDirectory="<WORKPATH>"
-                       IntermediateDirectory="<WORKPATH>"
-                       ConfigurationType="0"
-                       UseOfMFC="0"
-                       ATLMinimizesCRunTimeLibraryUsage="FALSE">
-                       <Tool
-                               Name="VCNMakeTool"
-                               BuildCommandLine="<PYTHON> -c "<SCONS_SCRIPT_MAIN_XML>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe
-"
-                               CleanCommandLine="<PYTHON> -c "<SCONS_SCRIPT_MAIN_XML>" -C <WORKPATH> -f SConstruct -c <WORKPATH>\Test.exe"
-                               RebuildCommandLine="<PYTHON> -c "<SCONS_SCRIPT_MAIN_XML>" -C <WORKPATH> -f SConstruct <WORKPATH>\Test.exe
-"
-                               Output="<WORKPATH>\Test.exe"/>
-               </Configuration>
-       </Configurations>
-       <Files>
-               <Filter
-                       Name=" Source Files"
-                       Filter="cpp;c;cxx;l;y;def;odl;idl;hpj;bat">
-                       <File
-                               RelativePath="test.cpp">
-                       </File>
-               </Filter>
-               <Filter
-                       Name="Header Files"
-                       Filter="h;hpp;hxx;hm;inl">
-                       <File
-                               RelativePath="sdk.h">
-                       </File>
-               </Filter>
-               <Filter
-                       Name="Local Headers"
-                       Filter="h;hpp;hxx;hm;inl">
-                       <File
-                               RelativePath="test.h">
-                       </File>
-               </Filter>
-               <Filter
-                       Name="Other Files"
-                       Filter="">
-                       <File
-                               RelativePath="readme.txt">
-                       </File>
-               </Filter>
-               <Filter
-                       Name="Resource Files"
-                       Filter="r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe">
-                       <File
-                               RelativePath="test.rc">
-                       </File>
-               </Filter>
-               <File
-                       RelativePath="<WORKPATH>\SConstruct">
-               </File>
-       </Files>
-       <Globals>
-       </Globals>
-</VisualStudioProject>
-'''
-
-test = TestSCons.TestSCons(match = TestCmd.match_re)
-
-if sys.platform != 'win32':
-    test.pass_test()
-
-test.run(arguments = '-q -Q -f -', stdin = "import SCons; print SCons.__version__")
-version = test.stdout()[:-1]
-
-exec_script_main = "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-%s'), join(sys.prefix, 'scons-%s'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons') ] + sys.path; import SCons.Script; SCons.Script.main()" % (version, version)
-exec_script_main_xml = string.replace(exec_script_main, "'", "&apos;")
-
-def substitute(input, workpath=test.workpath(), python=sys.executable):
-    result = string.replace(input, r'<WORKPATH>', workpath)
-    result = string.replace(result, r'<PYTHON>', python)
-    result = string.replace(result, r'<SCONS_SCRIPT_MAIN>', exec_script_main)
-    result = string.replace(result, r'<SCONS_SCRIPT_MAIN_XML>', exec_script_main_xml)
-    return result
-
-####
-# Determine which environments are installed on the test machine.
-test.write('SConstruct','''
-env = Environment()
-
-f = open('versions','w')
-f.write('versions = ' + str(env['MSVS']['VERSIONS']))
-f.close()
-''')
-
-test.run()
-versions = []
-execfile(test.workpath('versions'))
-
-#####
-# Test v6.0 output
-
-if '6.0' in versions:
-    test.write('SConstruct','''
-env=Environment(MSVS_VERSION = '6.0')
-
-testsrc = ['test.cpp']
-testincs = ['sdk.h']
-testlocalincs = ['test.h']
-testresources = ['test.rc']
-testmisc = ['readme.txt']
-
-env.MSVSProject(target = 'Test.dsp',
-                srcs = testsrc,
-                incs = testincs,
-                localincs = testlocalincs,
-                resources = testresources,
-                misc = testmisc,
-                buildtarget = 'Test.exe',
-                variant = 'Release')
-    ''')
-
-    test.run(arguments="Test.dsp")
-
-    test.fail_test(not os.path.exists(test.workpath('Test.dsp')))
-    dsp = test.read('Test.dsp', 'r')
-    expect = substitute(expected_dspfile)
-    # don't compare the pickled data
-    assert dsp[:len(expect)] == expect
-
-    test.fail_test(not os.path.exists(test.workpath('Test.dsw')))
-    dsw = test.read('Test.dsw', 'r')
-    expect = substitute(expected_dswfile)
-    assert dsw == expect
-
-    test.run(arguments='-c .')
-
-    test.fail_test(os.path.exists(test.workpath('Test.dsp')))
-    test.fail_test(os.path.exists(test.workpath('Test.dsw')))
-
-    test.run(arguments='Test.dsp')
-
-    test.fail_test(not os.path.exists(test.workpath('Test.dsp')))
-    test.fail_test(not os.path.exists(test.workpath('Test.dsw')))
-
-    test.run(arguments='-c Test.dsw')
-
-    test.fail_test(os.path.exists(test.workpath('Test.dsp')))
-    test.fail_test(os.path.exists(test.workpath('Test.dsw')))
-
-#####
-# Test .NET output
-
-if '7.0' in versions:
-    test.write('SConstruct','''
-env=Environment(MSVS_VERSION = '7.0')
-
-testsrc = ['test.cpp']
-testincs = ['sdk.h']
-testlocalincs = ['test.h']
-testresources = ['test.rc']
-testmisc = ['readme.txt']
-
-env.MSVSProject(target = 'Test.vcproj',
-                slnguid = '{SLNGUID}',
-                srcs = testsrc,
-                incs = testincs,
-                localincs = testlocalincs,
-                resources = testresources,
-                misc = testmisc,
-                buildtarget = 'Test.exe',
-                variant = 'Release')
-    ''')
-
-    test.run(arguments="Test.vcproj")
-
-    test.fail_test(not os.path.exists(test.workpath('Test.vcproj')))
-    test.read('Test.vcproj', 'r')
-    expect = substitute(expected_vcprojfile)
-    # don't compare the pickled data
-    assert vcproj[:len(expect)] == expect
-
-    test.fail_test(not os.path.exists(test.workpath('Test.sln')))
-    sln = test.read('Test.sln', 'r')
-    expect = substitute(expected_slnfile)
-    # don't compare the pickled data
-    assert sln[:len(expect)] == expect
-
-    test.run(arguments='-c .')
-
-    test.fail_test(os.path.exists(test.workpath('Test.vcproj')))
-    test.fail_test(os.path.exists(test.workpath('Test.sln')))
-
-    test.run(arguments='Test.vcproj')
-
-    test.fail_test(not os.path.exists(test.workpath('Test.vcproj')))
-    test.fail_test(not os.path.exists(test.workpath('Test.sln')))
-
-    test.run(arguments='-c Test.sln')
-
-    test.fail_test(os.path.exists(test.workpath('Test.vcproj')))
-    test.fail_test(os.path.exists(test.workpath('Test.sln')))
-
-    # Test that running SCons with $PYTHON_ROOT in the environment
-    # changes the .vcproj output as expected.
-    os.environ['PYTHON_ROOT'] = 'xyzzy'
-
-    test.run(arguments='Test.vcproj')
-
-    python = os.path.join('$(PYTHON_ROOT)', os.path.split(sys.executable)[1])
-
-    test.fail_test(not os.path.exists(test.workpath('Test.vcproj')))
-    test.read('Test.vcproj', 'r')
-    expect = substitute(expected_vcprojfile, python=python)
-    # don't compare the pickled data
-    assert vcproj[:len(expect)] == expect
-
-test.pass_test()
index e1a27f8237f80f606d5d5db057b8a2739e3d64e8..288f8d8e7edbcba3f598c2ba0670f838411d0d7f 100644 (file)
@@ -38,9 +38,9 @@ except ImportError:
     pass
 else:
     if desc[2] == imp.C_BUILTIN:
-       print "The 'md5' module is built in to this version of Python."
-       print "Cannot test falling back to timestamps."
-        test.pass_test(1);
+        msg = "The 'md5' module is built in to this version of Python.\n" + \
+              "Cannot test falling back to timestamps.\n"
+        test.skip_test(msg)
 
 test.write('md5.py', r"""
 raise ImportError
index ea40c66ac52a71123990b570bb603e44f35eb06e..df350eb110dcbc23dd079e71a6c0c884bb6b823b 100644 (file)
@@ -39,7 +39,8 @@ import os.path
 test = TestSCons.TestSCons(match=TestCmd.match_re)
 
 if sys.platform != 'win32':
-    test.pass_test()
+    msg = "Skipping Windows path tests on non-Windows platform '%s'\n" % sys.platform
+    test.skip_test(msg)
 
 test.subdir('src', 'build', 'include', 'src2')
 
@@ -86,17 +87,31 @@ int blat(void);
 int bar(void);
 """)
 
-drive,rest = os.path.splitdrive(test.workpath('src'))
-upper = os.path.join(string.upper(drive),rest)
-lower = os.path.join(string.lower(drive),rest)
+drive, rest = os.path.splitdrive(test.workpath('src'))
 
-test.run(chdir=upper)
-test.run(chdir=lower, stdout=test.wrap_stdout("""\
+drive_upper = string.upper(drive)
+drive_lower = string.lower(drive)
+rest_upper = rest[0] + string.upper(rest[1]) + rest[2:]
+rest_lower = rest[0] + string.lower(rest[1]) + rest[2:]
+
+combinations = [
+    os.path.join(drive_upper, rest_upper),
+    os.path.join(drive_upper, rest_lower),
+    os.path.join(drive_lower, rest_upper),
+    os.path.join(drive_lower, rest_lower),
+]
+
+test.run(chdir=combinations[0])
+
+for dir in combinations[1:]:
+    test.run(chdir=dir, stdout=test.wrap_stdout("""\
 scons: .* is up to date.
 scons: .* is up to date.
 scons: .* is up to date.
 """))
 
+
+
 test.write('SConstruct', """
 env=Environment()
 env.StaticLibrary('a', 'a.c')