[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