From bf075e2a9c29b35fe8908d1b91c470c4b2c823a8 Mon Sep 17 00:00:00 2001
From: Sye van der Veen <svanderveen@blackberry.com>
Date: Thu, 30 Jan 2014 10:43:41 -0500
Subject: Add caching to MSCommon.script_env for builds that initialize the
 same MSVS/MSVC tool multiple times (in multiple environments, perhaps)

---
 src/engine/SCons/Tool/MSCommon/vc.py | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/engine/SCons/Tool/MSCommon/vc.py b/src/engine/SCons/Tool/MSCommon/vc.py
index c970118..b5491b1 100644
--- a/src/engine/SCons/Tool/MSCommon/vc.py
+++ b/src/engine/SCons/Tool/MSCommon/vc.py
@@ -298,8 +298,18 @@ def reset_installed_vcs():
     """Make it try again to find VC.  This is just for the tests."""
     __INSTALLED_VCS_RUN = None
 
+# Running these batch files isn't cheap: most of the time spent in
+# msvs.generate() is due to vcvars*.bat.  In a build that keeps separate
+# environments for debug and release, or perhaps builds against multiple
+# MSVS versions at once, we can save a lot of time by caching the output.
+script_env_stdout_cache = {}
 def script_env(script, args=None):
-    stdout = common.get_output(script, args)
+    cache_key = (script, args)
+    stdout = script_env_stdout_cache.get(cache_key, None)
+    if stdout is None:
+        stdout = common.get_output(script, args)
+        script_env_stdout_cache[cache_key] = stdout
+
     # Stupid batch files do not set return code: we take a look at the
     # beginning of the output for an error message instead
     olines = stdout.splitlines()
@@ -416,7 +426,7 @@ def msvc_find_valid_batch_script(env,version):
         if not vc_script and sdk_script:
             debug('vc.py:msvc_find_valid_batch_script() use_script 4: trying sdk script: %s'%(sdk_script))
             try:
-                d = script_env(sdk_script,args=[])
+                d = script_env(sdk_script)
             except BatchFileExecutionError,e:
                 debug('vc.py:msvc_find_valid_batch_script() use_script 5: failed running SDK script %s: Error:%s'%(repr(sdk_script),e))
                 continue
-- 
cgit v0.12


From 6f7255096462195be3ea812b4dcf9dbee6d08ef0 Mon Sep 17 00:00:00 2001
From: Sye van der Veen <syeberman@rogers.com>
Date: Sun, 16 Mar 2014 15:49:18 -0400
Subject: Update comments to clarify benefits of script_env memoization

---
 src/engine/SCons/Tool/MSCommon/vc.py | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/engine/SCons/Tool/MSCommon/vc.py b/src/engine/SCons/Tool/MSCommon/vc.py
index b5491b1..72e7c77 100644
--- a/src/engine/SCons/Tool/MSCommon/vc.py
+++ b/src/engine/SCons/Tool/MSCommon/vc.py
@@ -299,9 +299,12 @@ def reset_installed_vcs():
     __INSTALLED_VCS_RUN = None
 
 # Running these batch files isn't cheap: most of the time spent in
-# msvs.generate() is due to vcvars*.bat.  In a build that keeps separate
-# environments for debug and release, or perhaps builds against multiple
-# MSVS versions at once, we can save a lot of time by caching the output.
+# msvs.generate() is due to vcvars*.bat.  In a build that uses "tools='msvs'"
+# in multiple environments, for example:
+#    env1 = Environment(tools='msvs')
+#    env2 = Environment(tools='msvs')
+# we can greatly improve the speed of the second and subsequent Environment
+# (or Clone) calls by memoizing the environment variables set by vcvars*.bat.
 script_env_stdout_cache = {}
 def script_env(script, args=None):
     cache_key = (script, args)
-- 
cgit v0.12