Handle SConscript files in subdirectories.
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Mon, 29 Oct 2001 05:33:03 +0000 (05:33 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Mon, 29 Oct 2001 05:33:03 +0000 (05:33 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@111 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/Node/FS.py
src/engine/SCons/Node/FSTests.py
src/engine/SCons/Sig/MD5.py
src/engine/SCons/Sig/MD5Tests.py
src/script/scons.py
test/Depends.py
test/SConscript.py
test/errors.py
test/option-f.py

index c3566a681c281fcf5d04bd411052a64db8ef86f8..860f46b45531401db08f0abe9006f3359421f9b0 100644 (file)
@@ -120,6 +120,7 @@ class FS:
         self.Top = self.__doLookup(Dir, path)
         self.Top.path = '.'
         self.Top.path_ = './'
+        self.cwd = self.Top
 
     def __doLookup(self, fsclass, name, directory=None):
         """This method differs from the File and Dir factory methods in
@@ -188,9 +189,15 @@ class FS:
             directory = self.Top
             name = os.path.join(os.path.normpath('./'), name[1:])
         elif not directory:
-            directory = self.Top
+            directory = self.cwd
         return (name, directory)
 
+    def chdir(self, dir):
+        """Change the current working directory for lookups.
+        """
+        if not dir is None:
+            self.cwd = dir
+
     def Entry(self, name, directory = None):
         """Lookup or create a generic Entry node with the specified name.
         If the name is a relative path (begins with ./, ../, or a file
index 360132abeab66f7c1a967b8599513addfc5b9c42..430d4b43154afcc6383fd341dbf72cb3509c5ff3 100644 (file)
@@ -278,6 +278,14 @@ class FSTestCase(unittest.TestCase):
         assert d10.get_bsig() is None, d10.get_bsig()
         assert d10.get_csig() is None, d10.get_csig()
 
+        fs.chdir(fs.Dir('subdir'))
+        f11 = fs.File("f11")
+        assert f11.path == "subdir/f11"
+        d12 = fs.Dir("d12")
+        assert d12.path_ == "subdir/d12/"
+        e13 = fs.Entry("subdir/e13")
+        assert e13.path == "subdir/subdir/e13"
+
         #XXX test exists()
 
         #XXX test current() for directories
index 11ba96106b5852edea7f0f735da0a7fc176a5269..e13669eeed26058b72c6d55f717c6a69d735b2da 100644 (file)
@@ -78,7 +78,11 @@ def collect(signatures):
 def signature(obj):
     """Generate a signature for an object
     """
-    return hexdigest(md5.new(obj.get_contents()).digest())
+    try:
+        contents = obj.get_contents()
+    except AttributeError:
+        raise AttributeError, "unable to fetch contents of '%s'" % str(obj)
+    return hexdigest(md5.new(contents).digest())
 
 def to_string(signature):
     """Convert a signature to a string"""
index 641dcb0282f6403a071265f1cff51e8c9223b6d8..f9cf61fa67518241a42a059a11a41dbde99b1abb 100644 (file)
@@ -75,6 +75,13 @@ class MD5TestCase(unittest.TestCase):
        o1 = my_obj(value = '111')
         assert '698d51a19d8a121ce581499d7b701668' == signature(o1)
 
+        try:
+            signature('string')
+        except AttributeError, e:
+            assert str(e) == "unable to fetch contents of 'string'"
+        else:
+            raise AttributeError, "unexpected get_contents() attribute"
+
     def test_to_string(self):
         assert '698d51a19d8a121ce581499d7b701668' == to_string('698d51a19d8a121ce581499d7b701668')
 
index d6c7698f465d3103623ae164689651e3b3bd177c..49a84671245c73444ad8e02774d2168c1c3cdf47 100644 (file)
@@ -147,9 +147,9 @@ def _scons_other_errors():
 
 
 
-def Conscript(filename):
+def SConscript(filename):
     global scripts
-    scripts.append(filename)
+    scripts.append(SCons.Node.FS.default_fs.File(filename))
 
 def Default(*targets):
     for t in targets:
@@ -361,7 +361,10 @@ def options_init():
 
     def opt_f(opt, arg):
        global scripts
-       scripts.append(arg)
+       if arg == '-':
+            scripts.append(arg)
+       else:
+           scripts.append(SCons.Node.FS.default_fs.File(arg))
 
     Option(func = opt_f,
        short = 'f', long = ['file', 'makefile', 'sconstruct'], arg = 'FILE',
@@ -581,7 +584,7 @@ def main():
     if not scripts:
         for file in ['SConstruct', 'Sconstruct', 'sconstruct']:
             if os.path.isfile(file):
-                scripts.append(file)
+                scripts.append(SCons.Node.FS.default_fs.File(file))
                 break
 
     if help_option == 'H':
@@ -616,16 +619,18 @@ def main():
     sys.path = include_dirs + sys.path
 
     while scripts:
-        file, scripts = scripts[0], scripts[1:]
-       if file == "-":
+        f, scripts = scripts[0], scripts[1:]
+        if f == "-":
            exec sys.stdin in globals()
        else:
             try:
-               f = open(file, "r")
+                file = open(f.path, "r")
            except IOError, s:
-               sys.stderr.write("Ignoring missing script '%s'\n" % file)
+                sys.stderr.write("Ignoring missing SConscript '%s'\n" % f.path)
            else:
-               exec f in globals()
+                SCons.Node.FS.default_fs.chdir(f.dir)
+                exec file in globals()
+    SCons.Node.FS.default_fs.chdir(SCons.Node.FS.default_fs.Top)
 
     if help_option == 'h':
        # They specified -h, but there was no Help() inside the
index 3777fbdab1fca34e0a8f92dea5de2894899364bb..5fb04793241cfedb354680526086be4362cb916d 100644 (file)
@@ -52,12 +52,12 @@ env.Depends(target = 'f3.out', dependency = 'subdir/bar.dep')
 env.Foo(target = 'f1.out', source = 'f1.in')
 env.Foo(target = 'f2.out', source = 'f2.in')
 env.Bar(target = 'f3.out', source = 'f3.in')
-Conscript('subdir/SConscript')
+SConscript('subdir/SConscript')
 """ % (python, python))
 
 test.write(['subdir', 'SConscript'], """
 env.Depends(target = 'f4.out', dependency = 'bar.dep')
-env.Foo(target = 'f4.out', source = 'f4.in')
+env.Bar(target = 'f4.out', source = 'f4.in')
 """)
 
 test.write('f1.in', "f1.in\n")
@@ -72,40 +72,34 @@ test.write(['subdir', 'foo.dep'], "subdir/foo.dep 1\n")
 
 test.write(['subdir', 'bar.dep'], "subdir/bar.dep 1\n")
 
-#XXXtest.run(arguments = '.')
-#test.run(arguments = 'f1.out f2.out f3.out subdir/f4.out')
-test.run(arguments = 'f1.out f2.out f3.out')
+test.run(arguments = '.')
 
 test.fail_test(test.read('f1.out') != "f1.in\nsubdir/foo.dep 1\n")
 test.fail_test(test.read('f2.out') != "f2.in\nsubdir/foo.dep 1\n")
 test.fail_test(test.read('f3.out') != "f3.in\nsubdir/bar.dep 1\n")
-#XXXtest.fail_test(test.read(['subdir', 'f4.out']) !=
-#XXX                                   "subdir/f4.in\nsubdir/bar.dep 1\n")
+test.fail_test(test.read(['subdir', 'f4.out']) !=
+               "subdir/f4.in\nsubdir/bar.dep 1\n")
 
 test.write(['subdir', 'foo.dep'], "subdir/foo.dep 2\n")
 
 test.write(['subdir', 'bar.dep'], "subdir/bar.dep 2\n")
 
-#XXXtest.run(arguments = '.')
-#test.run(arguments = 'f1.out f2.out f3.out subdir/f4.out')
-test.run(arguments = 'f1.out f2.out f3.out')
+test.run(arguments = '.')
 
 test.fail_test(test.read('f1.out') != "f1.in\nsubdir/foo.dep 2\n")
 test.fail_test(test.read('f2.out') != "f2.in\nsubdir/foo.dep 2\n")
 test.fail_test(test.read('f3.out') != "f3.in\nsubdir/bar.dep 2\n")
-#XXXtest.fail_test(test.read(['subdir', 'f4.out']) !=
-#XXX                                   "subdir/f4.in\nsubdir/bar.dep 2\n")
+test.fail_test(test.read(['subdir', 'f4.out']) !=
+               "subdir/f4.in\nsubdir/bar.dep 2\n")
 
 test.write(['subdir', 'bar.dep'], "subdir/bar.dep 3\n")
 
-#XXXtest.run(arguments = '.')
-#test.run(arguments = 'f1.out f2.out f3.out subdir/f4.out')
-test.run(arguments = 'f1.out f2.out f3.out')
+test.run(arguments = '.')
 
 test.fail_test(test.read('f1.out') != "f1.in\nsubdir/foo.dep 2\n")
 test.fail_test(test.read('f2.out') != "f2.in\nsubdir/foo.dep 2\n")
 test.fail_test(test.read('f3.out') != "f3.in\nsubdir/bar.dep 3\n")
-#XXXtest.fail_test(test.read(['subdir', 'f4.out']) !=
-#XXX                                   "subdir/f4.in\nsubdir/bar.dep 3\n")
+test.fail_test(test.read(['subdir', 'f4.out']) !=
+               "subdir/f4.in\nsubdir/bar.dep 3\n")
 
 test.pass_test()
index 8a0f28b0de1deb65ccfc2238ef73102917dbf01c..b463f7ee00ef230c6e544892a47be16f20b049a8 100644 (file)
@@ -31,7 +31,7 @@ test = TestSCons.TestSCons()
 test.write('SConstruct', """
 import os
 print "SConstruct", os.getcwd()
-Conscript('SConscript')
+SConscript('SConscript')
 """)
 
 # XXX I THINK THEY SHOULD HAVE TO RE-IMPORT OS HERE
index 3965f77a997f18259f01657ba88588d9a16240b4..b973f3755901617c4056e38794defae2eef240db 100644 (file)
@@ -67,7 +67,7 @@ test.run(arguments='-f SConstruct3',
   File ".*scons(\.py)?", line \d+, in \?
     main\(\)
   File ".*scons(\.py)?", line \d+, in main
-    exec f in globals\(\)
+    exec file in globals\(\)
   File "SConstruct3", line \d+, in \?
     raise InternalError, 'error inside'
 InternalError: error inside
index 84b8ed3df6956f4187a7da24ec49715ff978ae4f..55ec367178f024a0e109ab6e40c15130295f92d1 100644 (file)
@@ -77,6 +77,6 @@ print "STDIN " + os.getcwd()
 
 test.run(arguments = '-f no_such_file',
         stdout = "",
-        stderr = "Ignoring missing script 'no_such_file'\n")
+        stderr = "Ignoring missing SConscript 'no_such_file'\n")
 
 test.pass_test()