summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2008-04-21 06:38:31 (GMT)
committerSteven Knight <knight@baldmt.com>2008-04-21 06:38:31 (GMT)
commit736666c4435e553e13b69e57339ec91c9f4f2824 (patch)
tree512353b30aa2af47f79bcd816ea27ac65cf1303f
parenta6391f26d941d3cba4ec4bf6c499d38e2ce4a014 (diff)
downloadSCons-736666c4435e553e13b69e57339ec91c9f4f2824.zip
SCons-736666c4435e553e13b69e57339ec91c9f4f2824.tar.gz
SCons-736666c4435e553e13b69e57339ec91c9f4f2824.tar.bz2
Merged revisions 2880-2883,2885-2895 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core ........ r2885 | stevenknight | 2008-04-18 21:38:59 -0700 (Fri, 18 Apr 2008) | 2 lines Update troubleshooting appendix for new Taskmaster output. ........ r2886 | bdbaddog | 2008-04-19 15:15:03 -0700 (Sat, 19 Apr 2008) | 5 lines Fix infinite loop in Fortran tool initialization. Bug 2017. Steven fixed, I tested. ........ r2887 | garyo | 2008-04-20 17:44:46 -0700 (Sun, 20 Apr 2008) | 1 line Added this in two sections; simple one when discussing simple builds, and an example in the VariantDir section showing how it still works there. ........ r2888 | stevenknight | 2008-04-20 21:33:01 -0700 (Sun, 20 Apr 2008) | 4 lines Accomodate test/MSVC/msvc.py's reliance on the Windows Platform SDK (for now) by making use of the user's %INCLUDE% and %LIB% variables. Split some independent embedded subtests into their own test scripts. ........ r2889 | stevenknight | 2008-04-20 21:38:05 -0700 (Sun, 20 Apr 2008) | 2 lines Windows portability fix (line endings). ........ r2890 | stevenknight | 2008-04-20 21:44:24 -0700 (Sun, 20 Apr 2008) | 2 lines Update Windows portion of if:-elif: block for a variable name change. ........ r2891 | stevenknight | 2008-04-20 21:52:41 -0700 (Sun, 20 Apr 2008) | 3 lines On Windows, escape backslashes on the --interactive command line input, so people can build targets in other directories. ........ r2892 | stevenknight | 2008-04-20 21:56:50 -0700 (Sun, 20 Apr 2008) | 3 lines Fix ripple effects on Windows from redefining how $CXXFLAGS gets added to C++ command lines. ........ r2893 | stevenknight | 2008-04-20 22:04:50 -0700 (Sun, 20 Apr 2008) | 4 lines Handle a ripple effect from redefining the file() and open() builtin functions by explicitly restoring the originals whenever we reset the global state between tests. ........ r2894 | stevenknight | 2008-04-20 23:17:23 -0700 (Sun, 20 Apr 2008) | 2 lines Remove by-hand backslash escaping, now that --interactive mode is handling it. ........ r2895 | stevenknight | 2008-04-20 23:23:04 -0700 (Sun, 20 Apr 2008) | 2 lines Mention the fix for the Fortran suffix out-of-memory bug ........
-rw-r--r--doc/user/less-simple.in24
-rw-r--r--doc/user/less-simple.xml24
-rw-r--r--doc/user/separate.in57
-rw-r--r--doc/user/separate.xml46
-rw-r--r--doc/user/troubleshoot.xml50
-rw-r--r--src/CHANGES.txt12
-rw-r--r--src/engine/SCons/ActionTests.py3
-rw-r--r--src/engine/SCons/SConfTests.py16
-rw-r--r--src/engine/SCons/Script/Interactive.py2
-rw-r--r--src/engine/SCons/Tool/FortranCommon.py7
-rw-r--r--test/CXX/CCFLAGS.py6
-rw-r--r--test/Deprecated/Options/ListOption.py4
-rw-r--r--test/Interactive/added-include.py7
-rw-r--r--test/MSVC/PCHSTOP-errors.py75
-rw-r--r--test/MSVC/hierarchical.py93
-rw-r--r--test/MSVC/msvc.py95
-rw-r--r--test/NodeOps.py19
-rw-r--r--test/gnutools.py4
18 files changed, 405 insertions, 139 deletions
diff --git a/doc/user/less-simple.in b/doc/user/less-simple.in
index 76afa30..7b45271 100644
--- a/doc/user/less-simple.in
+++ b/doc/user/less-simple.in
@@ -209,6 +209,30 @@
</section>
<section>
+ <title>Making a list of files with Glob()</title>
+
+ <para>
+
+ You can also use the Glob() function to find all files matching a
+ certain template, using standard the shell pattern matching
+ characters *, ?, and [abc] to match any of a, b, or c. [!abc] is
+ also supported, to match any character <emphasis>except</emphasis>
+ a, b, or c. This makes many multi-source-file builds quite easy:
+
+ </para>
+
+ <sconstruct>
+ Program('program', Glob('*.c'))
+ </sconstruct>
+
+ <para>
+
+ The SCons man page has more details on using Glob() with Variant
+ dirs and Repositories and returning strings rather than Nodes.
+
+ </section>
+
+ <section>
<title>Specifying Single Files Vs. Lists of Files</title>
<para>
diff --git a/doc/user/less-simple.xml b/doc/user/less-simple.xml
index eea3425..c6ded70 100644
--- a/doc/user/less-simple.xml
+++ b/doc/user/less-simple.xml
@@ -198,6 +198,30 @@
</section>
<section>
+ <title>Making a list of files with Glob()</title>
+
+ <para>
+
+ You can also use the Glob() function to find all files matching a
+ certain template, using standard the shell pattern matching
+ characters *, ?, and [abc] to match any of a, b, or c. [!abc] is
+ also supported, to match any character <emphasis>except</emphasis>
+ a, b, or c. This makes many multi-source-file builds quite easy:
+
+ </para>
+
+ <programlisting>
+ Program('program', Glob('*.c'))
+ </programlisting>
+
+ <para>
+
+ The SCons man page has more details on using Glob() with Variant
+ dirs and Repositories and returning strings rather than Nodes.
+
+ </section>
+
+ <section>
<title>Specifying Single Files Vs. Lists of Files</title>
<para>
diff --git a/doc/user/separate.in b/doc/user/separate.in
index be7e6c5..dc77af3 100644
--- a/doc/user/separate.in
+++ b/doc/user/separate.in
@@ -466,6 +466,63 @@ program using the F<build/foo.c> path name.
</section>
+ <section>
+ <title>Using Glob() with &VariantDir;</title>
+
+ <para>
+
+ The Glob() file name pattern matching function
+ works just as usual when using &VariantDir;.
+ For example, if the
+ <filename>src/SConscript</filename>
+ looks like this:
+
+ </para>
+
+ <scons_example name="example_glob_builddir_sconscript">
+ <file name="SConstruct">
+ VariantDir('build', 'src')
+ SConscript('build/SConscript')
+ </file>
+ <file name="src/SConscript" printme="1">
+ env = Environment()
+ env.Program('hello', Glob('*.c'))
+ </file>
+ <file name="src/f1.c">
+ #include "f2.h"
+ int main() { printf(f2()); }
+ </file>
+ <file name="src/f2.c">
+ const char * f2() { return("Hello, world!\n"); }
+ </file>
+ <file name="src/f2.h">
+ const char * f2();
+ </file>
+ </scons_example>
+
+ <para>
+
+ Then with the same &SConstruct; file as in the previous section,
+ and source files f1.c and f2.c in src, we would see the following
+ output:
+
+ </para>
+
+ <scons_output example="example_glob_builddir_sconscript">
+ <scons_output_command>ls src</scons_output_command>
+ <scons_output_command>scons -Q</scons_output_command>
+ <scons_output_command>ls build</scons_output_command>
+ </scons_output>
+
+ <para>
+
+ The Glob function returns Nodes in the build/ tree, as
+ you'd expect.
+
+ </para>
+
+ </section>
+
<!--
<section>
diff --git a/doc/user/separate.xml b/doc/user/separate.xml
index 57ade04..c5e90e0 100644
--- a/doc/user/separate.xml
+++ b/doc/user/separate.xml
@@ -457,6 +457,52 @@ program using the F<build/foo.c> path name.
</section>
+ <section>
+ <title>Using Glob() with &VariantDir;</title>
+
+ <para>
+
+ The Glob() file name pattern matching function
+ works just as usual when using &VariantDir;.
+ For example, if the
+ <filename>src/SConscript</filename>
+ looks like this:
+
+ </para>
+
+ <programlisting>
+ env = Environment()
+ env.Program('hello', Glob('*.c'))
+ </programlisting>
+
+ <para>
+
+ Then with the same &SConstruct; file as in the previous section,
+ and source files f1.c and f2.c in src, we would see the following
+ output:
+
+ </para>
+
+ <screen>
+ % <userinput>ls src</userinput>
+ SConscript f1.c f2.c f2.h
+ % <userinput>scons -Q</userinput>
+ cc -o build/f1.o -c build/f1.c
+ cc -o build/f2.o -c build/f2.c
+ cc -o build/hello build/f1.o build/f2.o
+ % <userinput>ls build</userinput>
+ SConscript f1.c f1.o f2.c f2.h f2.o hello
+ </screen>
+
+ <para>
+
+ The Glob function returns Nodes in the build/ tree, as
+ you'd expect.
+
+ </para>
+
+ </section>
+
<!--
<section>
diff --git a/doc/user/troubleshoot.xml b/doc/user/troubleshoot.xml
index dc90622..0a34559 100644
--- a/doc/user/troubleshoot.xml
+++ b/doc/user/troubleshoot.xml
@@ -1115,11 +1115,10 @@
% <userinput>scons -Q --debug=stacktrace</userinput>
scons: *** Source `prog.c' not found, needed by target `prog.o'. Stop.
scons: internal stack trace:
- File "bootstrap/src/engine/SCons/Job.py", line 131, in start
+ File "bootstrap/src/engine/SCons/Job.py", line 187, in start
File "bootstrap/src/engine/SCons/Script/Main.py", line 169, in prepare
- File "bootstrap/src/engine/SCons/Taskmaster.py", line 169, in prepare
- File "bootstrap/src/engine/SCons/Node/FS.py", line 2551, in prepare
- File "bootstrap/src/engine/SCons/Node/__init__.py", line 349, in prepare
+ File "bootstrap/src/engine/SCons/Taskmaster.py", line 184, in prepare
+ File "bootstrap/src/engine/SCons/Executor.py", line 171, in prepare
</screen>
<para>
@@ -1174,24 +1173,35 @@
<screen>
% <userinput>scons -Q --taskmastertrace=- prog</userinput>
- Taskmaster: 'prog': children:
- ['prog.o']
- waiting on unfinished children:
- ['prog.o']
- Taskmaster: 'prog.o': children:
- ['inc.h', 'prog.c']
- waiting on unfinished children:
- ['inc.h', 'prog.c']
- Taskmaster: 'prog.c': evaluating prog.c
- Taskmaster: 'inc.h': evaluating inc.h
- Taskmaster: 'prog.o': children:
- ['inc.h', 'prog.c']
- evaluating prog.o
+
+ Taskmaster: Looking for a node to evaluate
+ Taskmaster: Considering node &lt;no_state 'prog'&gt; and its children:
+ Taskmaster: &lt;no_state 'prog.o'&gt;
+ Taskmaster: Considering node &lt;no_state 'prog.o'&gt; and its children:
+ Taskmaster: &lt;no_state 'prog.c'&gt;
+ Taskmaster: &lt;no_state 'inc.h'&gt;
+ Taskmaster: Considering node &lt;no_state 'prog.c'&gt; and its children:
+ Taskmaster: Evaluating &lt;pending 'prog.c'&gt;
+
+ Taskmaster: Looking for a node to evaluate
+ Taskmaster: Considering node &lt;no_state 'inc.h'&gt; and its children:
+ Taskmaster: Evaluating &lt;pending 'inc.h'&gt;
+
+ Taskmaster: Looking for a node to evaluate
+ Taskmaster: Considering node &lt;pending 'prog.o'&gt; and its children:
+ Taskmaster: &lt;up_to_date 'prog.c'&gt;
+ Taskmaster: &lt;up_to_date 'inc.h'&gt;
+ Taskmaster: Evaluating &lt;pending 'prog.o'&gt;
cc -o prog.o -c -I. prog.c
- Taskmaster: 'prog': children:
- ['prog.o']
- evaluating prog
+
+ Taskmaster: Looking for a node to evaluate
+ Taskmaster: Considering node &lt;pending 'prog'&gt; and its children:
+ Taskmaster: &lt;executed 'prog.o'&gt;
+ Taskmaster: Evaluating &lt;pending 'prog'&gt;
cc -o prog prog.o
+
+ Taskmaster: Looking for a node to evaluate
+ Taskmaster: No candidate anymore.
</screen>
<para>
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 8e16bd4..11f6dfb 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -8,6 +8,18 @@
+RELEASE 0.98.2 - XXX
+
+ From Steven Knight:
+
+ - Fix a bug in Fortran suffix computation that would cause SCons to
+ run out of memory on Windows systems.
+
+ - Fix being able to specify --interactive mode command lines with
+ \ (backslash) path name separators on Windows.
+
+
+
RELEASE 0.98.1 - Fri, 18 Apr 2008 19:11:58 -0700
From Benoit Belley:
diff --git a/src/engine/SCons/ActionTests.py b/src/engine/SCons/ActionTests.py
index f25f232..a503981 100644
--- a/src/engine/SCons/ActionTests.py
+++ b/src/engine/SCons/ActionTests.py
@@ -1003,7 +1003,8 @@ class CommandActionTestCase(unittest.TestCase):
# NT treats execs of directories and non-executable files
# as "file not found" errors
expect_nonexistent = 1
- expect_nonexecutable = 1
+ expect_nonexecutable_file = 1
+ expect_nonexecutable_dir = 1
elif sys.platform == 'cygwin':
expect_nonexistent = 127
# Newer cygwin seems to return 126 for following
diff --git a/src/engine/SCons/SConfTests.py b/src/engine/SCons/SConfTests.py
index 25c89d2..ba9f2f5e 100644
--- a/src/engine/SCons/SConfTests.py
+++ b/src/engine/SCons/SConfTests.py
@@ -88,7 +88,21 @@ class SConfTestCase(unittest.TestCase):
if self.scons_env['CXX'] == 'g++':
global existing_lib
existing_lib = 'm'
-
+
+ if sys.platform in ['cygwin', 'win32']:
+ # On Windows, SCons.Platform.win32 redefines the builtin
+ # file() and open() functions to close the file handles.
+ # This interferes with the unittest.py infrastructure in
+ # some way. Just sidestep the issue by restoring the
+ # original builtin functions whenever we have to reset
+ # all of our global state.
+
+ import __builtin__
+ import SCons.Platform.win32
+
+ __builtin__.file = SCons.Platform.win32._builtin_file
+ __builtin__.open = SCons.Platform.win32._builtin_open
+
def _baseTryXXX(self, TryFunc):
# TryCompile and TryLink are much the same, so we can test them
# in one method, we pass the function as a string ('TryCompile',
diff --git a/src/engine/SCons/Script/Interactive.py b/src/engine/SCons/Script/Interactive.py
index b1774eb..9510892 100644
--- a/src/engine/SCons/Script/Interactive.py
+++ b/src/engine/SCons/Script/Interactive.py
@@ -145,6 +145,8 @@ class SConsInteractiveCmd(cmd.Cmd):
line = 'shell ' + line[1:]
elif line[0] == '?':
line = 'help ' + line[1:]
+ if os.sep == '\\':
+ line = string.replace(line, '\\', '\\\\')
argv = shlex.split(line)
argv[0] = self.synonyms.get(argv[0], argv[0])
if not argv[0]:
diff --git a/src/engine/SCons/Tool/FortranCommon.py b/src/engine/SCons/Tool/FortranCommon.py
index 579b4dd..82a5a6c 100644
--- a/src/engine/SCons/Tool/FortranCommon.py
+++ b/src/engine/SCons/Tool/FortranCommon.py
@@ -92,12 +92,11 @@ def ComputeFortranSuffixes(suffixes, ppsuffixes):
assert len(suffixes) > 0
s = suffixes[0]
sup = string.upper(s)
+ upper_suffixes = map(string.upper, suffixes)
if SCons.Util.case_sensitive_suffixes(s, sup):
- for i in suffixes:
- ppsuffixes.append(string.upper(i))
+ ppsuffixes.extend(upper_suffixes)
else:
- for i in suffixes:
- suffixes.append(string.upper(i))
+ suffixes.extend(upper_suffixes)
def CreateDialectActions(dialect):
"""Create dialect specific actions."""
diff --git a/test/CXX/CCFLAGS.py b/test/CXX/CCFLAGS.py
index a559de3..a867340 100644
--- a/test/CXX/CCFLAGS.py
+++ b/test/CXX/CCFLAGS.py
@@ -34,8 +34,10 @@ import TestSCons
test = TestSCons.TestSCons()
test.write('SConstruct', """
-foo = Environment(CCFLAGS = '-DFOO', CXXFLAGS = '-DCXX')
-bar = Environment(CCFLAGS = '-DBAR', CXXFLAGS = '-DCXX')
+foo = Environment()
+foo.Append(CCFLAGS = '-DFOO', CXXFLAGS = '-DCXX')
+bar = Environment()
+bar.Append(CCFLAGS = '-DBAR', CXXFLAGS = '-DCXX')
foo_obj = foo.Object(target = 'foo', source = 'prog.cpp')
bar_obj = bar.Object(target = 'bar', source = 'prog.cpp')
foo.Program(target = 'foo', source = foo_obj)
diff --git a/test/Deprecated/Options/ListOption.py b/test/Deprecated/Options/ListOption.py
index 68d2ee8..1ce20a2 100644
--- a/test/Deprecated/Options/ListOption.py
+++ b/test/Deprecated/Options/ListOption.py
@@ -81,9 +81,7 @@ test.run()
check(['all', '1', 'gl ical qt x11', 'gl ical qt x11',
"['gl ical qt x11']"])
-test.must_match(test.workpath('scons.options'),
- "shared = 'all'"+os.linesep,
- mode='r')
+test.must_match(test.workpath('scons.options'), "shared = 'all'"+os.linesep)
check(['all', '1', 'gl ical qt x11', 'gl ical qt x11',
"['gl ical qt x11']"])
diff --git a/test/Interactive/added-include.py b/test/Interactive/added-include.py
index 8c30314..73f8096 100644
--- a/test/Interactive/added-include.py
+++ b/test/Interactive/added-include.py
@@ -60,14 +60,13 @@ Command('3', [], Touch('$TARGET'))
""")
foo_exe = test.workpath('foo' + TestSCons._exe)
-_foo_exe_ = '"%s"' % string.replace(foo_exe, '\\', '\\\\')
# Start scons, to build "foo"
scons = test.start(arguments = '--interactive')
-scons.send("build %(_foo_exe_)s 1\n" % locals())
+scons.send("build %(foo_exe)s 1\n" % locals())
test.wait_for(test.workpath('1'), popen=scons)
@@ -91,7 +90,7 @@ int main()
}
""")
-scons.send("build %(_foo_exe_)s 2\n" % locals())
+scons.send("build %(foo_exe)s 2\n" % locals())
test.wait_for(test.workpath('2'))
@@ -106,7 +105,7 @@ test.write('foo.h.in', """
-scons.send("build %(_foo_exe_)s 3\n" % locals())
+scons.send("build %(foo_exe)s 3\n" % locals())
test.wait_for(test.workpath('3'))
diff --git a/test/MSVC/PCHSTOP-errors.py b/test/MSVC/PCHSTOP-errors.py
new file mode 100644
index 0000000..c0bc693
--- /dev/null
+++ b/test/MSVC/PCHSTOP-errors.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__"
+
+"""
+# Test error reporting
+"""
+
+import re
+import sys
+
+import TestSCons
+
+test = TestSCons.TestSCons(match = TestSCons.match_re)
+
+if sys.platform != 'win32':
+ msg = "Skipping Visual C/C++ test on non-Windows platform '%s'\n" % sys.platform
+ test.skip_test(msg)
+
+
+
+SConstruct_path = test.workpath('SConstruct')
+
+test.write(SConstruct_path, """\
+env = Environment()
+env['PDB'] = File('test.pdb')
+env['PCH'] = env.PCH('StdAfx.cpp')[0]
+if int(ARGUMENTS.get('SET_PCHSTOP')):
+ env['PCHSTOP'] = File('StdAfx.h')
+env.Program('test', 'test.cpp')
+""")
+
+
+
+expect_stderr = r'''
+scons: \*\*\* The PCHSTOP construction must be defined if PCH is defined.
+File "%s", line \d+, in \?
+''' % re.escape(SConstruct_path)
+
+test.run(arguments='SET_PCHSTOP=0', status=2, stderr=expect_stderr)
+
+
+
+expect_stderr = r'''
+scons: \*\*\* The PCHSTOP construction variable must be a string: .+
+File "%s", line \d+, in \?
+''' % re.escape(SConstruct_path)
+
+test.run(arguments='SET_PCHSTOP=1', status=2, stderr=expect_stderr)
+
+
+
+test.pass_test()
diff --git a/test/MSVC/hierarchical.py b/test/MSVC/hierarchical.py
new file mode 100644
index 0000000..2dece66
--- /dev/null
+++ b/test/MSVC/hierarchical.py
@@ -0,0 +1,93 @@
+#!/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__"
+
+"""
+Verify use of Visual Studio with a hierarchical build.
+"""
+
+import sys
+
+import TestSCons
+
+test = TestSCons.TestSCons(match = TestSCons.match_re)
+
+if sys.platform != 'win32':
+ msg = "Skipping Visual C/C++ test on non-Windows platform '%s'\n" % sys.platform
+ test.skip_test(msg)
+
+
+
+test.subdir('src', 'build', 'out')
+
+test.write('SConstruct', """
+VariantDir('build', 'src', duplicate=0)
+SConscript('build/SConscript')
+""")
+
+test.write('src/SConscript',"""
+import os
+env = Environment()
+env.Append(CPPPATH=os.environ['INCLUDE'],
+ LIBPATH=os.environ['LIB'])
+env['PCH'] = 'StdAfx.pch'
+env['PDB'] = '#out/test.pdb'
+env['PCHSTOP'] = 'StdAfx.h'
+env.PCH('StdAfx.cpp')
+env.Program('#out/test.exe', 'test.cpp')
+""")
+
+test.write('src/test.cpp', '''
+#include "StdAfx.h"
+
+int main(void)
+{
+ return 1;
+}
+''')
+
+test.write('src/StdAfx.h', '''
+#include <windows.h>
+''')
+
+test.write('src/StdAfx.cpp', '''
+#include "StdAfx.h"
+''')
+
+test.run(arguments='out', stderr=None)
+
+test.must_exist(test.workpath('out/test.pdb'))
+test.must_exist(test.workpath('build/StdAfx.pch'))
+test.must_exist(test.workpath('build/StdAfx.obj'))
+
+test.run(arguments='-c out')
+
+test.must_not_exist(test.workpath('out/test.pdb'))
+test.must_not_exist(test.workpath('build/StdAfx.pch'))
+test.must_not_exist(test.workpath('build/StdAfx.obj'))
+
+
+
+test.pass_test()
diff --git a/test/MSVC/msvc.py b/test/MSVC/msvc.py
index 48e47f6..552d039 100644
--- a/test/MSVC/msvc.py
+++ b/test/MSVC/msvc.py
@@ -25,15 +25,13 @@
__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
import os
-import os.path
import re
import sys
import time
-import TestCmd
import TestSCons
-test = TestSCons.TestSCons(match = TestCmd.match_re)
+test = TestSCons.TestSCons(match = TestSCons.match_re)
if sys.platform != 'win32':
msg = "Skipping Visual C/C++ test on non-Windows platform '%s'\n" % sys.platform
@@ -43,7 +41,10 @@ if sys.platform != 'win32':
# Test the basics
test.write('SConstruct',"""
-env=Environment()
+import os
+env = Environment()
+env.Append(CPPPATH=os.environ['INCLUDE'],
+ LIBPATH=os.environ['LIB'])
env['PDB'] = File('test.pdb')
env['PCHSTOP'] = 'StdAfx.h'
env['PCH'] = env.PCH('StdAfx.cpp')[0]
@@ -185,91 +186,5 @@ test.not_up_to_date(arguments='test.exe', stderr=None)
test.run(program=test.workpath('test.exe'), stdout='2003 test 2\n')
-##########
-# Test a hierarchical build
-
-test.subdir('src', 'build', 'out')
-
-test.write('SConstruct',"""
-VariantDir('build', 'src', duplicate=0)
-SConscript('build/SConscript')
-""")
-
-test.write('src/SConscript',"""
-env=Environment()
-env['PCH'] = 'StdAfx.pch'
-env['PDB'] = '#out/test.pdb'
-env['PCHSTOP'] = 'StdAfx.h'
-env.PCH('StdAfx.cpp')
-env.Program('#out/test.exe', 'test.cpp')
-""")
-
-test.write('src/test.cpp', '''
-#include "StdAfx.h"
-
-int main(void)
-{
- return 1;
-}
-''')
-
-test.write('src/StdAfx.h', '''
-#include <windows.h>
-''')
-
-test.write('src/StdAfx.cpp', '''
-#include "StdAfx.h"
-''')
-
-test.run(arguments='out', stderr=None)
-
-test.must_exist(test.workpath('out/test.pdb'))
-test.must_exist(test.workpath('build/StdAfx.pch'))
-test.must_exist(test.workpath('build/StdAfx.obj'))
-
-test.run(arguments='-c out')
-
-test.must_not_exist(test.workpath('out/test.pdb'))
-test.must_not_exist(test.workpath('build/StdAfx.pch'))
-test.must_not_exist(test.workpath('build/StdAfx.obj'))
-
-#####
-# Test error reporting
-
-SConstruct_path = test.workpath('SConstruct')
-
-test.write(SConstruct_path, """\
-env = Environment()
-env['PDB'] = File('test.pdb')
-env['PCH'] = env.PCH('StdAfx.cpp')[0]
-env.Program('test', 'test.cpp')
-""")
-
-expect_stderr = r'''
-scons: \*\*\* The PCHSTOP construction must be defined if PCH is defined.
-File "%s", line 4, in \?
-''' % re.escape(SConstruct_path)
-
-test.run(status=2, stderr=expect_stderr)
-
-test.write(SConstruct_path, """\
-env = Environment()
-env['PDB'] = File('test.pdb')
-env['PCHSTOP'] = File('StdAfx.h')
-env['PCH'] = env.PCH('StdAfx.cpp')[0]
-env.Program('test', 'test.cpp')
-""")
-
-expect_stderr = r'''
-scons: \*\*\* The PCHSTOP construction variable must be a string: .+
-File "%s", line 5, in \?
-''' % re.escape(SConstruct_path)
-
-test.run(status=2, stderr=expect_stderr)
test.pass_test()
-
-
-
-
-
diff --git a/test/NodeOps.py b/test/NodeOps.py
index d00f726..ffaeb62 100644
--- a/test/NodeOps.py
+++ b/test/NodeOps.py
@@ -52,15 +52,13 @@ if string.find(sys.platform, 'irix') > -1:
test = TestSCons.TestSCons()
-e = test.Environment()
-fooflags = e['SHCXXFLAGS'] + ' -DFOO'
-barflags = e['SHCXXFLAGS'] + ' -DBAR'
-
test.subdir('bld', 'src', ['src', 'subsrcdir'])
sconstruct = r"""
-foo = Environment(SHOBJPREFIX='', SHCXXFLAGS = '%(fooflags)s', WINDOWS_INSERT_DEF=1)
-bar = Environment(SHOBJPREFIX='', SHCXXFLAGS = '%(barflags)s', WINDOWS_INSERT_DEF=1)
+foo = Environment(SHOBJPREFIX='', WINDOWS_INSERT_DEF=1)
+foo.Append(SHCXXFLAGS = '-DFOO')
+bar = Environment(SHOBJPREFIX='', WINDOWS_INSERT_DEF=1)
+bar.Append(SHCXXFLAGS = '-DBAR')
src = Dir('src')
VariantDir('bld', src, duplicate=1)
Nodes=[]
@@ -90,11 +88,9 @@ gooMain = foo.Clone(LIBS='goo', LIBPATH='bld')
goo_obj = gooMain.Object(target='goomain', source='main.c')
gooMain.Program(target='gooprog', source=goo_obj)
"""
-
test.write('foo.def', r"""
LIBRARY "foo"
-DESCRIPTION "Foo Shared Library"
EXPORTS
doIt
@@ -102,7 +98,6 @@ EXPORTS
test.write('bar.def', r"""
LIBRARY "bar"
-DESCRIPTION "Bar Shared Library"
EXPORTS
doIt
@@ -153,8 +148,9 @@ def exists_test(node):
import sys
sys.stderr.write('VariantDir exists() population did not occur! (%%s:%%s,%%s,%%s)\n'%%(str(node),before,via_node,after))
sys.exit(-2)
-
-goo = Environment(CPPFLAGS = '%(fooflags)s')
+
+goo = Environment()
+goo.Append(CFLAGS = '-DFOO')
goof_in = File('goof.in')
if %(_E)s:
exists_test(goof_in)
@@ -192,7 +188,6 @@ boo_sub()
""")
test.write('main.c', r"""
-
void doIt();
int
diff --git a/test/gnutools.py b/test/gnutools.py
index 2180217..bf0cb5a 100644
--- a/test/gnutools.py
+++ b/test/gnutools.py
@@ -133,8 +133,8 @@ testObject(test, 'cppfile1.o', 'g++ -c')
testObject(test, 'cppfile2.o', 'g++ -c')
testObject(test, 'cfile1.os', 'gcc -c' + c_fpic)
testObject(test, 'cfile2.os', 'gcc -c' + c_fpic)
-testObject(test, 'cppfile1.os', 'g++ -c -fPIC')
-testObject(test, 'cppfile2.os', 'g++ -c -fPIC')
+testObject(test, 'cppfile1.os', 'g++ -c' + c_fpic)
+testObject(test, 'cppfile2.os', 'g++ -c' + c_fpic)
testObject(test, 'c-only' + _exe, 'gcc')
testObject(test, 'cpp-only' + _exe, 'g++')
testObject(test, 'c-and-cpp' + _exe, 'g++')