Add some documentation to the SCons-version-switching hack
g0dil [Fri, 4 Sep 2009 10:26:58 +0000 (10:26 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1381 270642c3-0616-0410-b53a-bc976706d245

site_scons/site_init.py

index a8d5c42..1a41a75 100644 (file)
@@ -11,15 +11,31 @@ sconsscript = os.path.join(os.path.join(sconsbase, 'script'),'scons')
 if os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(SCons.__file__)))) != sconsbase:
     import os, sys, SCons.Util
     SCons.Util.display("scons: Switching version")
+
+    # BEGIN HACK
+    # This is really ugly. SCons has already switched into the
+    # top-level directory when this code is executed. To make 'scons
+    # -u <target>' work, we need to switch back into the orgiginal
+    # startup dir. This directory however is only available in a local
+    # variable called 'target_top' in SCons.Script.Main._main.
+    #
+    # We walk the stack to find a local variable called
+    # 'target_top'. If we can't find it (could really only happen if
+    # the SCons.Main code is changed considerably), we output a
+    # warning, that '-u' will probably fail (we re-start scons from
+    # the top-level directory, relative targets therefore will not
+    # work)
     frame = sys._getframe()
-    marker = []
-    target_top = marker
+    target_top = marker = []
     while frame and target_top is marker:
         target_top = frame.f_locals.get('target_top',marker)
         frame = frame.f_back
     if target_top is marker:
-        SCons.Util.display("scons: WARNING: scons -u will fail")
-    elif target_top is not None:
-        os.chdir(target_top)
+        SCons.Util.display("scons: WARNING: scons -u <target> will probably fail")
+    if not target_top:
+        target_top = '.'
+    # END HACK
+
+    os.chdir(target_top)
     os.environ['SCONS_LIB_DIR'] = sconsengine
     os.execv(sconsscript, sys.argv)