Add a self-contained test for not rebuilding generated header files. (Patrick Mezard...
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Mon, 3 Oct 2005 23:08:24 +0000 (23:08 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Mon, 3 Oct 2005 23:08:24 +0000 (23:08 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1356 fdb21ef1-2011-0410-befe-b5e4ea1792b1

runtest.py
test/rebuild-generated.py [new file with mode: 0644]

index b409ce559626f0a2792b8e6fd643125e749b2aa1..be94a3563aa41584dd06defe848a923d3a76dbd8 100644 (file)
@@ -478,7 +478,10 @@ if old_pythonpath:
                                os.pathsep + \
                                old_pythonpath
 
-os.chdir(scons_script_dir)
+try:
+    os.chdir(scons_script_dir)
+except OSError:
+    pass
 
 class Unbuffered:
     def __init__(self, file):
diff --git a/test/rebuild-generated.py b/test/rebuild-generated.py
new file mode 100644 (file)
index 0000000..03acf6d
--- /dev/null
@@ -0,0 +1,119 @@
+#!/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 case for the bug report:
+"[ 1088979 ] Unnecessary rebuild with generated header file"
+(<http://sourceforge.net/tracker/index.php?func=detail&aid=1088979&group_id=30337&atid=398971>).
+
+Unnecessary rebuild with generated header file
+Scons rebuilds some nodes when invoked twice. The
+trigger seems to be a generated C++ source file that
+includes a header file that also is generated.
+
+A tarball with a minimal test case is attached.
+Transcript for reproducing:
+
+cd /tmp
+tar xzf scons_rebuild_debug.tar.gz
+cd scons_rebuild_debug
+scons target.o
+scons target.o
+
+
+Note that the bug is not triggered when scons is run
+without arguments.
+
+This may be a duplicate to bug 1019683.
+"""
+
+import sys
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+_obj = TestSCons._obj
+
+if sys.platform == 'win32':
+    generator_name = 'generator.bat'
+    test.write(generator_name, '@echo #include "header.hh"')
+    kernel_action = "$SOURCES  > $TARGET"
+else:
+    generator_name = 'generator.sh'
+    test.write(generator_name, 'echo \'#include "header.hh"\'')
+    kernel_action = "sh $SOURCES  > $TARGET"
+
+test.write('SConstruct', """\
+
+env = Environment()
+
+kernelDefines = env.Command("header.hh",
+                            [],
+                            Touch("$TARGET"))
+
+kernelImporterSource = env.Command(
+  "generated.cc", ["%s"],
+  "%s")
+
+kernelImporter = env.Program(
+  kernelImporterSource + ["main.cc"])
+
+kernelImports = env.Command(
+  "KernelImport.hh", kernelImporter,
+  "./$SOURCE > $TARGET")
+                                        
+osLinuxModule = env.StaticObject(
+  ["target.cc"])
+""" % (generator_name, kernel_action))
+
+test.write('main.cc', """\
+int
+main(int, char *[])
+{}
+""")
+
+test.write('target.cc', """\
+#if 0
+
+#include "KernelImport.hh"
+
+#endif
+""")
+
+test.run(arguments = 'target' + _obj)
+
+expected_stdout = """\
+scons: Reading SConscript files ...
+scons: done reading SConscript files.
+scons: Building targets ...
+scons: `target%(_obj)s' is up to date.
+scons: done building targets.
+""" % locals()
+
+test.run(arguments = 'target' + _obj, stdout=expected_stdout)
+
+test.pass_test()
+