Index: scons-2.0.1/engine/SCons/Platform/win32.py |
=================================================================== |
--- scons-2.0.1/engine/SCons/Platform/win32.py (revision 0) |
+++ scons-2.0.1/engine/SCons/Platform/win32.py (revision 0) |
@@ -0,0 +1,385 @@ |
+"""SCons.Platform.win32 |
+ |
+Platform-specific initialization for Win32 systems. |
+ |
+There normally shouldn't be any need to import this module directly. It |
+will usually be imported through the generic SCons.Platform.Platform() |
+selection method. |
+""" |
+ |
+# |
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation |
+# |
+# Permission is hereby granted, free of charge, to any person obtaining |
+# a copy of this software and associated documentation files (the |
+# "Software"), to deal in the Software without restriction, including |
+# without limitation the rights to use, copy, modify, merge, publish, |
+# distribute, sublicense, and/or sell copies of the Software, and to |
+# permit persons to whom the Software is furnished to do so, subject to |
+# the following conditions: |
+# |
+# The above copyright notice and this permission notice shall be included |
+# in all copies or substantial portions of the Software. |
+# |
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY |
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE |
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
+# |
+ |
+__revision__ = "src/engine/SCons/Platform/win32.py 5134 2010/08/16 23:02:40 bdeegan" |
+ |
+import os |
+import os.path |
+import sys |
+import tempfile |
+ |
+from SCons.Platform.posix import exitvalmap |
+from SCons.Platform import TempFileMunge |
+import SCons.Util |
+ |
+try: |
+ import msvcrt |
+ import win32api |
+ import win32con |
+ |
+ msvcrt.get_osfhandle |
+ win32api.SetHandleInformation |
+ win32con.HANDLE_FLAG_INHERIT |
+except ImportError: |
+ parallel_msg = \ |
+ "you do not seem to have the pywin32 extensions installed;\n" + \ |
+ "\tparallel (-j) builds may not work reliably with open Python files." |
+except AttributeError: |
+ parallel_msg = \ |
+ "your pywin32 extensions do not support file handle operations;\n" + \ |
+ "\tparallel (-j) builds may not work reliably with open Python files." |
+else: |
+ parallel_msg = None |
+ |
+ import builtins |
+ |
+ _builtin_file = builtins.file |
+ _builtin_open = builtins.open |
+ |
+ def _scons_file(*args, **kw): |
+ fp = _builtin_file(*args, **kw) |
+ win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()), |
+ win32con.HANDLE_FLAG_INHERIT, |
+ 0) |
+ return fp |
+ |
+ def _scons_open(*args, **kw): |
+ fp = _builtin_open(*args, **kw) |
+ win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()), |
+ win32con.HANDLE_FLAG_INHERIT, |
+ 0) |
+ return fp |
+ |
+ builtins.file = _scons_file |
+ builtins.open = _scons_open |
+ |
+ |
+ |
+# The upshot of all this is that, if you are using Python 1.5.2, |
+# you had better have cmd or command.com in your PATH when you run |
+# scons. |
+ |
+def piped_spawn(sh, escape, cmd, args, env, stdout, stderr): |
+ # There is no direct way to do that in python. What we do |
+ # here should work for most cases: |
+ # In case stdout (stderr) is not redirected to a file, |
+ # we redirect it into a temporary file tmpFileStdout |
+ # (tmpFileStderr) and copy the contents of this file |
+ # to stdout (stderr) given in the argument |
+ if not sh: |
+ sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n") |
+ return 127 |
+ else: |
+ # one temporary file for stdout and stderr |
+ tmpFileStdout = os.path.normpath(tempfile.mktemp()) |
+ tmpFileStderr = os.path.normpath(tempfile.mktemp()) |
+ |
+ # check if output is redirected |
+ stdoutRedirected = 0 |
+ stderrRedirected = 0 |
+ for arg in args: |
+ # are there more possibilities to redirect stdout ? |
+ if (arg.find( ">", 0, 1 ) != -1 or |
+ arg.find( "1>", 0, 2 ) != -1): |
+ stdoutRedirected = 1 |
+ # are there more possibilities to redirect stderr ? |
+ if arg.find( "2>", 0, 2 ) != -1: |
+ stderrRedirected = 1 |
+ |
+ # redirect output of non-redirected streams to our tempfiles |
+ if stdoutRedirected == 0: |
+ args.append(">" + str(tmpFileStdout)) |
+ if stderrRedirected == 0: |
+ args.append("2>" + str(tmpFileStderr)) |
+ |
+ # actually do the spawn |
+ try: |
+ args = [sh, '/C', escape(' '.join(args)) ] |
+ ret = os.spawnve(os.P_WAIT, sh, args, env) |
+ except OSError, e: |
+ # catch any error |
+ try: |
+ ret = exitvalmap[e[0]] |
+ except KeyError: |
+ sys.stderr.write("scons: unknown OSError exception code %d - %s: %s\n" % (e[0], cmd, e[1])) |
+ if stderr is not None: |
+ stderr.write("scons: %s: %s\n" % (cmd, e[1])) |
+ # copy child output from tempfiles to our streams |
+ # and do clean up stuff |
+ if stdout is not None and stdoutRedirected == 0: |
+ try: |
+ stdout.write(open( tmpFileStdout, "r" ).read()) |
+ os.remove( tmpFileStdout ) |
+ except (IOError, OSError): |
+ pass |
+ |
+ if stderr is not None and stderrRedirected == 0: |
+ try: |
+ stderr.write(open( tmpFileStderr, "r" ).read()) |
+ os.remove( tmpFileStderr ) |
+ except (IOError, OSError): |
+ pass |
+ return ret |
+ |
+def exec_spawn(l, env): |
+ try: |
+ result = os.spawnve(os.P_WAIT, l[0], l, env) |
+ except OSError, e: |
+ try: |
+ result = exitvalmap[e[0]] |
+ sys.stderr.write("scons: %s: %s\n" % (l[0], e[1])) |
+ except KeyError: |
+ result = 127 |
+ if len(l) > 2: |
+ if len(l[2]) < 1000: |
+ command = ' '.join(l[0:3]) |
+ else: |
+ command = l[0] |
+ else: |
+ command = l[0] |
+ sys.stderr.write("scons: unknown OSError exception code %d - '%s': %s\n" % (e[0], command, e[1])) |
+ return result |
+ |
+def spawn(sh, escape, cmd, args, env): |
+ if not sh: |
+ sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n") |
+ return 127 |
+ return exec_spawn([sh, '/C', escape(' '.join(args))], env) |
+ |
+# Windows does not allow special characters in file names anyway, so no |
+# need for a complex escape function, we will just quote the arg, except |
+# that "cmd /c" requires that if an argument ends with a backslash it |
+# needs to be escaped so as not to interfere with closing double quote |
+# that we add. |
+def escape(x): |
+ if x[-1] == '\\': |
+ x = x + '\\' |
+ return '"' + x + '"' |
+ |
+# Get the windows system directory name |
+_system_root = None |
+ |
+def get_system_root(): |
+ global _system_root |
+ if _system_root is not None: |
+ return _system_root |
+ |
+ # A resonable default if we can't read the registry |
+ val = os.environ.get('SystemRoot', "C:\\WINDOWS") |
+ |
+ if SCons.Util.can_read_reg: |
+ try: |
+ # Look for Windows NT system root |
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, |
+ 'Software\\Microsoft\\Windows NT\\CurrentVersion') |
+ val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') |
+ except SCons.Util.RegError: |
+ try: |
+ # Okay, try the Windows 9x system root |
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, |
+ 'Software\\Microsoft\\Windows\\CurrentVersion') |
+ val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') |
+ except KeyboardInterrupt: |
+ raise |
+ except: |
+ pass |
+ _system_root = val |
+ return val |
+ |
+# Get the location of the program files directory |
+def get_program_files_dir(): |
+ # Now see if we can look in the registry... |
+ val = '' |
+ if SCons.Util.can_read_reg: |
+ try: |
+ # Look for Windows Program Files directory |
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, |
+ 'Software\\Microsoft\\Windows\\CurrentVersion') |
+ val, tok = SCons.Util.RegQueryValueEx(k, 'ProgramFilesDir') |
+ except SCons.Util.RegError: |
+ val = '' |
+ pass |
+ |
+ if val == '': |
+ # A reasonable default if we can't read the registry |
+ # (Actually, it's pretty reasonable even if we can :-) |
+ val = os.path.join(os.path.dirname(get_system_root()),"Program Files") |
+ |
+ return val |
+ |
+ |
+ |
+# Determine which windows CPU were running on. |
+class ArchDefinition(object): |
+ """ |
+ A class for defining architecture-specific settings and logic. |
+ """ |
+ def __init__(self, arch, synonyms=[]): |
+ self.arch = arch |
+ self.synonyms = synonyms |
+ |
+SupportedArchitectureList = [ |
+ ArchDefinition( |
+ 'x86', |
+ ['i386', 'i486', 'i586', 'i686'], |
+ ), |
+ |
+ ArchDefinition( |
+ 'x86_64', |
+ ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'], |
+ ), |
+ |
+ ArchDefinition( |
+ 'ia64', |
+ ['IA64'], |
+ ), |
+] |
+ |
+SupportedArchitectureMap = {} |
+for a in SupportedArchitectureList: |
+ SupportedArchitectureMap[a.arch] = a |
+ for s in a.synonyms: |
+ SupportedArchitectureMap[s] = a |
+ |
+def get_architecture(arch=None): |
+ """Returns the definition for the specified architecture string. |
+ |
+ If no string is specified, the system default is returned (as defined |
+ by the PROCESSOR_ARCHITEW6432 or PROCESSOR_ARCHITECTURE environment |
+ variables). |
+ """ |
+ if arch is None: |
+ arch = os.environ.get('PROCESSOR_ARCHITEW6432') |
+ if not arch: |
+ arch = os.environ.get('PROCESSOR_ARCHITECTURE') |
+ return SupportedArchitectureMap.get(arch, ArchDefinition('', [''])) |
+ |
+def generate(env): |
+ # Attempt to find cmd.exe (for WinNT/2k/XP) or |
+ # command.com for Win9x |
+ cmd_interp = '' |
+ # First see if we can look in the registry... |
+ if SCons.Util.can_read_reg: |
+ try: |
+ # Look for Windows NT system root |
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, |
+ 'Software\\Microsoft\\Windows NT\\CurrentVersion') |
+ val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') |
+ cmd_interp = os.path.join(val, 'System32\\cmd.exe') |
+ except SCons.Util.RegError: |
+ try: |
+ # Okay, try the Windows 9x system root |
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, |
+ 'Software\\Microsoft\\Windows\\CurrentVersion') |
+ val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') |
+ cmd_interp = os.path.join(val, 'command.com') |
+ except KeyboardInterrupt: |
+ raise |
+ except: |
+ pass |
+ |
+ # For the special case of not having access to the registry, we |
+ # use a temporary path and pathext to attempt to find the command |
+ # interpreter. If we fail, we try to find the interpreter through |
+ # the env's PATH. The problem with that is that it might not |
+ # contain an ENV and a PATH. |
+ if not cmd_interp: |
+ systemroot = get_system_root() |
+ tmp_path = systemroot + os.pathsep + \ |
+ os.path.join(systemroot,'System32') |
+ tmp_pathext = '.com;.exe;.bat;.cmd' |
+ if 'PATHEXT' in os.environ: |
+ tmp_pathext = os.environ['PATHEXT'] |
+ cmd_interp = SCons.Util.WhereIs('cmd', tmp_path, tmp_pathext) |
+ if not cmd_interp: |
+ cmd_interp = SCons.Util.WhereIs('command', tmp_path, tmp_pathext) |
+ |
+ if not cmd_interp: |
+ cmd_interp = env.Detect('cmd') |
+ if not cmd_interp: |
+ cmd_interp = env.Detect('command') |
+ |
+ |
+ if 'ENV' not in env: |
+ env['ENV'] = {} |
+ |
+ # Import things from the external environment to the construction |
+ # environment's ENV. This is a potential slippery slope, because we |
+ # *don't* want to make builds dependent on the user's environment by |
+ # default. We're doing this for SystemRoot, though, because it's |
+ # needed for anything that uses sockets, and seldom changes, and |
+ # for SystemDrive because it's related. |
+ # |
+ # Weigh the impact carefully before adding other variables to this list. |
+ import_env = [ 'SystemDrive', 'SystemRoot', 'TEMP', 'TMP' ] |
+ for var in import_env: |
+ v = os.environ.get(var) |
+ if v: |
+ env['ENV'][var] = v |
+ |
+ if 'COMSPEC' not in env['ENV']: |
+ v = os.environ.get("COMSPEC") |
+ if v: |
+ env['ENV']['COMSPEC'] = v |
+ |
+ env.AppendENVPath('PATH', get_system_root() + '\System32') |
+ |
+ env['ENV']['PATHEXT'] = '.COM;.EXE;.BAT;.CMD' |
+ env['OBJPREFIX'] = '' |
+ env['OBJSUFFIX'] = '.obj' |
+ env['SHOBJPREFIX'] = '$OBJPREFIX' |
+ env['SHOBJSUFFIX'] = '$OBJSUFFIX' |
+ env['PROGPREFIX'] = '' |
+ env['PROGSUFFIX'] = '.exe' |
+ env['LIBPREFIX'] = '' |
+ env['LIBSUFFIX'] = '.lib' |
+ env['SHLIBPREFIX'] = '' |
+ env['SHLIBSUFFIX'] = '.dll' |
+ env['LIBPREFIXES'] = [ '$LIBPREFIX' ] |
+ env['LIBSUFFIXES'] = [ '$LIBSUFFIX' ] |
+ env['PSPAWN'] = piped_spawn |
+ env['SPAWN'] = spawn |
+ env['SHELL'] = cmd_interp |
+ env['TEMPFILE'] = TempFileMunge |
+ env['TEMPFILEPREFIX'] = '@' |
+ env['MAXLINELENGTH'] = 2048 |
+ env['ESCAPE'] = escape |
+ |
+ env['HOST_OS'] = 'win32' |
+ env['HOST_ARCH'] = get_architecture().arch |
+ |
+ |
+# Local Variables: |
+# tab-width:4 |
+# indent-tabs-mode:nil |
+# End: |
+# vim: set expandtab tabstop=4 shiftwidth=4: |
Property changes on: scons-2.0.1/engine/SCons/Platform/win32.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |