Change pyAssimps library detection routine to work on Linux as well

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@564 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/1/head
aramis_acg 2010-03-02 13:48:17 +00:00
parent 93ed38e50b
commit cc489f30e7
1 changed files with 87 additions and 36 deletions

View File

@ -8,60 +8,111 @@ import os
import ctypes import ctypes
import structs import structs
import operator import operator
from errors import AssimpError from errors import AssimpError
from ctypes import POINTER from ctypes import POINTER
additional_dirs, ext_whitelist = [],[]
# populate search directories and lists of allowed file extensions
# depending on the platform we're running on.
if os.name=='posix':
additional_dirs.append('/usr/local/lib/')
# note - this won't catch libassimp.so.N.n, but
# currently there's always a symlink called
# libassimp.so in /usr/local/lib.
ext_whitelist.append('.so')
elif os.name=='nt':
ext_whitelist.append('.dll')
print(additional_dirs)
def vec2tuple(x): def vec2tuple(x):
""" """ Converts a VECTOR3D to a Tuple """
Converts a VECTOR3D to a Tuple
"""
return (x.x, x.y, x.z) return (x.x, x.y, x.z)
def search_library(): def try_load_functions(library,dll,candidates):
"""try to functbind to aiImportFile and aiReleaseImport
library - path to current lib
dll - ctypes handle to it
candidates - receives matching candidates
They serve as signal functions to detect assimp,
also they're currently the only functions we need.
insert (library,aiImportFile,aiReleaseImport,dll)
into 'candidates' if successful.
""" """
Loads the assimp-Library. try:
load = dll.aiImportFile
release = dll.aiReleaseImport
except AttributeError:
#OK, this is a library, but it has not the functions we need
pass
else:
#Library found!
load.restype = POINTER(structs.Scene)
candidates.append((library, load, release, dll))
def search_library():
"""Loads the assimp-Library.
result (load-function, release-function) result (load-function, release-function)
exception AssimpError if no library is found exception AssimpError if no library is found
"""
"""
#this path #this path
folder = os.path.dirname(__file__) folder = os.path.dirname(__file__)
ctypes.windll.kernel32.SetErrorMode(0x8007) # silence 'DLL not found' message boxes on win
try:
ctypes.windll.kernel32.SetErrorMode(0x8007)
except AttributeError:
pass
candidates = [] candidates = []
#test every file # test every file
for filename in os.listdir(folder): for curfolder in [folder]+additional_dirs:
library = os.path.join(folder, filename) for filename in os.listdir(curfolder):
# our minimum requirement for candidates is that
# they should contain 'assimp' somewhere in
# their name
if filename.lower().find('assimp')==-1 or\
os.path.splitext(filename)[-1].lower() not in ext_whitelist:
continue
try: library = os.path.join(curfolder, filename)
dll = ctypes.cdll.LoadLibrary(library) print 'Try ',library
except:
#OK, this except is evil. But different OSs will throw different
#errors. So just ignore errors.
pass
else:
#get the functions
try: try:
load = dll.aiImportFile dll = ctypes.cdll.LoadLibrary(library)
release = dll.aiReleaseImport except:
except AttributeError: # OK, this except is evil. But different OSs will throw different
#OK, this is a library, but it has not the functions we need # errors. So just ignore any errors.
pass continue
else:
#Library found!
load.restype = POINTER(structs.Scene)
candidates.append((library, load, release, dll)) try_load_functions(library,dll,candidates)
if not candidates: if not candidates:
#no library found # no library found
raise AssimpError, "assimp library not found" raise AssimpError, "assimp library not found"
else: else:
#get the newest library # get the newest library
candidates = map(lambda x: (os.lstat(x[0])[-2], x), candidates) candidates = map(lambda x: (os.lstat(x[0])[-2], x), candidates)
return max(candidates, key=operator.itemgetter(0))[1][1:] res = max(candidates, key=operator.itemgetter(0))[1]
print 'Taking ',res[0]
# XXX: if there are 1000 dll/so files containing 'assimp'
# in their name, do we have all of them in our address
# space now until gc kicks in?
# XXX: take version postfix of the .so on linux?
return res[1:]