Gary Oberbrunner committed ab98379 Merge

Merged in bdbaddog/scons (pull request #70: MSVC2012 stuff)

Comments (0)

Files changed (4)

   From Gary Oberbrunner:
     - Test harness: fail_test() can now print a message to help debugging.
+  From William Deegan:
+    - VS2012 & VS2010 Resolve initialization issues by adding path to reg.exe
+      in shell used to run batch files.
+    - MSVC Support fixed defaulting TARGET_ARCH to HOST_ARCH. It should be
+      None if not explicitly set.
+    - MSVC Fixed issue where if more than one Architectures compilers are
+      detected, it would take the last one found, and not the first.
   From Philipp Kraus:
     - Added optional ZIPROOT to Zip tool.


         self._dict['HOST_ARCH']    = self._dict.get('HOST_ARCH',None)
         # Now set defaults for TARGET_{OS|ARCH}
-        self._dict['TARGET_OS']      = self._dict.get('HOST_OS',None)
-        self._dict['TARGET_ARCH']    = self._dict.get('HOST_ARCH',None)
+        self._dict['TARGET_OS']      = self._dict.get('TARGET_OS',None)
+        self._dict['TARGET_ARCH']    = self._dict.get('TARGET_ARCH',None)
         # Apply the passed-in and customizable variables to the


             if k in os.environ and (force or not k in normenv):
                 normenv[k] = os.environ[k].encode('mbcs')
+    sys32_dir = os.path.join(os.environ.get("SystemRoot", os.environ.get("windir",r"C:\Windows\system32")),"System32")
+    if sys32_dir not in normenv['PATH']:
+        normenv['PATH'] = normenv['PATH'] + os.pathsep + sys32_dir
+    debug("PATH: %s"%normenv['PATH'])
     return normenv
 def get_output(vcbat, args = None, env = None):
     # settings in
     vars = [
-        'VS110COMNTOOLS',
-        'VS100COMNTOOLS',
+# Still set, but setup script will discard these if registry has values.
+#         'VS110COMNTOOLS',
+#         'VS100COMNTOOLS',
     # and won't work under Pythons not built with threading.
     stdout =
     stderr =
+    # Extra debug logic, uncomment if necessar
+#     debug('get_output():stdout:%s'%stdout)
+#     debug('get_output():stderr:%s'%stderr)
     if stderr:
         # TODO: find something better to do with stderr;
         # this at least prevents errors from getting swallowed.


     "itanium"   : "ia64",
     "x86"       : "x86",
     "x86_64"    : "amd64",
+    "x86_amd64" : "x86_amd64", # Cross compile to 64 bit from 32bits
 # Given a (host, target) tuple, return the argument for the bat file. Both host
     ("x86", "x86"): "x86",
     ("x86", "amd64"): "x86_amd64",
+    ("amd64", "x86_amd64"): "x86_amd64", # This is present in (at least) VS2012 express
     ("amd64", "amd64"): "amd64",
     ("amd64", "x86"): "x86",
     ("x86", "ia64"): "x86_ia64"
     # target platform
     (host_platform, target_platform,req_target_platform) = get_host_target(env)
-    # If the user hasn't specifically requested a TARGET_ARCH, and
-    # The TARGET_ARCH is amd64 then also try 32 bits if there are no viable
-    # 64 bit tools installed
     try_target_archs = [target_platform]
-    if not req_target_platform and target_platform in ('amd64','x86_64'):
+    debug("msvs_find_valid_batch_script(): req_target_platform %s target_platform:%s"%(req_target_platform,target_platform))
+    # VS2012 has a "cross compile" environment to build 64 bit 
+    # with x86_amd64 as the argument to the batch setup script
+    if req_target_platform in ('amd64','x86_64'):
+        try_target_archs.append('x86_amd64')
+    elif not req_target_platform and target_platform in ['amd64','x86_64']:
+        # There may not be "native" amd64, but maybe "cross" x86_amd64 tools
+        try_target_archs.append('x86_amd64')
+        # If the user hasn't specifically requested a TARGET_ARCH, and
+        # The TARGET_ARCH is amd64 then also try 32 bits if there are no viable
+        # 64 bit tools installed
+    debug("msvs_find_valid_batch_script(): host_platform: %s try_target_archs:%s"%(host_platform, try_target_archs))
     d = None
     for tp in try_target_archs:
         # Set to current arch.
             except BatchFileExecutionError, e:
                 debug(' use_script 3: failed running VC script %s: %s: Error:%s'%(repr(vc_script),arg,e))
+                continue
         if not vc_script and sdk_script:
             debug(' use_script 4: trying sdk script: %s'%(sdk_script))
         elif not vc_script and not sdk_script:
             debug(' use_script 6: Neither VC script nor SDK script found')
+        debug(" Found a working script/target: %s %s"%(repr(sdk_script),arg))
+        break # We've found a working target_platform, so stop looking
     # If we cannot find a viable installed compiler, reset the TARGET_ARCH
     # To it's initial value
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.