[Distutils] WinNT and distutils

Robin Becker robin@jessikat.demon.co.uk
Wed, 2 Feb 2000 20:47:32 +0000


In article <035401bf6da9$25e68c30$4500a8c0@thomasnotebook>, Thomas Heller <thomas.heller@ion-tof.com> writes
>[I wrote]
>> > +     try:
>> > +         import win32api
>> > +         import win32con
>> > +     except ImportError:
>> > +         return None
>> This should be
>>         except ImportError:
>>             return ()
>Sorry, correct is:
>          except ImportError:
>              return []
>
>
>
>_______________________________________________
>Distutils-SIG maillist  -  Distutils-SIG@python.org
>http://www.python.org/mailman/listinfo/distutils-sig



try this patch Thomas and see if it's ok with your registry. I put in a DistutilsPlatformError
if it can't find any devstudio at all.
*** msvccompiler.py.org Mon Jan 17 21:57:18 2000
--- msvccompiler.py     Wed Feb 02 20:40:40 2000
***************
*** 10,19 ****
--- 10,101 ----
  
  import os
  import sys
+ import string
  from distutils.errors import *
  from distutils.ccompiler import \
       CCompiler, gen_preprocess_options, gen_lib_options
  
+ def _devstudio_versions():
+     "Get a list of devstudio versions"
+     try:
+         import win32api
+         import win32con
+     except ImportError:
+         return []
+ 
+     K = 'Software\\Microsoft\\Devstudio'
+     L = []
+     for base in (win32con.HKEY_CLASSES_ROOT,win32con.HKEY_LOCAL_MACHINE,win32con.HKEY_CURRENT_USER,win32con.HKEY_USERS):
+         try:
+             k = win32api.RegOpenKeyEx(base,K)
+             i = 0
+             while 1:
+                 try:
+                     p = win32api.RegEnumKey(k,i)
+                     if p[0] in '123456789' and p not in L:
+                         L.append(p)
+                 except win32api.error:
+                     break
+                 i = i + 1
+         except win32api.error:
+             pass
+     L.sort()
+     L.reverse()
+     return L
+ 
+ def _msvc_get_paths(path, vNum='6.0', platform='x86'):
+     "Get a devstudio path (include, lib or path)"
+     try:
+         import win32api
+         import win32con
+     except ImportError:
+         return []
+ 
+     L = []
+     if path=='lib': path= 'Library'
+     path = string.upper(path + ' Dirs')
+     K = 'Software\\Microsoft\\Devstudio\\%s\\Build System\\Components\\Platforms\\Win32 (%s)\\Directories' \
+                 % (vNum,platform)
+     for base in (win32con.HKEY_CLASSES_ROOT,win32con.HKEY_LOCAL_MACHINE,win32con.HKEY_CURRENT_USER,win32con.HKEY_USERS):
+         try:
+             k = win32api.RegOpenKeyEx(base,K)
+             i = 0
+             while 1:
+                 try:
+                     (p,v,t) = win32api.RegEnumValue(k,i)
+                     if string.upper(p)==path:
+                         V = string.split(v,';')
+                         for v in V:
+                             if v=='' or v in L: continue
+                             L.append(v)
+                         break
+                     i = i + 1
+                 except win32api.error:
+                     break
+         except win32api.error:
+             pass
+     return L
+ 
+ def _find_exe(exe,vNum):
+     for p in _msvc_get_paths('bin',vNum):
+         fn=os.path.join(os.path.abspath(p),exe)
+         if os.path.isfile(fn): return fn
+ 
+     #didn't find it; try existing path
+     try:
+         for p in string.split(os.environ['Path'],';'):
+             fn=os.path.join(os.path.abspath(p),exe)
+             if os.path.isfile(fn): return fn
+     except:
+         pass
+     return exe  #last desperate hope 
+ 
+ def _find_SET(n,vNum):
+     return _msvc_get_paths(n,vNum)
+ 
+ def _do_SET(n,vNum):
+     p=_find_SET(n,vNum)
+     if p!=[]: os.environ[n]=string.join(p,';')
  
  class MSVCCompiler (CCompiler) :
      """Concrete class that implements an interface to Microsoft Visual C++,
***************
*** 34,41 ****
          self.add_library ( "python" + sys.version[0] + sys.version[2] )
          self.add_library_dir( os.path.join( sys.exec_prefix, 'libs' ) )
          
!         self.cc   = "cl.exe"
!         self.link = "link.exe"
          self.preprocess_options = None
          self.compile_options = [ '/nologo', '/Ox', '/MD' ]
  
--- 116,136 ----
          self.add_library ( "python" + sys.version[0] + sys.version[2] )
          self.add_library_dir( os.path.join( sys.exec_prefix, 'libs' ) )
          
!         vNum = _devstudio_versions()
!         if vNum==[]:
!             raise DistutilsPlatformError, "Can't seem to find devstudio in the registry"
!         vNum = vNum[0]        #highest version
!         self.cc   = _find_exe("cl.exe",vNum)
!         self.link = _find_exe("link.exe",vNum)
!         _do_SET('lib',vNum)
!         _do_SET('include',vNum)
!         path=_find_SET('path',vNum)
!         try:
!             for p in string.split(os.environ['path'],';'):
!                 path.append(p)
!         except KeyError:
!             pass
!         os.environ['path'] = string.join(path,';')
          self.preprocess_options = None
          self.compile_options = [ '/nologo', '/Ox', '/MD' ]
  

-- 
Robin Becker