From bf075e2a9c29b35fe8908d1b91c470c4b2c823a8 Mon Sep 17 00:00:00 2001 From: Sye van der Veen 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 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