diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -57,6 +57,7 @@ else: ispypy = "PyPy" in sys.version +import ctypes import os, stat, subprocess, time import re import shutil @@ -369,8 +370,34 @@ class buildhgexe(build_ext): if isinstance(self.compiler, HackedMingw32CCompiler): self.compiler.compiler_so = self.compiler.compiler # no -mdll self.compiler.dll_libraries = [] # no -lmsrvc90 - hv = sys.hexversion - pythonlib = 'python%d%d' % (hv >> 24, (hv >> 16) & 0xff) + + # Different Python installs can have different Python library + # names. e.g. the official CPython distribution uses pythonXY.dll + # and MinGW uses libpythonX.Y.dll. + _kernel32 = ctypes.windll.kernel32 + _kernel32.GetModuleFileNameA.argtypes = [ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_ulong] + _kernel32.GetModuleFileNameA.restype = ctypes.c_ulong + size = 1000 + buf = ctypes.create_string_buffer(size + 1) + filelen = _kernel32.GetModuleFileNameA(sys.dllhandle, ctypes.byref(buf), + size) + + if filelen > 0 and filelen != size: + dllbasename = os.path.basename(buf.value) + if not dllbasename.lower().endswith('.dll'): + raise SystemExit('Python DLL does not end with .dll: %s' % + dllbasename) + pythonlib = dllbasename[:-4] + else: + log.warn('could not determine Python DLL filename; ' + 'assuming pythonXY') + + hv = sys.hexversion + pythonlib = 'python%d%d' % (hv >> 24, (hv >> 16) & 0xff) + + log.info('using %s as Python library name' % pythonlib) with open('mercurial/hgpythonlib.h', 'wb') as f: f.write('/* this file is autogenerated by setup.py */\n') f.write('#define HGPYTHONLIB "%s"\n' % pythonlib)