better OSX support, I think

This commit is contained in:
David Rose 2008-08-05 16:55:34 +00:00
parent 08e17a3ee0
commit bdde0c3185

View File

@ -3,49 +3,70 @@ __all__ = ["Dtool_ObjectToDict", "Dtool_funcToMethod", "Dtool_PreloadDLL"]
import imp,sys,os import imp,sys,os
is_python_d = False # The following code exists to work around a problem that exists
dll_suffix = '' # with Python 2.5 or greater.
dll_ext = '.dll'
if (sys.platform == "darwin"):
dll_ext = '.dylib'
if (sys.platform == "win32"): # Specifically, Python 2.5 is designed to import files named *.pyd
# If we launched from python_d.exe, we need to load libpanda_d.dll, etc. # only; it will not import files named *.dll (or *.so). We work
is_python_d = (sys.executable.endswith('_d.exe')) # around this problem by explicitly preloading all of the dll's we
if is_python_d: # expect to need.
dll_suffix = ''
if sys.platform == "win32":
# On Windows, dynamic libraries end in ".dll".
dll_ext = '.dll'
# If we launched from python_d.exe, we need to load
# libpanda_d.dll, etc.
if sys.executable.endswith('_d.exe'):
dll_suffix = '_d' dll_suffix = '_d'
else:
# On OSX or Linux, dynamic libraries end in ".so". OSX also
# provides *.dylib files, but these are apparently not intended to
# be imported directly.
dll_ext = '.so'
if sys.platform == "win32":
# On Windows, we must furthermore ensure that the PATH is modified
# to locate all of the DLL files.
# First, search for the directory that contains all of our compiled
# modules.
target = None target = None
filename = "libpandaexpress%s%s" % (dll_suffix, dll_ext) filename = "libpandaexpress%s%s" % (dll_suffix, dll_ext)
for dir in sys.path + [sys.prefix]: for dir in sys.path + [sys.prefix]:
lib = os.path.join(dir, filename) lib = os.path.join(dir, filename)
if (os.path.exists(lib)): if (os.path.exists(lib)):
target = dir target = dir
if (target == None): if target == None:
message = "Cannot find %s" % (filename) message = "Cannot find %s" % (filename)
raise message raise message
path=os.environ["PATH"]
if (path.startswith(target+";")==0): # And add that directory to the system path.
os.environ["PATH"] = target+";"+path path = os.environ["PATH"]
if not path.startswith(target + ";"):
os.environ["PATH"] = target + ";" + path
def Dtool_PreloadDLL(module): def Dtool_PreloadDLL(module):
""" Preloading solves the problem that python 2.5 on
windows can't find DLLs - it can only find PYDs. The
preloader is able to find DLLs."""
if (sys.platform != "win32" and sys.platform != "darwin"):
return
if (sys.modules.has_key(module)): if (sys.modules.has_key(module)):
return return
# Search for the appropriate directory.
target = None target = None
filename = module + dll_suffix + dll_ext
for dir in sys.path + [sys.prefix]: for dir in sys.path + [sys.prefix]:
lib = os.path.join(dir, module + dll_suffix + dll_ext) lib = os.path.join(dir, filename)
if (os.path.exists(lib)): if (os.path.exists(lib)):
target = dir target = dir
break break
if (target == None): if target == None:
raise "DLL loader cannot find "+module+"." message = "DLL loader cannot find %s." % (module)
imp.load_dynamic(module, os.path.join(target, module + dll_suffix + dll_ext)) raise message
# Now import the file explicitly.
pathname = os.path.join(target, filename)
imp.load_dynamic(module, pathname)
Dtool_PreloadDLL("libpandaexpress") Dtool_PreloadDLL("libpandaexpress")
from libpandaexpress import * from libpandaexpress import *